Saya mencoba membuat Tampilan kustom yang akan menggantikan tata letak tertentu yang saya gunakan di banyak tempat, tetapi saya kesulitan melakukannya.
Pada dasarnya, saya ingin mengganti ini:
<RelativeLayout
android:id="@+id/dolphinLine"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/background_box_light_blue"
android:padding="10dip"
android:layout_margin="10dip">
<TextView
android:id="@+id/dolphinTitle"
android:layout_width="200dip"
android:layout_height="100dip"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dip"
android:text="@string/my_title"
android:textSize="30dip"
android:textStyle="bold"
android:textColor="#2E4C71"
android:gravity="center"/>
<Button
android:id="@+id/dolphinMinusButton"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_toRightOf="@+id/dolphinTitle"
android:layout_marginLeft="30dip"
android:text="@string/minus_button"
android:textSize="70dip"
android:textStyle="bold"
android:gravity="center"
android:layout_marginTop="1dip"
android:background="@drawable/button_blue_square_selector"
android:textColor="#FFFFFF"
android:onClick="onClick"/>
<TextView
android:id="@+id/dolphinValue"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_marginLeft="15dip"
android:background="@android:drawable/editbox_background"
android:layout_toRightOf="@+id/dolphinMinusButton"
android:text="0"
android:textColor="#2E4C71"
android:textSize="50dip"
android:gravity="center"
android:textStyle="bold"
android:inputType="none"/>
<Button
android:id="@+id/dolphinPlusButton"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_toRightOf="@+id/dolphinValue"
android:layout_marginLeft="15dip"
android:text="@string/plus_button"
android:textSize="70dip"
android:textStyle="bold"
android:gravity="center"
android:layout_marginTop="1dip"
android:background="@drawable/button_blue_square_selector"
android:textColor="#FFFFFF"
android:onClick="onClick"/>
</RelativeLayout>
Dengan ini:
<view class="com.example.MyQuantityBox"
android:id="@+id/dolphinBox"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:myCustomAttribute="@string/my_title"/>
Jadi, saya tidak menginginkan layout kustom, saya ingin Tampilan kustom (tampilan ini tidak boleh memiliki turunan).
Satu-satunya hal yang dapat berubah dari satu instance MyQuantityBox ke yang lain adalah judulnya. Saya sangat ingin dapat menentukan ini dalam XML (seperti yang saya lakukan pada baris XML terakhir)
Bagaimana saya bisa melakukan ini? Haruskah saya meletakkan RelativeLayout dalam file XML di / res / layout dan memekarnya di kelas MyBoxQuantity saya? Jika ya, bagaimana saya melakukannya?
Terima kasih!
Jawaban:
Ya, Anda bisa melakukan ini. RelativeLayout, LinearLayout, dll adalah Tampilan sehingga tata letak khusus adalah tampilan khusus. Hanya sesuatu yang perlu dipertimbangkan karena jika Anda ingin membuat tata letak kustom Anda bisa.
Yang ingin Anda lakukan adalah membuat Kontrol Gabungan. Anda akan membuat subclass RelativeLayout, menambahkan semua komponen Anda dalam kode (TextView, dll), dan di konstruktor Anda, Anda dapat membaca atribut yang diteruskan dari XML. Anda kemudian dapat meneruskan atribut itu ke TextView judul Anda.
http://developer.android.com/guide/topics/ui/custom-components.html
sumber
Agak tua, tapi saya pikir berbagi bagaimana saya akan melakukannya, berdasarkan jawaban chubbsondubs: Saya menggunakan
FrameLayout
(lihat Dokumentasi ), karena digunakan untuk memuat satu tampilan, dan memekarkan ke dalamnya tampilan dari xml.Kode berikut:
sumber
this
, parameter ke-3)Berikut ini demo sederhana untuk membuat customview (tampilan majemuk) dengan menggembungkan dari xml
attrs.xml
CustomView.kt
custom_layout.xml
Kita harus menggunakan di
merge
sini daripadaConstraintLayout
karenaJika kita gunakan di
ConstraintLayout
sini, hierarki layout akanConstraintLayout
->ConstraintLayout
->ImageView
+TextView
=> kita punya 1 redundanConstraintLayout
=> tidak terlalu bagus untuk performaMenggunakan activity_main.xml
Hasil
Demo Github
sumber
Gunakan LayoutInflater seperti yang saya tunjukkan di bawah.
sumber
Dalam praktiknya, saya menemukan bahwa Anda perlu sedikit berhati-hati, terutama jika Anda menggunakan sedikit xml berulang kali. Misalkan, misalnya, Anda memiliki tabel yang ingin Anda buat baris tabelnya untuk setiap entri dalam daftar. Anda telah menyiapkan beberapa xml:
Masuk
my_table_row.xml
:Kemudian Anda ingin membuatnya sekali per baris dengan beberapa kode. Ini mengasumsikan bahwa Anda telah mendefinisikan TableLayout myTable induk untuk dilampirkan Baris ke.
Untuk contoh sederhana yang jelas tentang menangani rowButton.setOnClickListener (ini), lihat Onclicklistener untuk tombol yang dibuat secara terprogram .
sumber