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 CustomButtonclasse, 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 MarginContainerche contiene i margini di offset (-3dp) e (oml, omr, omt, omb) e i margini originali (ml, mr, mt, mb).