Saya mencoba membuat aktivitas yang menyajikan beberapa data kepada pengguna. Datanya sedemikian rupa sehingga dapat dibagi menjadi 'kata', masing-masing menjadi widget, dan urutan 'kata' akan membentuk data ('kalimat'?), Widget ViewGroup berisi kata-kata. Karena ruang yang diperlukan untuk semua 'kata' dalam 'kalimat' akan melebihi ruang horizontal yang tersedia pada tampilan, saya ingin membungkus 'kalimat' ini seperti yang Anda lakukan pada teks biasa.
Kode berikut:
public class WrapTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout l = new LinearLayout(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams mlp = new LinearLayout.LayoutParams(
new ViewGroup.MarginLayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
mlp.setMargins(0, 0, 2, 0);
for (int i = 0; i < 10; i++) {
TextView t = new TextView(this);
t.setText("Hello");
t.setBackgroundColor(Color.RED);
t.setSingleLine(true);
l.addView(t, mlp);
}
setContentView(l, lp);
}
}
menghasilkan sesuatu seperti gambar kiri, tetapi saya ingin tata letak yang menampilkan widget yang sama seperti di kanan.
Apakah ada tata letak atau kombinasi tata letak dan parameter seperti itu, atau apakah saya harus menerapkan ViewGroup saya sendiri untuk ini?
sumber
Saya membuat tata letak sendiri yang melakukan apa yang saya inginkan, tetapi saat ini sangat terbatas. Komentar dan saran perbaikan tentu saja diterima.
Aktivitas:
Atau dalam tata letak XML:
Dan Tata Letak:
Dengan hasil:
sumber
Saya menerapkan sesuatu yang sangat mirip dengan ini, tetapi menggunakan cara yang menurut saya lebih standar untuk menangani spasi dan padding. Beri tahu saya pendapat Anda, dan gunakan kembali tanpa menyebutkan:
Ini juga membutuhkan entri di bawah /res/values/attrs.xml, yang dapat Anda buat jika belum ada di sana.
Penggunaan dalam tata letak xml terlihat seperti ini:
sumber
Proyek android-flowlayout oleh ApmeM support line break juga.
sumber
Ini adalah versi kode-only saya yang disederhanakan:
sumber
Ada masalah dengan Jawaban pertama:
Dalam ListView, misalnya, item daftar diteruskan heightMeasureSpec 0 (UNSPECIFIED) dan jadi, di sini, MeasureSpec ukuran 0 (AT_MOST) diteruskan ke semua turunan. Ini berarti bahwa seluruh PredicateLayout tidak terlihat (tinggi 0).
Sebagai perbaikan cepat, saya mengubah MeasureSpec tinggi anak seperti ini:
lalu
yang tampaknya berhasil untuk saya meskipun tidak menangani mode TEPAT yang akan jauh lebih rumit.
sumber
Versi saya yang sedikit dimodifikasi berdasarkan yang diposting di sini sebelumnya:
Ini memusatkan semua item secara horizontal
sumber
Saya telah memperbarui sampel ini untuk memperbaiki bug, sekarang, setiap baris dapat memiliki ketinggian yang berbeda!
sumber
Beberapa jawaban berbeda di sini akan memberi saya ClassCastException di editor tata letak Exclipse. Dalam kasus saya, saya ingin menggunakan ViewGroup.MarginLayoutParams daripada membuatnya sendiri. Apa pun pilihannya, pastikan untuk mengembalikan instance LayoutParams yang dibutuhkan kelas tata letak khusus Anda di generateLayoutParams. Seperti inilah tampilan saya, cukup ganti MarginLayoutParams dengan yang dibutuhkan ViewGroup Anda:
Sepertinya metode ini dipanggil untuk menetapkan objek LayoutParams untuk setiap anak di ViewGroup.
sumber
sumber
Saya mengadaptasi beberapa ode di atas dan menerapkan tata letak aliran yang memusatkan semua tampilan anak, horizontal dan vertikal. Ini sesuai dengan kebutuhan saya.
sumber
coba:
sumber
Coba atur kedua LayoutParams lp menjadi
WRAP_CONTENT
.Pengaturan MLP menjadi
WRAP_CONTENT
,WRAP_CONTENT
memastikan bahwa TextView Anda (s) t hanya lebar dan tinggi yang cukup cukup untuk menahan "Hello" atau apa pun String Anda masukkan ke dalam mereka. kupikir saya mungkin tidak menyadari seberapa lebar t Anda . ThesetSingleLine(true)
mungkin berkontribusi juga.sumber