web-dev-qa-db-fra.com

Comment créer une disposition de vue personnalisée par programme?

Dans une activité, vous pouvez créer un LinearLayout par programme de la manière suivante:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.VERTICAL);
    ll.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

    TextView tv1 = new TextView(this);
    tv1.setText("HELLO");
    ll.addView(tv1);

    TextView tv2 = new TextView(this);
    tv2.setText("WORLD");
    ll.addView(tv2);

    setContentView(ll);
}

Comment faites-vous la même chose dans une sous-classe View personnalisée? Il n'y a pas de méthodes setContentView ou onCreate ...

17

Ok, j'ai découvert une façon de le faire. Fondamentalement, au lieu de sous-classer directement la classe View, vous devez sous-classer la classe la plus haute que vous définiriez normalement en XML. Par exemple, si votre vue personnalisée nécessite LinearLayout en tant que classe supérieure, cette vue doit simplement sous-classer LinearLayout.

Par exemple:

public class MyCustomView extends LinearLayout
{
    public MyCustomView(Context context, AttributeSet attrs)
    {
        super(context, attrs);

        setOrientation(LinearLayout.VERTICAL);
        setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        TextView tv1 = new TextView(context);
        tv1.setText("HELLO");
        addView(tv1);

        TextView tv2 = new TextView(context);
        tv2.setText("WORLD");
        addView(tv2);
    }
}

Sous-classer LinearLayout est-il un "hack"? Pas aussi loin que je peux voir. Certaines sous-classes officielles de View font la même chose, comme NumberPicker et SearchView (même s’ils gonflent leur mise en page à partir de XML).

Après réflexion, c'est en fait une réponse assez évidente.

30