Wie lade ich programmatisch eine Layout-XML-Datei in Android?

Ich habe ein Layout erstelltmy_layout.xml), die programmgesteuert beispielsweise zwei andere XML-Layoutdateien enthältsome_layout.xml undanother_layout.xml. my_layout.xml wird gezeichnet mitsetContentView(R.layout.my_layout).

Jetzt habe ich eine Checkbox mit IDsome_checkbox, die im Inneren definiert istsome_layout.xml, und ich möchte das Kontrollkästchen einOnCheckedChangeListener mitsetOnCheckedChangeListener(), genau wie dieser:

CheckBox cb = (CheckBox) findViewById(R.id.some_checkbox);
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    ...
});

Aber jetzt aNullPointerException wird geworfen, weilcb istnull. Ich denke, das liegt daran, dass das Layout enthältsome_checkbox (welches istirgendein_layout) wird nicht mit geladensetContentView(R.layout.some_layout).

Frage 1: Warum? Warum kehrt der Fund zurück?R.id.some_checkbox null? irgendein_layout Ja wirklichist sichtbar.Frage 2: Wie lade ich?irgendein_layout damit ich einfangen kannsome_layout in eine Variable, wie ich es im obigen Code-Snippet versucht habe?AKTUALISIEREN

Ich habe es endlich gelöst, indem ich das Folgende verwendete, vorgeschlagen vonStealthjong:

Eine Lösung könnte darin bestehen, die zu initialisierencheckedChangeListenerWenn Sie der erweiterbaren Listenansicht einen Listener hinzufügen und ein untergeordnetes Element der erweiterbaren Listenansicht geöffnet wird, überprüfen Sie, ob IhreCheckbox ist eines der aufgeblasenen Kinder und fügt das hinzucheckedchangeListener wenn ja.

Ich habe eine Methode namens erstelltsetCheckedChangeListenerToElement(int resourceId, OnCheckedChangeListener listener), das die angegebene resourceId (die ID des Elements, an das ein Listener angehängt werden soll) und den angegebenen Listener speichert. Sobald der Inflater die Methode aufruftgetChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)kann die Ansicht abgerufen werden. Dann, auf dieser Ansicht,findViewById(int resourceId) kann angerufen werden, woresourceId ist die ID des Kontrollkästchens.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage