Ich habe nicht wirklich die Idee, wie das Ganze wirklich funktioniert. Wenn ich also eine Klasse habe A
, die den Kontext einer Klasse benötigt, B
die sich erweitert Activity
, wie bekomme ich diesen Kontext?
Ich suche nach einem effizienteren Weg, als dem Klassenkonstruktor den Kontext als Parameter zu geben A
. Wenn die Klasse beispielsweise A
Millionen von Instanzen haben wird, haben wir am Ende Millionen redundanter Zeiger, Context
während wir in der Lage sein sollten, irgendwo nur eine und eine Getter-Funktion zu haben ...
android
android-context
Ofek Ron
quelle
quelle
Antworten:
Sie können die
Application
Klasse (öffentliche Klasse im android.application-Paket) verwenden, dh:Um diese Klasse zu verwenden, gehen Sie wie folgt vor:
public class App extends Application { private static Context mContext; public static Context getContext() { return mContext; } public static void setContext(Context mContext) { this.mContext = mContext; } ... }
In Ihrem Manifest:
<application android:icon="..." android:label="..." android:name="com.example.yourmainpackagename.App" > class that extends Application ^^^
In Aktivität B:
public class B extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sampleactivitylayout); App.setContext(this); ... } ... }
In Klasse A:
Context c = App.getContext();
Hinweis :
quelle
MainActivity
), können Sie alternativ die statischenContext
Mitglieder in diese Klasse einordnen. (Nur weil Sie diese benutzerdefinierte Klasse bereits erstellt haben und daher keine weitere Klasse erstellen müssen, App.) Andererseits ist es wohl klarer, Dinge einzufügenApp
, die nicht wirklich damit zusammenhängenMainActivity
.OnInitListener
das ist in dekaliertTextToSpeech.OnInitListener
?Ok, ich werde ein kleines Beispiel geben, wie man das macht, was man verlangt
public class ClassB extends Activity { ClassA A1 = new ClassA(this); // for activity context ClassA A2 = new ClassA(getApplicationContext()); // for application context. }
quelle
Application
Klasse zu benutzen .Der beste und einfachste Weg, um den Aktivitätskontext zu erhalten, besteht darin,
.this
nach dem Namen der Aktivität zu setzen. Beispiel: Wenn der Name Ihrer Aktivität lautetSecondActivity
, lautet der KontextSecondActivity.this
quelle
Sie übergeben den Kontext an die Klasse B in ihrem Konstruktor und stellen sicher, dass Sie getApplicationContext () anstelle von activityContext () übergeben.
quelle
Context
sein soll, funktioniert entweder der Anwendungskontext oder ein Aktivitätskontext. Wenn es sich bei der Klasse, an die der Kontext übergeben wird, jedoch um eine 'Helfer'-Klasse handelt, die möglicherweise UI-bezogene Arbeiten ausführt, wäre diesctx.getWindowManager()
beispielsweise kein gültiger Methodenaufruf, wennctx
auf den Anwendungskontext verwiesen würde. Mit anderen Worten, es hängt wirklich davon ab, warum der Klasse ein "Kontext" übergeben werden muss und wofür sie benötigt wird.Sie können einen Konstruktor mit dem Parameter Kontext der Klasse A erstellen und dann diesen Kontext verwenden.
Kontext c;
A (Kontextkontext) {this.c = Kontext}
Aus der Aktivität B erstellen Sie mit diesem Konstruktor ein Objekt der Klasse A und übergeben getApplicationContext ().
quelle
Wenn Sie den Kontext von A in B benötigen, müssen Sie ihn an B übergeben. Dazu können Sie die Aktivität A als Parameter übergeben, wie von anderen vorgeschlagen. Ich sehe nicht viel das Problem, dass die vielen Instanzen von A ihre eigenen Zeiger auf B haben, nicht sicher, ob das überhaupt so viel Aufwand bedeuten würde.
Aber wenn das das Problem ist, besteht eine Möglichkeit darin, den Zeiger auf A als eine Art globales, für die
Application
Klasse verfügbares Element beizubehalten , wie @hasanghaforian vorgeschlagen hat. Abhängig davon, wofür Sie den Kontext benötigen, können SieApplication
stattdessen sogar den Kontext des verwenden.Ich würde vorschlagen, diesen Artikel über den Kontext zu lesen, um besser herauszufinden, welchen Kontext Sie benötigen.
quelle
In Kotlin wird sein:
activity?.applicationContext?.let { it//<- you context }
quelle