Tata Letak Android dengan ListView dan Buttons

101

Baiklah, tata letak khusus ini hanya mengganggu saya. Dan sepertinya tidak dapat menemukan cara untuk memiliki listView, dengan deretan tombol di bagian bawah sehingga tampilan daftar tidak meluas ke atas tombol, sehingga tombol selalu diposisikan ke bagian bawah layar. Inilah yang saya inginkan:

menghapus tautan ImageShack mati

Sepertinya itu semudah itu, tetapi semua yang saya coba gagal. Ada bantuan?

Ini kode saya saat ini:

    RelativeLayout container = new RelativeLayout(this);
    container.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));

    //** Add LinearLayout with button(s)

    LinearLayout buttons = new LinearLayout(this);

    RelativeLayout.LayoutParams bottomNavParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    bottomNavParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    bottomNavParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
    buttons.setLayoutParams(bottomNavParams);


    ImageButton newLayer = new ImageButton(this);
    newLayer.setImageResource(R.drawable.newlayer);
    newLayer.setLayoutParams(new LinearLayout.LayoutParams(45, LayoutParams.FILL_PARENT));
    buttons.addView(newLayer);

    container.addView(buttons);

    //** Add ListView

    layerview = new ListView(this);

    RelativeLayout.LayoutParams listParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    listParams.addRule(RelativeLayout.ABOVE, buttons.getId());

    layerview.setLayoutParams(listParams);

    container.addView(layerview);
Kleptin
sumber
Pertanyaan bagus, banyak pengembang akan terjebak dalam hal ini.
Signcodeindie
Untungnya, perancang di Android sebenarnya cukup manis. Oleh karena itu, saat membuat layout / UI, coba gunakan Designer / XML. Terutama untuk skenario ini karena ini hanyalah sekumpulan tombol dan ListView.
Subby

Jawaban:

137

Saya pikir inilah yang Anda cari.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:id="@+id/testbutton"
        android:text="@string/hello" android:layout_alignParentBottom="true" />

    <ListView android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:id="@+id/list"
        android:layout_alignParentTop="true" android:layout_above="@id/testbutton" />

</RelativeLayout>
lars
sumber
Itulah yang pada dasarnya saya gunakan, meskipun saya menulis tata letak di Java. ListView masih meluas di atas tombol.
Kleptine
1
Satu-satunya hal yang saya ubah adalah saya menambahkan relativeLayout di sekitar ListView karena saya tidak bisa memanggil addRule (RelativeLayout.ABOVE) di ListView.
Kleptine
2
Kode ini seharusnya berfungsi dengan baik. android:layout_above="@id/testbutton"akan menjaga yang di ListViewatas Button.
CommonsWare
Ketika saya menggunakan ini saya mendapatkan daftar untuk berhenti di atas tombol dan kemudian mulai menggulir secara internal.
lars
7
Anda juga tidak memanggil addRule(RelativeLayout.ABOVE)a RelativeLayout. Anda menyebutnya di a RelativeLayout.LayoutParams. Anda kemudian menambahkan ListViewke RelativeLayout, menyediakan itu RelativeLayout.LayoutParams. Harap pertimbangkan untuk beralih ke XML dan memekarnya, untuk pemeliharaan jangka panjang.
CommonsWare
57

Saya memiliki masalah yang sama selama berabad-abad.

Solusi untuk mempertahankan ListView di atas tombol, tetapi mencegahnya menutupinya saat daftarnya panjang, adalah dengan menyetel android: layout_weight = "1.0" di ListView. Biarkan layout_weight pada tombol tidak disetel agar tetap pada ukuran aslinya, jika tidak tombol akan diskalakan. Ini bekerja dengan LinearLayout.

Ada contoh di Android ApiDemos: ApiDemos / res / layout / linear_layout_9.xml

David Ingram
sumber
hemat saya beberapa jam lagi. Tidak mengerti mengapa tombol tidak pernah muncul. :)
frostymarvelous
Saya tidak sepenuhnya mengerti mengapa ini berhasil, tetapi berhasil :)
Bevor
20

Saya baru saja mencari jawaban untuk pertanyaan ini dan ini adalah salah satu hasil pertama. Saya merasa seolah-olah semua jawaban, termasuk yang saat ini dipilih sebagai "jawaban terbaik", tidak menjawab masalah yang ditanyakan. Masalah yang sedang dinyatakan adalah bahwa ada tumpang tindih dari dua komponen Buttondan ListViewListView mengambil seluruh layar, dan Tombol secara visual mengambang di atas (di depan) ListView (memblokir tampilan / akses yang terakhir). item di ListView)

Berdasarkan jawaban yang saya lihat di sini dan di forum lain, saya akhirnya sampai pada kesimpulan tentang cara mengatasi ini.

Awalnya, saya punya:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="#FF394952">

  <ListView
    android:id="@+id/game_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    />

  <LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    style="@android:style/ButtonBar">

    <Button
      android:id="@+id/new_game"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="@string/new_game"
      android:textColor="#FFFFFFFF"
      android:background="@drawable/button_background" />
  </LinearLayout>

</RelativeLayout>

Perhatikan penggunaan RelativeLayoutsebagai simpul akar.

Ini adalah versi terakhir yang berfungsi di mana Tombol tidak tumpang tindih dengan ListView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="#FF394952">

  <ListView
    android:id="@+id/game_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_weight="1.0" />

  <LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    style="@android:style/ButtonBar">

    <Button
      android:id="@+id/new_game"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="@string/new_game"
      android:textColor="#FFFFFFFF"
      android:background="@drawable/button_background" />
  </LinearLayout>

</LinearLayout>

Hanya ada dua perbedaan. Pertama, saya telah beralih menggunakan file LinearLayout. Ini akan membantu dengan bit berikutnya, yang ditambahkanandroid:layout_weight keListView

Saya harap ini membantu.

Dallas
sumber
Ini menyelesaikannya, tapi siapa yang akan menebak !? Saat Anda memberi android:layout_alignParentBottomdi dalam LinearLayoutinduk, ADT akan mengatakan "Parameter tata letak tidak valid di LinearLayout: layout_alignParentBottom"!
Aswin Kumar
8

Cara terbaik adalah tata letak relatif yang menyetel tombol di bawah tampilan daftar. Dalam contoh ini, tombol juga berada dalam tata letak linier karena lebih mudah untuk meletakkannya secara berdampingan pada ukuran yang sama.

<RelativeLayout android:id="@+id/RelativeLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent">

<ListView android:id="@+id/ListView01" 
android:layout_alignParentTop="true"
android:layout_width="fill_parent" 
android:layout_height="fill_parent">
</ListView>

<LinearLayout android:id="@+id/LinearLayout01" 
android:layout_below="@+id/ListView01" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true">
<Button android:id="@+id/ButtonJoin" 
android:text="Join"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_alignParentBottom="true">
</Button>
<Button android:id="@+id/ButtonJoin" 
android:layout_alignRight="@id/ButtonCancel" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cancel"
android:layout_alignParentBottom="true">
</Button>
</LinearLayout>

</RelativeLayout>
Patrick Kafka
sumber
Masalahnya adalah itu meluas di atas Tombol di bagian bawah jika tampilan daftar terlalu panjang. Saya tidak tahu bagaimana menghentikannya di atas tombol.
Kleptine
2
Jika Anda menggunakan (saya pikir 1.5, bahkan mungkin 1.6) Anda HARUS memiliki tombol SEBELUM ListView saat menggunakan aturan RelativeLayout - jika tidak, layout belum mengetahui Tombol karena membacanya secara berurutan, itulah sebabnya ListView Anda diperluas melewati mereka.
Tim H
Ini tidak berhasil untuk saya. Seperti yang dikatakan Tim H, bagi saya, saya harus meletakkan ListView setelah LinearLayout dan kemudian membuat ListView layout_above, seperti jawaban repoc di atas.
Nemi
ini tidak akan berfungsi, tombol tidak ada di layar, dan tidak akan bergulir
Vaibhav Mishra
1

Saya tahu posting ini agak lama, tetapi, untuk menjawab pertanyaan poster asli, alasan kode tidak berfungsi adalah buttons.getId () return -1. Jika Anda akan melakukan ini, Anda perlu mengatur lakukan sesuatu seperti tombol panggil.setId (10). Jika Anda melakukan itu, kodenya berfungsi dengan baik.

Doo Dah
sumber
0

ini seharusnya berhasil. agar memiliki tombol di atas tampilan daftar juga, letakkan tombol di dalam tata letak linier lainnya.

<LinearLayout> main container // vertical

<LinearLayout> scrollview must be contained in a linear layout //vertical - height to fill parent

    <ScrollView> set the height of this to fill parent

        <ListView> will be contained in the scrollview
        </ListView>

    </ScrollView>

</LinearLayout>

<LinearLayout> //horizontal - height to wrap content

<Button>

</Button>

</LinearLayout>

</LinearLayout>
Rhys
sumber
0

solusi termudah adalah membuat dua tata letak linier, satu dengan tombol dan yang lainnya dengan tampilan daftar (Bungkus konten pada tinggi tombol dan cocokkan induk pada tinggi tata letak daftar). lalu hanya buat tampilan gulir di atas tata letak dengan tampilan daftar dan tata letak tombol akan diabaikan. semoga membantu, maaf saya tidak merasa ingin menulis kode.

Pete
sumber