wake-up-neo.com

Wie kann ich das Layout einer benutzerdefinierten Ansicht programmgesteuert erstellen?

In einer Aktivität können Sie ein LinearLayout wie folgt programmgesteuert erstellen:

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);
}

Wie machen Sie dasselbe in einer benutzerdefinierten View-Unterklasse? Es gibt keine setContentView- oder onCreate-Methoden ...

17

Okay, ich habe eine Möglichkeit entdeckt. Anstatt die View-Klasse direkt zu subklassifizieren, müssen Sie die oberste Klasse, die Sie normalerweise in XML definieren würden, subclassieren. Wenn beispielsweise für Ihre benutzerdefinierte Ansicht ein LinearLayout als oberste Klasse erforderlich ist, sollte Ihre benutzerdefinierte Ansicht einfach LinearLayout unterlegen.

Zum Beispiel:

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);
    }
}

Ist das Unterteilen von LinearLayout ein "Hack"? Nicht so weit ich sehen kann. Einige offizielle View-Unterklassen machen dasselbe, wie NumberPicker und SearchView (auch wenn sie ihre Layouts aus XML aufblasen).

Nach dem Nachdenken ist das eine ziemlich offensichtliche Antwort.

30

Wenn ich Ihre Frage verstehe, müssen Sie inflate wie folgt verwenden:

public final class ViewHolder {
        public TextView title;
        public TextView artist;
        public TextView duration;
        public ImageView thumb_image;
    //A class for the ViewHolder

    }

// Put this where you want to inflate this layout, could be a customlistview
View view = getLayoutInflater().inflate(R.layout.your_layout, null);
holder = new ViewHolder();
    holder.title = (TextView)view.findViewById(R.id.title); // title
    holder.artist = (TextView)view.findViewById(R.id.artist); // artist name
    holder.duration = (TextView)view.findViewById(R.id.duration); // duration
    holder.thumb_image=(ImageView)view.findViewById(R.id.list_image); // thumb image
0
Marckaraujo