Saya telah mencoba selama beberapa hari sekarang untuk membuat tata letak saya lebih efisien dengan mengubah dari menggunakan beberapa tingkat bersarang LinearLayouts
menjadi satu RelativeLayout
dan telah menemukan beberapa masalah yang saya belum dapat menemukan solusi untuk ...
Saya telah mencari grup pemula Android dan situs ini dan belum dapat menemukan apa pun yang dapat membantu saya memecahkan masalah.
Saya membaca di salah satu blog bahwa Anda dapat menggabungkan tata letak dengan menggabungkan dan menyertakan tag. Jadi yang saya miliki adalah file tata letak utama dengan RelativeLayout
elemen root. Di dalamnya saya memiliki 5 tag include yang mereferensikan 5 file tata letak xml berbeda yang masing-masing memiliki elemen gabungan untuk root (semua file gabungan saya sama kecuali untuk id di dalamnya).
Saya mengalami dua masalah, yang akan saya jelaskan setelah memposting versi sederhana dari kode tata letak saya:
Contoh File Tata Letak Utama:
<?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"
android:background="@drawable/translucent_gray" >
<include
android:id="@+id/running_gallery_layout_id"
layout="@layout/running_gallery_layout" />
<include
android:id="@+id/recent_gallery_layout_id"
layout="@layout/recent_gallery_layout"
android:layout_below="@id/running_gallery_layout_id" />
<include
android:id="@+id/service_gallery_layout_id"
layout="@layout/service_gallery_layout"
android:layout_below="@id/recent_gallery_layout_id" />
<include
android:id="@+id/process_gallery_layout_id"
layout="@layout/process_gallery_layout"
android:layout_below="@id/service_gallery_layout_id" />
</RelativeLayout>
Contoh termasuk file gabungan:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
style="@style/TitleText"
android:id="@+id/service_gallery_title_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:text="@string/service_title" />
<Gallery
android:id="@+id/service_gallery_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_below="@id/service_gallery_title_text_id" />
<TextView
style="@style/SubTitleText"
android:id="@+id/service_gallery_current_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/service_gallery_title_text_id"
android:layout_above="@id/service_gallery_id" />
</merge>
Saya mengalami dua masalah:
1) android:layout_*
Atribut tampaknya diabaikan saat digunakan dalam tag include dan semua tata letak yang digabungkan ditampilkan di atas satu sama lain. Menurut posting ini ( http://developer.android.com/resources/articles/layout-tricks-reuse.html ) " android:layout_*
atribut apa pun dapat digunakan dengan <include />
tag"
2) Karena saya tidak bisa membuatnya berfungsi, saya memutuskan untuk mencoba menambahkan android:layout_below
atribut ke TextView
item pertama di setiap file tata letak gabungan, yang berarti bahwa setiap file gabungan akan mereferensikan id dari file tata letak gabungan lainnya ... Untuk sebagian besar ini benar-benar berfungsi dan tata letak saya terlihat bagus. Namun, saya mendapatkan kesalahan pada salah satu android:layout_below
atribut yang mengatakan bahwa ia tidak dapat menemukan id yang saya tentukan ... Saya telah memeriksa dua dan tiga kali id untuk memastikannya benar. Bagian yang paling aneh adalah saya menggunakan AutoFill
fitur tersebut untuk meletakkan id di atribut di tempat pertama.
Jika ada yang punya saran atau solusi, saya akan dengan senang hati mencobanya. Juga, jika ada yang bisa memikirkan cara bagi saya untuk hanya memiliki satu file layout gabungan xml daripada 5 yang akan sangat dihargai. Saya tidak dapat menemukan cara untuk melakukan itu karena saya perlu memiliki akses ke setiap item di file tata letak gabungan saat runtime ...
layout_width
danlayout_height
mengatur saya<include>
. Saya mencoba juga pengaturanlayout_width
danlayout_height
pada saya<merge>
tetapi tidak berhasil. Apa yang saya lewatkan?Lihat jawaban yang lebih banyak dipilih di bawah ini. Punyaku sangat usang
saya dapat mengatasi satu masalah yang diangkat Justin : ketidakmampuan RelativeLayout untuk mengelola pemosisian suatu penyertaan (setidaknya dalam kasus sederhana ini, pada emulator 1.6)
CommonsWare menyarankan membungkus termasuk dalam wadah orang tua yang unik, tapi tidak begitu untuk membantu mengatasi & scoping identik bernama Views dalam Justin meliputi
Nyatanya, Anda juga harus melakukannya agar RelativeLayout berperilaku seperti yang diharapkan:
Ini berfungsi ( footer diposisikan dengan baik):
Ini tidak ( footer mengambang di atas layar):
Footer telanjang yang disertakan tidak akan sejajar dengan bagian bawah induk, tanpa LinearLayout di sekitarnya .. Saya tidak akan menyebut perilaku yang diharapkan ini.
Selain itu, WebView tampaknya menempel dengan baik ke header berdasarkan ID, tetapi saya percaya ini hanya ilusi, karena hanya mengalir di bawah header secara vertikal. Saya juga mencoba mengatur tombol tepat di atas footer include, tetapi semuanya juga mengambang dan salah
RelativeLayout memiliki lebih banyak masalah di 1.5, tetapi saya masih menyukainya :)
sumber
Sobat, ini sudah tua, tetapi tampaknya muncul di bagian atas pencarian, jadi saya akan berkomentar.
Menurut saya triknya di sini adalah bahwa
<merge>
tag yang digabungkan dengan<include>
tag pada dasarnya menghapus semua jenis grup tampilan "induk" di tingkat itu. Jadi, siapa sebenarnya yang Anda tanyakan ke "layout_below" orang lain? Tidak ada. Tidak ada pemandangan di level itu.The
<merge>
tag mengambil pandangan anak dan muncul mereka langsung ke induk dari<include>
tag. Oleh karena itu, Anda harus meminta anak-anak dalam tata letak yang Anda masukkan untuk menambatkan diri mereka sendiri.sumber
Agar pemosisian berfungsi di RelativeLayout, Anda perlu menyetel parameter layout_ * di file include, bukan di file layout utama. Lewat situ
main_layout.xml
content_layout.xml
Ini jelas bukan yang kami para pengembang inginkan, tetapi ini satu-satunya solusi yang saya temukan untuk menghindari duplikasi xml
sumber
Dugaan saya adalah bahwa Anda tidak dapat mereferensikan, dari aturan tata letak,
android:id
atribut yang ditentukan pada<include>
elemen, hanya atribut yang ada di widget dan container "nyata".Sederhana: taruh semuanya dalam satu file.
Baik Anda memiliki satu
<include>
elemen atau 1.000, semua konten harus dapat diakses saat runtime. Satu pengecualian adalah jika Anda memilikiandroid:id
atribut duplikat - Anda perlu menyesuaikanfindViewById()
panggilan Anda dengan benar untuk mendapatkan yang tepat, seperti yang Anda lakukan saat mendapatkan widget dari baris ListView.Jika Anda dapat membuat proyek sampel yang menggunakan 2+ file gabungan tempat Anda dapat menunjukkan bahwa konten tidak dapat diakses pada waktu proses, beri tahu saya.
sumber
coba:
sumber
Dalam kasus saya, tata letak yang saya coba sertakan dimulai dengan
<merge
tag. Ketika saya mengubahnya menjadi tata letak, katakan<RelativeLayout
itu berhasil. Berikut ilustrasinya.KERJA
TIDAK BEKERJA
sumber
Saya memiliki masalah yang sama dan bahkan mendefinisikan
layout_width
danlayout_height
itu tidak berhasil. Masalahnya adalah tata letak yang saya sertakan memiliki tag dan setelah menghapusnya, semuanya bekerja seperti pesona. Saya kira merge bukanlah tag tata letak dan karena itu, tidak dapat menerima parameter posisi dan ukuran. Karena semua yang Anda tentukan akan ditransfer ke tata letak induk bagian dalam, pengaturannya dibuang begitu saja.TL: DR: Hapus saja tagnya, pindahkan definisi xmlns ke penampung tata letak nyata dan Anda akan melakukannya dengan baik.
Sebelum:
Kerja:
sumber