Ich habe eine Klasse, die derzeit Activity erweitert, und ich habe Methoden wie findViewById, ArrayAdapter usw. Ich möchte sie in eine unabhängige Klasse verwandeln, aber alle oben genannten Methoden werden undefiniert. Was ist das Problem? Sollte das Importieren der Klassen nicht ausreichen? Zum Beispiel importiere ich android.view.View für findViewById, aber es macht immer noch keinen Unterschied. Bitte beraten.
Verwenden von findviewbyid in einer Klasse, die Aktivität in Android NICHT erweitert
Namratha
Houcine
Sie sollten die Instanz Ihrer Aktivität wie folgt an Ihre zweite Klasse im Konstruktor übergeben:
In deiner Activity
Instanziieren Sie Ihre Klasse wie folgt:
MyClass instance = new MyClass(this);
Und das in ihrer 2. Klasse Konstrukteur wird so sein:
public class MyClass {
public Activity activity;
//.... other attributes
public MyClass( Activity _activity){
this.activity = _activity;
//other initializations...
}
}
und dann, wenn Sie die verwenden möchten findViewById()
Methode können Sie so vorgehen:
EditText txt = (EditText)this.activity.findViewById(R.id.txt);
-
Das funktioniert nicht. findViewById kann nur für Aktivität und nicht für Kontext aufgerufen werden. Ich habe Ihren Ansatz ausprobiert, aber er hat mir immer noch Fehler gegeben.
– Namratha
2. Dezember 2011 um 4:48 Uhr
-
Sehen Sie sich also meine Bearbeitung an, übergeben Sie einfach die Instanz der Aktivität anstelle des Kontexts 🙂
– Houcin
2. Dezember 2011 um 10:25 Uhr
-
Ok, das habe ich getan 🙂 Wenn ich findViewById für das Activity-Objekt aufrufe, ist die Listiew, die ich zu finden versuche, NULL. Liegt das daran, dass ich setContentView noch nicht für die XML-Datei verwendet habe, die die ListView enthält?
– Namratha
5. Dezember 2011 um 7:03 Uhr
-
Ja setContentView fehlte und das war das Problem. setContentView kann für das Activity-Objekt aufgerufen werden.
– Namratha
5. Dezember 2011 um 7:10 Uhr
-
Das “Problem” bei diesem Ansatz besteht darin, dass, wenn Sie auch einen Verweis von der Aktivität auf die Klasse benötigen, eine zirkuläre Abhängigkeit entsteht. Java kann damit umgehen, ist sich aber nicht sicher, ob Sie dies für eine gute Übung halten würden. Hier besteht die Gefahr eines Speicherlecks. Für meinen Anwendungsfall habe ich mich darum herumgearbeitet, indem ich meine Ansichtsvererbungshierarchie neu definiert habe, die den Anforderungen meiner App entspricht.
– html_programmierer
28. März 2017 um 8:04 Uhr
N-FREUDE
wenn Sie eine Funktion aufrufen möchten, die dazu gehört Activity
dann müssen Sie nur noch den Kontext von haben Activity
.
z.B.
class A extends Activity {
Context ctx;
void onCreate(Bundle b)
ctx = this;
B bob = new B(ctx);
}
}
Hier ist Klasse B.
class B {
B (Activity a) {
a.anyFunctionOfActivity();
}
}
-
@IgorGanapolsky hier auch. Was sollte getan werden, damit dies in AsyncTask funktioniert?
– Himanshu Aggarwal
21. April 2015 um 17:42 Uhr
findViewById ist eine nicht statische öffentliche Methode der Activity
Klasse, also nur verfügbar für a Activity
Objekt. Daher importieren android.view.View
und android.app.Activity
wird es nicht zur Verfügung stellen. Um es verfügbar zu machen, könnten Sie a herumreichen Actvity
Objekt – normalerweise a this
Punkt in Ihrer Tätigkeit. Beachten Sie jedoch, dass Sie Ihre Ansicht immer im UI-Thread aktualisieren sollten.
-
Ok, ich verstehe, warum es nicht verfügbar ist, aber ist findViewById keine Methode der View-Klasse? Könnten Sie auch erklären, warum wir unsere Ansicht im UI-Thread immer aktualisieren sollten (beziehen Sie sich auf die Hauptaktivität?)?
– Namratha
30. November 2011 um 11:38 Uhr
Ali Bagheri
Bitte versuche folgendes:
public static View getLayoutByRes(@LayoutRes int layoutRes,@Nullable ViewGroup viewGroup)
{
final LayoutInflater factory = getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return factory.inflate(layoutRes, viewGroup);
}
TextView tv = (TextView) getLayoutByRes(R.layout.xxx ,Null).findViewById(R.id.editd);