Verwenden Sie einfach RelativeLayout
oder FrameLayout
. Die letzte untergeordnete Ansicht überlagert alles andere.
Android unterstützt ein Muster, das Cocoa Touch SDK nicht unterstützt: Layoutverwaltung.
Layout für iPhone bedeutet, alles absolut zu positionieren (abgesehen von einigen Dehnungsfaktoren). Layout in Android bedeutet, dass Kinder in Beziehung zueinander gestellt werden.
Beispiel (der zweite EditText deckt den ersten vollständig ab):
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/root_view">
<EditText
android:layout_width="fill_parent"
android:id="@+id/editText1"
android:layout_height="fill_parent">
</EditText>
<EditText
android:layout_width="fill_parent"
android:id="@+id/editText2"
android:layout_height="fill_parent">
<requestFocus></requestFocus>
</EditText>
</FrameLayout>
FrameLayout
ist eine Art Ansichtsstapel. Gemacht für besondere Fälle.
RelativeLayout
ist ziemlich mächtig. Sie können Regeln definieren, z. B. Ansicht A muss das übergeordnete Layout unten ausrichten , Ansicht B muss A unten nach oben ausrichten usw.
Update basierend auf Kommentar
Normalerweise setzen Sie den Inhalt mit setContentView(R.layout.your_layout)
in onCreate
(es wird das Layout für Sie aufblasen). Sie können das manuell machen und anrufen setContentView(inflatedView)
, es gibt keinen Unterschied.
Die Ansicht selbst kann eine einzelne Ansicht (wie TextView
) oder eine komplexe Layouthierarchie sein (verschachtelte Layouts, da alle Layouts selbst Ansichten sind).
Nachdem Sie setContentView
Ihre Aktivität aufgerufen haben, wissen Sie, wie ihr Inhalt aussieht, und Sie können (FrameLayout) findViewById(R.id.root_view)
jede Ansicht in dieser Hierarchie abrufen (allgemeines Muster (ClassOfTheViewWithThisId) findViewById(R.id.declared_id_of_view)
).
layoutinflater
, um einerelativelayout
aus einer Layout-XML-Datei abzurufen, wie kann ich sie der Inhaltsansicht hinzufügen? Gibt es eine Möglichkeit, einen Verweis auf die Inhaltsansicht zu erhalten? Vielen DankFrameLayout
aufgrund seines geringen Gewichts bevorzuge , aber die maximal gemessene Höhe (auch bekannt als seine eigene resultierende Höhe) im Falle einermatch_parent
Größe nicht an seine Kinder weitergibt, siehe hier . Wenn Sie Android 2 unterstützen und mit Android 2 arbeitenmatch_parent
,RelativeLayout
ist dies die einzige funktionierende Option. Ein Beispiel finden Sie hier .<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root_view" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:id = "@+id/Everything" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- other actual layout stuff here EVERYTHING HERE --> </LinearLayout> <LinearLayout android:id="@+id/overlay" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" > </LinearLayout>
Jetzt wird jede Ansicht, die Sie unter LinearLayout mit hinzufügen
android:id = "@+id/overlay"
, als Überlagerung mit Schwerkraft = direkt im linearen Layout mit angezeigtandroid:id="@+id/Everything"
quelle
Sie können verwenden
bringToFront
:quelle
Der beste Weg ist ViewOverlay Seit Android JellyBeanMR2 (Api 18) können Sie jeder Ansicht jedes Drawable als Overlay als Overlay hinzufügen.
In
mMyDrawable
zumMyView
als Overlay:mMyDrawable.setBounds(0, 0, mMyView.getMeasuredWidth(), mMyView.getMeasuredHeight()) mMyView.getOverlay().add(mMyDrawable)
quelle
Ich habe die Markisen schon einmal ausprobiert, aber das hat nicht funktioniert. Jetzt habe ich nur ein LinearLayout anstelle eines TextureView verwendet, jetzt funktioniert es ohne Probleme. Hoffe, es hilft einigen anderen, die das gleiche Problem haben. :) :)
view = (LinearLayout) findViewById(R.id.view); //this is initialized in the constructor openWindowOnButtonClick(); public void openWindowOnButtonClick() { view.setAlpha((float)0.5); FloatingActionButton fb = (FloatingActionButton) findViewById(R.id.floatingActionButton); final InputMethodManager keyboard = (InputMethodManager) getSystemService(getBaseContext().INPUT_METHOD_SERVICE); fb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // check if the Overlay should be visible. If this value is false, it is not shown -> show it. if(view.getVisibility() == View.INVISIBLE) { view.setVisibility(View.VISIBLE); keyboard.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); Log.d("Overlay", "Klick"); } else if(view.getVisibility() == View.VISIBLE) { view.setVisibility(View.INVISIBLE); keyboard.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); }
quelle
Ich habe gerade eine Lösung dafür gefunden. Ich habe dafür eine Bibliothek erstellt, um dies auf wiederverwendbare Weise zu tun. Deshalb müssen Sie in Ihrem XML nicht neu codieren. Hier finden Sie eine Dokumentation zur Verwendung in Java und Kotlin . Initialisieren Sie es zunächst von einer Aktivität aus, von der aus Sie die Überlagerung anzeigen möchten.
AppWaterMarkBuilder.doConfigure() .setAppCompatActivity(MainActivity.this) .setWatermarkProperty(R.layout.layout_water_mark) .showWatermarkAfterConfig();
Dann können Sie es von überall in Ihrer App ausblenden und anzeigen -
/* For hiding the watermark*/ AppWaterMarkBuilder.hideWatermark() /* For showing the watermark*/ AppWaterMarkBuilder.showWatermark()
Gif Vorschau -
quelle