Gelen bu , bu ve bu iş parçacığı tek bir görünümde kenar boşluklarını ayarlamak için nasıl bir cevap bulmaya çalıştık. Ancak, daha kolay bir yol olup olmadığını merak ediyordum. Neden bu yaklaşımı kullanmak istemediğimi açıklayacağım:
Düğme genişleten özel bir Düğme var. Arka plan, varsayılan arka plan dışında başka bir şeye ayarlanırsa ( setBackgroundResource(int id)veya birini çağırarak setBackgroundDrawable(Drawable d)), kenar boşluklarının 0 olmasını isterim.
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Kenar boşluklarını -3dp'ye sıfırlamak istiyorum ( Burada piksellerden dp'ye nasıl dönüştürüleceğini zaten okudum , bu yüzden pikselde kenar boşluklarını nasıl ayarlayacağımı bildiğimde, dönüşümü kendim yönetebilirim). Ancak bu CustomButtonsınıfta çağrıldığından , üst öğe LinearLayout'tan TableLayout'a kadar değişebilir ve onun ebeveynini almasını ve o ebeveynin örneğini kontrol etmesini istemem. Bu da oldukça sağlam olacak, sanırım.
Ayrıca, (LayoutParams kullanarak) çağrılırken parentLayout.addView(myCustomButton, newParams), bu doğru konuma ekleyip eklemediğini bilmiyorum (ancak denemedim), beş satırın orta düğmesini söyleyin.
Soru: LayoutParams'ı kullanmanın yanı sıra tek bir Düğmenin kenar boşluğunu programlı olarak ayarlamanın daha kolay bir yolu var mı ?
DÜZENLEME: LayoutParams yolunu biliyorum, ancak her farklı kap türünü işlemekten kaçınan bir çözüm istiyorum:
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);
}
}
Çünkü this.getLayoutParams();getiri Bir ViewGroup.LayoutParamsözelliklerini yok topMargin, bottomMargin, leftMargin, rightMargin. Gördüğünüz mc örneği, yalnızca MarginContainerofset (-3dp) kenar boşlukları ve (oml, omr, omt, omb) ve orijinal kenar boşluklarını (ml, mr, mt, mb) içeren bir alandır.