Dalam hal ini , ini dan utas ini saya mencoba menemukan jawaban tentang cara mengatur margin pada satu tampilan. Namun, saya bertanya-tanya apakah tidak ada cara yang lebih mudah. Saya akan menjelaskan mengapa saya lebih suka tidak ingin menggunakan pendekatan ini:
Saya memiliki Tombol khusus yang meluas Tombol. Jika latar belakang diatur ke sesuatu selain latar belakang default (dengan memanggil salah satu setBackgroundResource(int id)
atau setBackgroundDrawable(Drawable d)
), saya ingin margin menjadi 0. Jika saya memanggil ini:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Saya ingin margin diatur ulang ke -3dp (saya sudah membaca di sini cara mengkonversi dari piksel ke dp, jadi setelah saya tahu cara mengatur margin dalam px, saya dapat mengatur sendiri konversi). Tetapi karena ini disebut dalam CustomButton
kelas, induk dapat bervariasi dari LinearLayout ke TableLayout, dan saya lebih suka dia tidak meminta orang tuanya dan memeriksa contoh dari orang tua itu. Saya kira itu juga akan sangat buruk.
Juga, ketika memanggil (menggunakan LayoutParams) parentLayout.addView(myCustomButton, newParams)
, saya tidak tahu apakah ini menambahkannya ke posisi yang benar (belum mencoba), katakanlah tombol tengah dari lima baris.
Pertanyaan: Apakah ada cara yang lebih mudah untuk mengatur margin dari satu Tombol secara terprogram selain menggunakan LayoutParams?
EDIT: Saya tahu cara LayoutParams, tapi saya ingin solusi yang menghindari penanganan setiap jenis wadah yang berbeda:
ViewGroup.LayoutParams p = this.getLayoutParams();
if (p instanceof LinearLayout.LayoutParams) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof RelativeLayout.LayoutParams) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof TableRow.LayoutParams) {
TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
}
Karena this.getLayoutParams();
hasil sebuah ViewGroup.LayoutParams
, yang tidak memiliki atribut topMargin
, bottomMargin
, leftMargin
, rightMargin
. Contoh mc yang Anda lihat hanyalah MarginContainer
yang mengandung margin offset (-3dp) dan (oml, omr, omt, omb) dan margin asli (ml, mr, mt, mb).
LayoutParams - BUKAN BEKERJA! ! !
Perlu menggunakan jenis: MarginLayoutParams
Contoh Kode untuk MarginLayoutParams:
http://www.codota.com/android/classes/android.view.ViewGroup.MarginLayoutParams
sumber
Button
tampilan:ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) button.getLayoutParams()
pengembaliannull
Cara terbaik yang pernah ada:
Cara memanggil metode:
Semoga ini bisa membantu Anda.
sumber
Kemudian
Atau
sumber
Inilah jawaban lengkap dengan pembaruan terkini:
Langkah 1, untuk memperbarui margin
Ide dasarnya adalah untuk mendapatkan margin dan memperbaruinya. Pembaruan akan diterapkan secara otomatis dan Anda tidak perlu mengaturnya kembali. Untuk mendapatkan parameter tata letak, cukup panggil metode ini:
Itu
LayoutParams
berasal dari tata letak tampilan Anda. Jika tampilan dari tata letak linier, Anda perlu mengimporLinearLayout.LayoutParams
. Jika Anda menggunakan tata letak relatif, imporLinearLayout.LayoutParams
, dll.Sekarang, jika Anda menetapkan margin menggunakan
Layout_marginLeft
,Right
, dll, Anda perlu memperbarui marjin dengan cara iniJika Anda menetapkan margin menggunakan yang baru
layout_marginStart
, Anda perlu memperbarui margin dengan cara iniLangkah 2, untuk memperbarui margin dalam dp
Kedua cara memperbarui margin di atas memperbarui dalam piksel. Anda perlu melakukan terjemahan dp ke piksel.
Sekarang masukkan nilai yang dihitung ke fungsi pembaruan margin di atas dan Anda harus siap
sumber
layout_margin adalah kendala yang anak view katakan kepada orang tuanya. Namun itu adalah peran orang tua untuk memilih apakah akan memberikan margin atau tidak. Pada dasarnya dengan mengatur android: layout_margin = "10dp", anak tersebut meminta grup tampilan induk untuk mengalokasikan ruang yang 10dp lebih besar dari ukuran sebenarnya. (padding = "10dp", di sisi lain, berarti tampilan anak akan membuat kontennya sendiri 10dp lebih kecil .)
Akibatnya, tidak semua ViewGroup menghargai margin . Contoh yang paling terkenal adalah listview, di mana margin item diabaikan. Sebelum Anda menelepon
setMargin()
ke LayoutParam, Anda harus selalu memastikan bahwa tampilan saat ini tinggal di ViewGroup yang mendukung margin (misalnya LinearLayouot atau RelativeLayout), dan melemparkan hasilnyagetLayoutParams()
ke LayoutParams spesifik yang Anda inginkan. (ViewGroup.LayoutParams
bahkan tidak punyasetMargins()
metode!)Fungsi di bawah ini seharusnya melakukan trik. Namun pastikan Anda mengganti RelativeLayout dengan tipe tampilan induk.
sumber
Metode ini akan memungkinkan Anda mengatur Margin di DP
MEMPERBARUI
Anda dapat mengubah parameter yang sesuai dengan kebutuhan Anda.
sumber
Di Kotlin akan terlihat seperti ini:
sumber
Ketika Anda berada di Tampilan kustom, Anda dapat menggunakan
getDimensionPixelSize(R.dimen.dimen_value)
, dalam kasus saya, saya menambahkan margin di LayoutParams dibuatinit
metode.Di Kotlin
di Jawa:
sumber
Gunakan metode ini untuk mengatur margin dalam dp
panggil metode:
sumber
Untuk penggunaan pengaturan satu baris yang cepat
tetapi berhati-hatilah untuk segala penggunaan yang salah pada LayoutParams, karena ini tidak memiliki
if
chech instance statmentsumber
Membuat fungsi Ekstensi Kotlin untuk Anda yang mungkin merasa nyaman.
Pastikan untuk memasukkan piksel, bukan dp. Selamat coding :)
sumber
Dalam contoh saya, saya menambahkan ImageView ke LinearLayout secara terprogram. Saya telah menetapkan margin atas dan bawah ke ImagerView. Kemudian menambahkan ImageView ke LinearLayout.
sumber
Anda dapat menggunakan metode ini dan meletakkan dimen statis seperti 20 yang dikonversi sesuai perangkat Anda
sumber
Seperti hari ini, yang terbaik mungkin menggunakan Paris , perpustakaan yang disediakan oleh AirBnB.
Gaya kemudian dapat diterapkan seperti ini:
itu juga mendukung tampilan khusus (jika Anda memperluas tampilan) menggunakan anotasi:
sumber
Anda harus menelepon
seperti itu:
your_view.setPadding(0,16,0,0)
Apa yang Anda coba gunakan hanyalah pengambil.
Android studio menunjukkan apa yang
padding...()
sebenarnya berarti di java:padding example Gambar hanya menunjukkan panggilan
getPadding...()
Jika Anda ingin menambahkan margin ke TextView Anda, Anda harus LayoutParams:
sumber
Saya harus melemparkan tambang ke
FrameLayout
untuk LinearLayout karena mewarisi darinya dan mengatur margin di sana sehingga aktivitas hanya muncul di bagian layar bersama dengan latar belakang yang berbeda dari tata letak tata letak asli disetContentView
.Tidak ada yang bekerja untuk menggunakan aktivitas yang sama dan mengubah margin berdasarkan pada pembukaan aktivitas dari menu yang berbeda! setLayoutParams tidak pernah bekerja untuk saya - perangkat akan macet setiap saat. Meskipun ini adalah angka yang dikodekan dengan keras - ini hanya contoh kode untuk tujuan demonstrasi saja.
sumber
Anda dapat menggunakan
ViewGroup.MarginLayoutParams
untuk mengatur lebar, tinggi dan marginDi mana metode
setMargins();
mengambil nilai untuk masing-masing kiri, atas, kanan, bawah. Searah jarum jam !, mulai dari kiri.sumber