In questo , questo e questo thread ho cercato di trovare una risposta su come impostare i margini in un'unica vista. Tuttavia, mi chiedevo se non ci fosse un modo più semplice. Spiegherò perché preferirei non usare questo approccio:
Ho un pulsante personalizzato che estende il pulsante. Se lo sfondo è impostato su un valore diverso da quello predefinito (chiamando uno setBackgroundResource(int id)
o setBackgroundDrawable(Drawable d)
), voglio che i margini siano 0. Se chiamo questo:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Voglio ripristinare i margini a -3dp (ho già letto qui come convertire da pixel a dp, quindi una volta che so come impostare i margini in px, posso gestire da solo la conversione). Ma dal momento che questo viene chiamato nella CustomButton
classe, il genitore può variare da LinearLayout a TableLayout, e preferirei non fargli ottenere il suo genitore e controllare l'istanza di quel genitore. Sarà anche abbastanza inefficiente, immagino.
Inoltre, quando chiami (usando LayoutParams) parentLayout.addView(myCustomButton, newParams)
, non so se questo lo aggiunge alla posizione corretta (non ho provato comunque), dire il pulsante centrale di una riga di cinque.
Domanda: esiste un modo più semplice per impostare il margine di un singolo pulsante a livello di codice oltre all'uso di LayoutParams?
EDIT: conosco il modo LayoutParams, ma vorrei una soluzione che eviti di gestire ogni diverso tipo di contenitore:
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);
}
}
Perché this.getLayoutParams();
restituisce una ViewGroup.LayoutParams
, che non hanno gli attributi topMargin
, bottomMargin
, leftMargin
, rightMargin
. L'istanza mc che vedi è solo una MarginContainer
che contiene i margini di offset (-3dp) e (oml, omr, omt, omb) e i margini originali (ml, mr, mt, mb).