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 CustomButton
sı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 MarginContainer
ofset (-3dp) kenar boşlukları ve (oml, omr, omt, omb) ve orijinal kenar boşluklarını (ml, mr, mt, mb) içeren bir alandır.