Verwenden von FindViewById in einer Klasse, die die Aktivität in Android nicht erweitert
-
26-10-2019 - |
Frage
Ich habe eine Klasse, die derzeit die Aktivität 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 genug sein? Für EG importiere ich Android.View.View für FindViewById, aber es macht immer noch keinen Unterschied. Bitte beraten.
Lösung
Sie sollten die Instanz Ihrer Aktivität an Ihre zweite Klasse auf dem Konstruktor wie folgt übergeben:
In deiner Activity
Instanziieren Sie Ihre Klasse wie diese:
MyClass instance = new MyClass(this);
Und in Ihrer zweiten Klasse die 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 das verwenden möchten findViewById()
Methode, Sie können dies mögen:
EditText txt = (EditText)this.activity.findViewById(R.id.txt);
Andere Tipps
Wenn Sie eine Funktion aufrufen möchten, die gehört Activity
Dann müssen Sie nur einen Kontext des 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();
}
}
findViewById ist eine nicht statische öffentliche Methode der Activity
Klasse, also ist es nur für a verfügbar Activity
Objekt. Daher importieren android.view.View
und android.app.Activity
Ich werde es nicht zur Verfügung stellen. Um es zur Verfügung zu stellen, können Sie a um eine Actvity
Objekt - normalerweise a this
Zeigen Sie in Ihrer Aktivität. Beachten Sie jedoch, dass Sie Ihre Ansicht immer im UI -Thread aktualisieren sollten.
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);