470 Stimmen

Aufruf von startActivity() von außerhalb eines Activity-Kontextes

Ich habe eine ListView in meiner Android-Anwendung. Ich binden zu diesem ListView unter Verwendung einer benutzerdefinierten Unterklasse der ArrayAdapter Klasse. Innerhalb der überschriebenen ArrayAdapter.getView(...) Methode, weise ich eine OnClickListener . In der onClick Methode der OnClickListener Ich möchte eine neue Aktivität starten. Ich erhalte die Ausnahme:

Calling startActivity() from outside of an Activity  context requires the  
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

Wie kann ich die Context dass die ListView (die aktuelle Activity ) arbeitet unter?

3voto

Cabezas Punkte 8203

Dieser Fehler tritt auf, wenn Startaktivität nicht weiß, welches seine Aktivität ist. Sie müssen also Aktivität vor startActivity() hinzufügen.

müssen Sie

context.startActivity(yourIntent);

3voto

Flying Monkey Punkte 659

Die Antwort von Alex Volovoy ein wenig weiter ausführen -

Falls Sie dieses Problem mit Fragmenten haben, funktioniert getActivity() gut, um den Kontext zu erhalten

In anderen Fällen:

Wenn Sie nicht wollen

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//not recommend

dann machen Sie eine Funktion wie diese in Ihrer OutsideClass -

public void gettingContext(Context context){
    real_context = context;//where real_context is a global variable of type Context
}

Wenn Sie nun in Ihrer Hauptaktivität eine neue OutsideClass erstellen, rufen Sie die obige Methode unmittelbar nach der Definition der OutsideClass auf und geben den Kontext der Aktivität als Argument an. Auch in Ihrer Hauptaktivität machen Sie eine Funktion-

public void startNewActivity(final String activity_to_start) {
    if(activity_to_start.equals("ACTIVITY_KEY"));
    //ACTIVITY_KEY-is a custom key,just to
    //differentiate different activities
    Intent i = new Intent(MainActivity.this, ActivityToStartName.class);
    activity_context.startActivity(i);      
}//you can make a if-else ladder or use switch-case

Kehren Sie nun zu Ihrer OutsideClass zurück, und starten Sie eine neue Aktivität wie folgt

@Override
public void onClick(View v) {
........
case R.id.any_button:

            MainActivity mainAct = (MainActivity) real_context;             
            mainAct.startNewActivity("ACTIVITY_KEY");                   

        break;
    }
........
}

Auf diese Weise können Sie verschiedene Aktivitäten starten, die von verschiedenen OutsideClass aus aufgerufen werden, ohne dass Sie mit Flaggen durcheinander kommen.

Hinweis: Versuchen Sie nicht, das Kontextobjekt über den Konstruktor für das Fragment zu cachen (mit dem Adapter ist das in Ordnung), ein Fragment sollte einen leeren Konstruktor haben, sonst stürzt die Anwendung in einigen Szenarien ab.

nicht vergessen zu telefonieren

OutsideClass.gettingContext(Context context);

auch in der Funktion onResume().

2voto

codemaniac Punkte 260

Ich hatte auch das gleiche Problem. Überprüfen Sie den gesamten Kontext, den Sie übergeben haben. Für ' Links ' braucht es Kontext der Aktivität no Kontext der Anwendung .

Dies ist der Ort, an dem Sie nachsehen sollten:

1.) Wenn Sie LayoutInflater dann prüfen Sie, welchen Kontext Sie übergeben haben.

2.) Wenn Sie einen der folgenden Punkte verwenden Adapter prüfen, welchen Kontext Sie übergeben haben.

2voto

Coder29 Punkte 151

Ich hatte das gleiche Problem. Das Problem liegt im Kontext. Wenn Sie Links öffnen möchten (z. B. einen Link über die Auswahlbox freigeben), geben Sie den Aktivitätskontext an, nicht den Anwendungskontext.

Vergessen Sie nicht hinzuzufügen myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) wenn Sie Ihrer Tätigkeit nicht nachgehen.

2voto

kaosmys Punkte 29

Meiner Meinung nach ist es besser, die Methode der startActivity() nur in Ihrem Code der Activity.class . Wenn Sie das in der Adapter oder einer anderen Klasse, so wird es dazu kommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X