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).