2016-05-23 7 views
1

Das kommt mehr aus Neugier. Ich habe diese Schnipsel hatte:Android: Benötigen Sie eine Referenzansicht, wenn Sie findViewById verwenden?

View mView = mInflater.inflate(R.layout.myButton, null); 
ImageButton button = (ImageButton) mView.findViewById(R.id.mButton); 
button.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     ... 

Und Zuerst versuchte ich es ohne die mView -Referenz und es funktioniert wie erwartet. So ist es auch in der Buttons -Abschnitt von developer.android.com beschrieben

jedoch mitmView auch funktioniert.

Meine Frage ist, ist es wirklich notwendig, es zu verweisen? Und was könnte der Zweck dahinter sein?

Warum funktioniert es in beide Richtungen? Könnte es irgendwelche Nachteile irgendeiner der gegebenen Nutzungen geben?

Danke.

Antwort

1

Warum funktioniert es in beide Richtungen?

Wenn es in beide Richtungen funktioniert, könnte es zwei verschiedene Dinge bedeuten. Zuerst haben Sie myButton.xml auch an setContentView übergeben. In diesem Fall hat die Aktivität als Teil ihrer Sichthierarchie eine Sicht mit der ID mButton. Es funktioniert wie erwartet, aber natürlich ist die OnClickListener, im Falle des überhöhten Layouts Zweck weniger, es sei denn, Sie fügen die aufgeblähte Ansicht der Sichthierarchie Activity hinzu. Wenn Sie myButton.xml nicht an setContentView übergeben haben, bedeutet dies, dass Sie zwei separate Layouts haben, die dasselbe ImageButton mit derselben ID enthalten. Auch in diesem Fall gelten die Überlegungen zu OnClickListener.

+0

Ich habe wirklich zwei verschiedene Layouts, aber wie ist die ID in beiden enthalten? – user8

+0

Die ID ist einzigartig. Es wird beim ersten Deklarieren von @ + id/in einem der Layouts zur Kompilierzeit generiert. Sie können das, was Sie bevorzugen, wiederverwenden – Blackbelt

1

Sie sind in zwei Fall:

Fall 1

(Button) findViewById(R.id.mButton); 

Sie in einer Aktivität sind, wo Activity.findViewById() die tatsächliche Aktivität Ansicht Baum sehen. Diese Tätigkeit wird eine Ansicht von dem Moment an haben Sie setContentView() verwenden, addContentView(..) oder andere inflater Verfahren

Fall 2

(Button) mView.findViewById(R.id.mButton); 

Wenn Sie einen Blick in eine andere Ansicht der Suche, mit der View.findViewById(). Diese Methode wird verwendet, um beispielsweise eine Ansicht von einem Fragment zu erhalten.

+0

Ja, ich verwende eine andere Ansicht mit 'addContentView()'. – user8

+1

@ user8 siehe aktualisierte Antwort –

Verwandte Themen