it-swarm.com.de

Android Ansicht über alles legen?

Können Sie eine Ansicht über alles in Android überlagern?

Im iPhone würde ich die neue Ansicht einstellen, deren frame.Origin bis (0,0) und seine Breite und Höhe der Breite und Höhe von self.view. Hinzufügen zu self.view würde dann bewirken, dass es als Overlay fungiert und den dahinter liegenden Inhalt abdeckt (oder wenn es einen transparenten Hintergrund hat, wird die dahinter liegende Ansicht angezeigt).

Gibt es eine ähnliche Technik in Android? Mir ist klar, dass die Ansichten leicht unterschiedlich sind (es gibt drei Arten (oder mehr ...) von Relativlayout, Linearlayout und Framelayout), aber gibt es eine Möglichkeit, eine Ansicht nur wahllos über alles zu legen?

69
Thomas Clayson

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 gesetzt werden.

Beispiel (zweiter 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 spezielle Fälle.

RelativeLayout ist ziemlich mächtig. Sie können Regeln definieren wie Ansicht A muss das übergeordnete Layout unten ausrichten , Ansicht B muss A unten nach oben ausrichten usw

pdate basierend auf Kommentar

Normalerweise setzen Sie den Inhalt mit setContentView(R.layout.your_layout) in onCreate (das Layout wird für Sie aufgeblasen). Sie können das manuell machen und setContentView(inflatedView) aufrufen, es gibt keinen Unterschied.

Die Ansicht selbst kann eine einzelne Ansicht (wie TextView) oder eine komplexe Layouthierarchie (verschachtelte Layouts, da alle Layouts selbst Ansichten sind) sein.

Nach dem Aufruf von setContentView weiß Ihre Aktivität, wie ihr Inhalt aussieht, und Sie können (FrameLayout) findViewById(R.id.root_view) Verwenden, um eine beliebige Ansicht in dieser Hierarchie abzurufen (allgemeines Muster (ClassOfTheViewWithThisId) findViewById(R.id.declared_id_of_view)).

95
Knickedi
<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 können Sie jede Ansicht, die Sie unter LinearLayout hinzufügen, mit Android:id = "@+id/overlay" erscheint als Überlagerung mit Schwerkraft = rechts bei linearem Layout mit Android:id="@+id/Everything"

15
Dilroop Singh

Sie können bringToFront verwenden:

    View view=findViewById(R.id.btnStartGame);
    view.bringToFront();
9
Ahmad Aghazadeh

Der beste Weg ist ViewOverlay , Sie können jeder Ansicht ein beliebiges Zeichen als Overlay hinzufügen, da Android JellyBeanMR2 (Api 18)).

Fügen Sie mMyDrawable zu mMyView als Overlay hinzu:

mMyDrawable.setBounds(0, 0, mMyView.getMeasuredWidth(), mMyView.getMeasuredHeight())
mMyView.getOverlay().add(mMyDrawable)
7
Jacks Gong

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);
            }
0
HaxnHarald