2017-11-07 2 views
2

Dies ist kein Problem, sondern eher eine Frage der Effizienz. Ich habe mehrere TextViews (2 davon) in meinem XML-Layout meiner Android App. Meine Frage ist, kann ich mehrere TextViews, findViewById mehrere TextViews auf einer einzigen Zeile auswählen?FindViewById mehrere Male in einer einzelnen Zeile

Ist diese gültig für meine Frage?

TextView title, darkThemeTitle = findViewById(R.id.title); findViewById(R.id.darkThemeTitle); 
+2

Nur neugierig, warum brauchen Sie es in einer einzigen Zeile? Was ist ein prinzipieller Unterschied zwischen einer einzelnen Zeile und mehreren? –

+0

Nur um die Menge an Code zu minimieren – flash76

+0

Teilen Sie Code in Methoden, verschieben Sie FindView-Code außerhalb Ihres Hauptcodes, verwenden Sie Falten. Ich kann den Vorteil der horizontalen Kodierung im Vergleich zur Vertikalen nicht verstehen. Ihr Bildschirm und Ihre IDE sind für vertikale Anwendungen ausgelegt.Was ich praktisch empfehlen kann - verwenden Sie Dynamic Binding, bitte beachten Sie meine Antwort für Details. –

Antwort

1

Wenn Sie TextView title, darkThemeTitle = findViewById(R.id.title); findViewById(R.id.darkThemeTitle); in Ihrem Code verwenden.

  • Diese Linie TextView title, darkThemeTitle = (TextView) findViewById(R.id.title); wird zeigen, dass Variable 'Titel' .So titlenie im Code initialisiert möglicherweise nicht initialisiert worden ist.

  • Und findViewById(R.id.tab_layout); wird Ansicht in Ihrem Code zurückkehren .Und es nie darkThemeTitle in Ihrem Code zurück.

Und Sie können so etwas tun.

TextView title = (TextView) findViewById(R.id.title); TextView darkThemeTitle = (TextView) findViewById(R.id.darkThemeTitle); 

Ein anderer Weg

TextView title = null, darkThemeTitle = null; 

TextView[] textViews = {title, darkThemeTitle}; 
Integer[] ids = {R.id.title, R.id.darkThemeTitle}; 

for (int i = 0; i < textViews.length; i++) { 
    textViews[i] = (TextView) findViewById(ids[i]); 
} 
0

Haben Sie es mit ButterKnife versucht? Diese Bibliothek hilft Ihnen bei der Dependency-Injektion, so dass Sie sich nicht um die findViewById kümmern müssen. Rufen Sie einfach die @BindView(view_id) und den Typ und den Namen der Variablen, die Sie binden möchten.

@BindView(R.id.title) 
TextView title; 
@BindView(R.id.darkThemeTitle) 
TextView darkThemeTitle; 

Denken Sie daran, dass Sie die Abhängigkeit in Ihrer build.gradle Datei

compile 'com.jakewharton:butterknife:8.8.1' 

und rufen Sie die bind-Methode in der onCreate Ihrer Tätigkeit

ButterKnife.bind(this); 
+0

Danke, aber ist es möglich, die Ansichten so zu gestalten? 'TextView-Titel, darkThemeTitle = findViewById (R.id.title); findViewById (R.id.darkThemeTitle); ' – flash76

+0

Würde' ButterKnife.bind (this) 'nicht gehen, nachdem alle Steuerelemente instanziiert wurden? – flash76

+0

Wenn Sie 'ButterKife.bind()' innerhalb einer 'Aktivität' verwenden, können Sie in' onCreate' verwenden, wenn dies komplexer ist als 'ViewHolder' oder' Fragment' Sie müssen 'ButterKnife (this, parentView/activityInstance) '. Mit'ElternView' können Sie ein neues Layout aufblasen oder die 'activityInstance' übergeben. –

1

Die einzige Empfehlung ist hinzuzufügen, zu verwenden müssen Vorlagen-IDs, um Ansichten zu finden:

TextView[] themedViews = new int[NUMBER_OF_THEMES]; 
for (int k = 0; k < NUMBER_OF_THEMES; k++) 
    themedViews[k] = findViewById(context.getResources().getIdentifier("some_prefix" + String.valueOf(k), "id", packageName)); 

Dies wird alle Ansichten für die aktuelle Aktivität finden.

Oder Sie können parent.findViewById verwenden, um Unteransichten einer bestimmten Ansicht zu finden.

+0

Also würde dies alle Ansichten im XML-Layout instanziieren? – flash76

+0

Ich aktualisierte eine Antwort, mein vorheriger Code war, nur IDs der Ansichten zu finden, ich änderte es, um Ansichten zu finden, –

+0

BTW, ich empfehle nicht, dieses für das Finden der themed Kontrollen zu benutzen. Beste Lösung: Verschieben Sie Ihre findViewById-Befehle in eine separate Methode in der Helper-Klasse. –

1

ich entmutigen Sie dies zu tun, weil es für andere Programmierer schwieriger ist, diese zu lesen und nicht Typisierung Zeit nicht sparen viel. Verwenden Sie:

TextView title = findViewById(R.id.title), darkThemeTitle = findViewById(R.id.darkThemeTitle); 
Verwandte Themen