Hallo, ich arbeite mit Fragmenten, die eine Schnittstelle implementieren.
public class SigninFragment extends Fragment implements SigninInterface
Die Methodenimplementierung der Schnittstelle in der Fragmentklasse ist wie folgt.
@Override
public void afterSubmitClicked(String userId, Bundle bundle) {
Log.d(TAG,"Calling time afterSubmitClicked called"+bundle);
if(!userId.equals("-1")){
//Logged in successfully
//Move to MusicHome
Intent mIntent = new Intent(getActivity(),MusicHome.class);
mIntent.putExtra("SigninFragment.user_details", bundle);
startActivity(mIntent);
}else{
//Logging in failed
//show error dialog
}
}
Diese Methode wird aufgerufen, nachdem eine AsynchronousTask-Klasse (die AsyncTask erweitert) ausgeführt wurde.
Aber ich bekomme einen Absturz. Und die Fehlermeldung zeigt
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
Logcat
02-14 16:37:04.648: E/AndroidRuntime(28177): Process: com.raaga.android, PID: 28177
02-14 16:37:04.648: E/AndroidRuntime(28177): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
02-14 16:37:04.648: E/AndroidRuntime(28177): at android.content.ComponentName.<init>(ComponentName.java:77)
02-14 16:37:04.648: E/AndroidRuntime(28177): at android.content.Intent.<init>(Intent.java:3996)
02-14 16:37:04.648: E/AndroidRuntime(28177): at com.raaga.fragments.SigninFragment.afterSubmitClicked(SigninFragment.java:152)
02-14 16:37:04.648: E/AndroidRuntime(28177): at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.java:92)
02-14 16:37:04.648: E/AndroidRuntime(28177): at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.java:1)
02-14 16:37:04.648: E/AndroidRuntime(28177): at android.os.AsyncTask.finish(AsyncTask.java:632)
02-14 16:37:04.648: E/AndroidRuntime(28177): at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-14 16:37:04.648: E/AndroidRuntime(28177): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
02-14 16:37:04.648: E/AndroidRuntime(28177): at android.os.Handler.dispatchMessage(Handler.java:102)
02-14 16:37:04.648: E/AndroidRuntime(28177): at android.os.Looper.loop(Looper.java:135)
02-14 16:37:04.648: E/AndroidRuntime(28177): at android.app.ActivityThread.main(ActivityThread.java:5221)
02-14 16:37:04.648: E/AndroidRuntime(28177): at java.lang.reflect.Method.invoke(Native Method)
02-14 16:37:04.648: E/AndroidRuntime(28177): at java.lang.reflect.Method.invoke(Method.java:372)
02-14 16:37:04.648: E/AndroidRuntime(28177): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
02-14 16:37:04.648: E/AndroidRuntime(28177): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Ich habe es selbst versucht und in Google erkundet. Aber ich habe keine Lösung bekommen. Könnte jemand dabei helfen?
android
android-fragments
fragment
Karthikeyan Ve
quelle
quelle
onAttach(Context context)
ist nicht.Die Antworten auf diese Frage haben mir geholfen, mein Problem zu finden, aber meine Quelle war anders. Hoffentlich kann dies Aufschluss darüber geben, dass jemand auf dieser Seite nach Antworten auf den zufälligen Kontextabsturz sucht:
Ich hatte ein SharedPreferences-Objekt angegeben und versucht, es bei der Deklaration auf Klassenebene zu instanziieren:
public class MyFragment extends FragmentActivity { private SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //...
Das Verweisen
this
vor dem onCreate verursachte bei mir den Fehler "java.lang.NullPointerException: Versuch, die virtuelle Methode 'java.lang.String android.content.Context.getPackageName ()' für eine Nullobjektreferenz aufzurufen" .Das Instanziieren des Objekts in onCreate () löste mein Problem wie folgt:
public class MyFragment extends FragmentActivity { private SharedPreferences sharedPref; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //... sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
Hoffentlich hilft das.
quelle
Android API Level 23.
Verwenden
anstatt
getActivity () gibt der übergeordneten Aktivität ein Kontextobjekt
Hier können Sie verwenden
anstatt
quelle
Fragment
.Ich hatte das gleiche Problem beim Versuch, einen Toast in einem Fragment zu zeigen.
Nach einigem Debuggen stellte ich fest, dass ich das Fragment entfernte, bevor ich aufrief:
Toast.makeText(getContext(), "text", Toast.LENGTH_SHORT).show();
Da das Fragment entfernt wurde , wurde der Kontext null und verursachte die Ausnahme.
Einfache Lösung: Rufen Sie das auf,
getContext()
bevor Sie das Fragment entfernen .quelle
In meinem Fall ist der Fehler in a
Fragment
in dieser Zeile aufgetreten :Intent intent = new Intent(getActivity(), SecondaryActivity.class);
Es geschah, als ich auf ein Element doppelklickte, das den obigen Code auslöste, sodass zwei
SecondaryActivity.class
Aktivitäten gleichzeitig übereinander gestartet wurden. Ich schloss die obersteSecondaryActivity.class
Aktivität durch Drücken der Zurück-Taste, die einen AnrufgetActivity()
in demSecondaryActivity.class
Vordergrund auslöste . Der AnrufgetActivity()
zurücknull
. Es ist eine Art seltsamer Android-Fehler, daher sollte es normalerweise nicht passieren. Sie können die Klicks blockieren, nachdem der Benutzer einmal geklickt hat.quelle
Sie müssen nur Folgendes tun:
Intent myIntent = new Intent(MainActivity.this, nextActivity.class);
quelle
Für mich war das Problem, dass ich Activity an den Konstruktor und nicht an Context übergeben habe
public Adapter(Activity activity, List<MediaItem> items, boolean can) { mItems = items; canEdit = can; mActivity = activity; }
Wenn ich diese Aktivität verwende, um DefaultSharedPreferences () abzurufen, habe ich die Aktivität in Kontext geändert und den Adapterkonstruktor weiterhin mit MainActivity.this aufgerufen
quelle
In meinem Fall hatte ich eine onCLick-Methode in einem Recyclerview-Adapter, Context context; am Anfang.
holder.cTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context, StoryActivity.class); intent.putExtra("STORY", mComments.get(position)); context.startActivity(intent); } });
Und ich habe mich geändert, um den Kontext aus der aktuellen Ansicht zu erhalten
holder.cTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(v.getContext(), StoryActivity.class); intent.putExtra("STORY", mComments.get(position)); v.getContext().startActivity(intent); } });
quelle
Meine Klasse erstreckt sich nicht auf Activiti. Ich habe das Problem auf diese Weise gelöst.
class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter { ... holder.title.setOnClickListener({v-> v.context.startActivity(Intent(context, HomeActivity::class.java)) }) ... }
quelle
Stellen Sie den Fragmentnamen vor die Aktivität
Intent mIntent = new Intent(SigninFragment.this.getActivity(),MusicHome.class);
quelle
Sie lösen das Problem mit einem Versuch / Fang. Dieser Absturz tritt auf, wenn der Benutzer die App vor der Startabsicht schließt.
try { Intent mIntent = new Intent(getActivity(),MusicHome.class); mIntent.putExtra("SigninFragment.user_details", bundle); startActivity(mIntent); } catch (Exception e) { e.printStackTrace(); }
quelle
onFinish
Methode erzeugen würde . Wenn der Benutzer jedoch die Zurück-Taste drückte, um zur vorherigen Aktivität zu gelangen, bei der der Timer nicht erstellt wurde, würde ich eine Null-Objektreferenz erhalten, da getActivity () nicht mehr funktionieren würde. Dies kann auch für Threads nützlich sein, die nicht geschlossen wurden, nachdem der Benutzer die Aktivität verlassen hat. Vielen Dank!Sie können Ihr Problem einfach lösen und Ihre Aktivität an einer beliebigen Stelle in der Aktivität verwenden. Speichern Sie die Aktivität einfach wie folgt:
public class MainActivity extends AppCompatActivity{ Context context = this; protected void onCreate(Bundle savedInstanceState) {....} AnotherClass { Intent intent = new Intent(context, ExampleActivity.class); intent.putExtra("key", "value"); startActivity(intent); } }
quelle
Aufgrund
onAttach
ist in API23 und höher veraltet ... In meinem Fragment deklariere und setzeparentActivity
ich jedes Mal vorab, wenn ich in Fragment gehe. Höchstwahrscheinlich wurde der Kontext durch Drücken der Zurück-Taste null. Deshalb ist unten meine Lösung.private Activity parentActivity; public void onStart(){ super.onStart(); parentActivity = getActivity(); //... }
quelle
public MessageAdapter(Context context, List<Messages> mMessageList) { this.mContext = context; this.mMessageList = mMessageList; }
quelle
Verwendung kann in global verwendet werden
Context context;
und erstellen Sie einen Konstruktor und übergeben Sie den Kontext. LoginClass ist der Name der Klasse
LoginClass(Context context) {this.context=context;}
und auch wenn wir die Klasse rufen dann verwenden ,
getApplicationContext
wieLoginClass lclass = new LoginClass(getApplicationContext)
es das ist.quelle