2016-05-14 15 views
1

Ich entwickle meine erste App in Android Studio. Ich habe zwei Klassen. Eine, die Einstellungen enthält.Was tun, wenn ich keinen Kontext habe?

public class settings { 
    private int przed_termin; 
    private int przed_po_otwarciu; 
    private boolean powiadomienia; 
    private ustawienia_sql ustawienia_baza; 
} 

Und eine zweite, die für das Lesen und Speichern in SQLite-Datenbank verantwortlich ist. Und jetzt versuche ich Objekt settings_sql in settings zu erstellen, aber dazu brauche ich eine Context. Und gibt es die Möglichkeit, daran vorbeizukommen?

public class settings_sql extends SQLiteOpenHelper { 
    public settings_sql (Context context) { 
     super(context, "ustawienia.db", null, 1); 
    } 
} 
+2

nur diese wenigen Werte zu speichern verwenden SharedPreferces –

+0

Entweder übergeben Sie den Kontext als ein Parameter oder erhalten Sie es aus Ihrer Basisaktivität. –

Antwort

1

Ich gehe zu g Ive Sie ein bisschen verstehen, dann Code. Kontext ist eine häufige Frustration für neue Android-Programmierer.

Es gibt tatsächlich 4 verschiedene Arten von Context-Objekten. Das ist wichtig zu wissen. Im Allgemeinen, wenn Sie Benutzersteuerelemente ausführen, möchten Sie den Aktivitätskontext, in dem das Benutzersteuerelement gehostet wird. Die Antwort von days funktioniert dafür. Grundsätzlich ist das Kontextobjekt ein Aktivitätsobjekt. Es gibt auch Serviceinstanzobjekte mit einem Servicekontext.

Ein anderer Kontexttyp ist Anwendungskontext. Diese

ist, wie Sie sicherstellen, dass jede Klasse in Ihrer Anwendung Zugriff auf den Anwendungskontext hat:

eine Klasse wie folgt erstellen. Das speichert statisch ein Verweis auf es selbst mit einem Accessor:

public class MyApp extends Application{ 
    private static Context applicationContext; 

    public void onCreate() { 
     applicationContext = this; 
    } 

    public static Context getApplicationContext() { 
     return applicationContext; 
    } 
} 

Ändern Sie bitte Ihre ApplicationManifest.xml den Namen Attribut in der Anwendung Tag enthalten:

<application 
    android:name="MyApp" 
    android:allowBackup="true" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"> 
    <activity...... 
</application> 

Dann, wo immer Sie ein Kontextobjekt und don müssen ‚t ein convient Gebrauch haben:

MyApp.getApplicationContext() 

Zum Beispiel:

settings_sql(MyApp.getApplicationContext()); 

Da Sie im Ereignis oncreate der Anwendungsklasse erstellen, können Sie sicher sein, dass es in Ihrer App niemals null sein wird.

0

In Ihrem MainActivity so etwas wie:

private static Context context; 

public void onCreate() { 
     super.onCreate(); 
     context = getApplicationContext(); 
    } 

Dann, wenn Sie das Gespräch nur in den Kontext Pass

+0

ist es in nonActivity Situation gemeint – Hosseini

0

Die einfachste Lösung ist eine Application-Klasse in Ihrer APK haben und. fügen Sie eine statische Methode hinzu, um den Kontext wie folgt abzurufen:

public class MyApplication extends Application { 
private static MyApplication sInstance = null; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    sInstance = this; 
} 

public static Context getContext() { 
    return sInstance.getApplicationContext(); 
} 
1

Ich empfehle, den Kontext an Klassen zu übergeben, die es brauchen. Sie haben bereits Ihren settings_sql(Context context) Konstruktor, was ein guter Anfang ist.

In Ihrem Hauptanwendungscode können Sie den Kontext je nach Ihren Anforderungen und der tatsächlichen Lebensdauer des Objekts settings_sql ganz einfach aus Ihrer Aktivität oder Anwendung übergeben. Muss dieses Objekt über die Dauer einer einzelnen Aktivität hinaus leben?

Wenn Sie sich dann dafür entscheiden, Tests zu schreiben, können Sie nicht von einer statischen Variablen in einer willkürlichen Klasse abhängig sein, die möglicherweise nicht viel mit Ihrem Test zu tun hat.Warum sollte zum Beispiel ein lokaler Komponententest über die Klasse Application informiert werden?

Sie könnten dieses Problem nicht früh genug oder gar nicht lösen, und eine statische Variable kann eine perfekt praktikable kurzfristige Lösung sein, aber bedenken Sie, dass dies die Dinge umständlich und schwierig machen kann, wenn Sie Interaktion mit Teilen Ihres Systems aus begrenzten Bereichen, insbesondere Tests.

Verwandte Themen