Verwenden von findviewbyid in einer Klasse, die Aktivität in Android NICHT erweitert

Lesezeit: 3 Minuten

Benutzeravatar von Namratha
Namratha

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.

Benutzeravatar von Houcine
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


Benutzeravatar von N-JOY
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

Benutzeravatar von Ali Bagheri
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);

1393900cookie-checkVerwenden von findviewbyid in einer Klasse, die Aktivität in Android NICHT erweitert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy