Benim durumumda bir düzeni diğerinin üzerinde programlı olarak nasıl gösterebilirim?


84

Ana mizanpajım main.xml basitçe iki LinearLayouts içerir:

  • 1. LinearLayoutev sahibi a VideoViewve a Button,
  • 2nd LinearLayoutan barındırıyor EditTextve bu görünürlük değerini " GONE " ( ) olarak LinearLayoutayarladıandroid:visibility="gone"

aşağıdaki gibi:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent"
        android:orientation="vertical"
>
    <LinearLayout 
        android:id="@+id/first_ll"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"

    >
        <VideoView 
            android:id="@+id/my_video"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="9"
        />

        <Button
            android:id="@+id/my_btn"
            android:layout_width="30dip" 
            android:layout_height="30dip"
            android:layout_gravity="right|bottom"
                android:layout_weight="1"
        />

    </LinearLayout>

    <LinearLayout 
        android:id="@+id/second_ll"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingTop="2dip"

        android:visibility="gone"
    >
        <EditText 
            android:id="@+id/edit_text_field"
            android:layout_height="40dip"
            android:layout_width="fill_parent"
            android:layout_weight="5"
            android:layout_gravity="center_vertical"
        />

    </LinearLayout>
</LinearLayout>

Ben başarıyla zaman bu özelliği uygulamaya Button(id my_btn ile) basıldığında, 2 LinearLayout ile EditTextsahada aşağıdaki Java kodu ile gösterilmiştir:

LinearLayout secondLL = (LinearLayout) findViewById(R.id.second_ll);

Button myBtn = (Button) findViewById(R.id.my_btn);
myBtn.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v){
        int visibility = secondLL.getVisibility();

        if(visibility==View.GONE)
            secondLL.setVisibility(View.VISIBLE);

    }
}); 

Java Yukarıdaki kod ile, 2 LinearLayout ile EditTextbenzer gösterilmektedir aşağıda ekleme 1. LinearLayout mantıklı.

ANCAK , Benim ihtiyacım olan: ne zaman Button(id: my_btn) basıldığında, 2 LinearLayout ile EditText üst üste gösterilen 1 LinearLayout gibi görünüyor hangi 2. LinearLayout ile EditTextekranın altından yükseliyor ve 2. LinearLayout ile EditTextsadece bir kısmını işgal alttan ekran, bu, aşağıdaki resimde gösterildiği gibi hala görülebilen 1. Doğrusal Düzen:

görüntü açıklamasını buraya girin

Yani, Button(id: my_btn) basıldığında göstermek için 2nd LinearLayout ile EditText üst üste 1 LinearLayout yerine ekleme 2'nci LinearLayout altında 1st LinearLayout programlı?

Yanıtlar:


187

İki çocuklu bir FrameLayout kullanın. İki çocuk örtüşecek. Bu, Android'deki öğreticilerden birinde öneriliyor, aslında bir hack değil ...

Bir ImageView'ün üstünde bir TextView'in görüntülendiği bir örnek:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

  <ImageView  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 

    android:scaleType="center"
    android:src="@drawable/golden_gate" />

  <TextView
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="20dip"
    android:layout_gravity="center_horizontal|bottom"

    android:padding="12dip"

    android:background="#AA000000"
    android:textColor="#ffffffff"

    android:text="Golden Gate" />

</FrameLayout>

İşte sonuç


14
Bu kodda, TextViewen üst yapan nedir? listede ikinci sırada olduğu için mi?
Adam Johns

14
FrameLayout belgelerinin dediği gibi: Alt görünümler, en son eklenen alt öğe üstte olacak şekilde bir yığın halinde çizilir. Xml düzeninin yukarıdan aşağıya ayrıştırıldığı düşünülürse, TextView öğesi xml'de sonuncusu olarak en üste çizilir.
Maciej Pigulski

Bunu deniyorum ama Scrollview ile FrameLayout'un 1. çocuğu ve TextView 2. çocuk olarak. Ancak burada arka planda kaydırma görünümünü göstermiyor. Herhangi bir yardım.
Raju

1
Teşekkürler kardeşim! Bu cevap tam olarak aradığım şeydi! Harika! @Raju: Aşağıdaki FrameLayout'u düzeninizin SON kapanış etiketinin önüne yerleştirin (tüm ekran) ... <FrameLayout android: id = "@ + id / icon_frame_container" android: layout_width = "match_parent" android: layout_height = "match_parent"> </FrameLayout> Şimdi buna referans verin ve onClick- veya onTouch-yönteminizi her zamanki gibi yapın.
Martin Pfeffer

1
FrameLayout burada doğru seçimdir, ancak RelativeLayout'un alt görünümler eklendikçe üst üste yığılmasıyla aynı şekilde davranacağını da belirtmek gerekir. (Android'de yeniydim ve yanlış bir şekilde bu yanıtı okuduktan sonra yalnızca FrameLayout'un istiflemeyi başarabileceğini düşündüm. Whoopsie)
Luke

5

FrameLayout bunu yapmanın daha iyi bir yolu değil:

RelativeLayoutBunun yerine kullanın . Öğeleri istediğiniz yere yerleştirebilirsiniz. Ardından gelen öğe, bir öncekinden daha yüksek z-endeksine sahiptir (yani, bir öncekinin üzerine gelir).

Misal:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimary"
        app:srcCompat="@drawable/ic_information"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is a text."
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:layout_margin="8dp"
        android:padding="5dp"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:background="#A000"
        android:textColor="@android:color/white"/>
</RelativeLayout>

görüntü açıklamasını buraya girin


4

Alexandru'nun verdiği cevap oldukça iyi çalışıyor. Söylediği gibi, bu "erişimci" görünümünün son öğe olarak eklenmesi önemlidir. İşte benim için hile yapan bazı kodlar:

        ...

        ...

            </LinearLayout>

        </LinearLayout>

    </FrameLayout>

</LinearLayout>

<!-- place a FrameLayout (match_parent) as the last child -->
<FrameLayout
    android:id="@+id/icon_frame_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout>

</TabHost>

Java'da:

final MaterialDialog materialDialog = (MaterialDialog) dialogInterface;

FrameLayout frameLayout = (FrameLayout) materialDialog
        .findViewById(R.id.icon_frame_container);

frameLayout.setOnTouchListener(
        new OnSwipeTouchListener(ShowCardActivity.this) {
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.