Bonjour, je travaille avec Fragments qui implémente une interface.
public class SigninFragment extends Fragment implements SigninInterface
L'implémentation de la méthode de l'interface dans la classe fragment est la suivante.
@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
}
}
Cette méthode est appelée après l'exécution d'une classe AsynchronousTask (qui étend AsyncTask).
Mais je vais avoir un crash. Et le message d'erreur montre
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)
Je me suis essayé et exploré dans Google. Mais je n'ai pas eu de solution. Quelqu'un pourrait-il aider à ce sujet?
J'ai trouvé l'erreur ce que j'ai fait. Nous devons extraire l'instance d'activité de la méthode de substitution OnAttach (). Par exemple,
public MainActivity activity;
@Override
public void onAttach(Activity activity){
this.activity = activity;
}
Puis passez l'activité comme contexte comme suit.
Intent mIntent = new Intent(activity, MusicHome.class);
Les réponses à cette question m'ont aidé à trouver mon problème, mais ma source était différente. J'espère donc que cela permettra de mieux comprendre si quelqu'un trouve cette page à la recherche de réponses au crash de contexte 'aléatoire':
J'avais spécifié un objet SharedPreferences et essayé de l'instancier à sa déclaration de niveau classe, comme suit:
public class MyFragment extends FragmentActivity {
private SharedPreferences sharedPref =
PreferenceManager.getDefaultSharedPreferences(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
Référencer this
avant onCreate a provoqué l'erreur "Java.lang.NullPointerException: tentative d'appeler la méthode virtuelle 'Java.lang.String Android.content.Context.getPackageName ()' pour moi.
L'instanciation de l'objet à l'intérieur de onCreate () a résolu mon problème, comme suit:
public class MyFragment extends FragmentActivity {
private SharedPreferences sharedPref ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
J'espère que ça t'as aidé.
API Android niveau 23.
Utilisation
getContext ()
au lieu de
getActivity ()
getActivity () donne à l'activité parent un objet Context
Ici vous pouvez utiliser
Mon activité.
au lieu de
getActivity ()/getApplicationContext ()
Pour moi, le problème était que je passais de l'activité au constructeur, pas du contexte.
public Adapter(Activity activity, List<MediaItem> items, boolean can) {
mItems = items;
canEdit = can;
mActivity = activity;
}
et en utilisant cette activité pour getDefaultSharedPreferences (), j'ai donc changé l'activité en contexte et j'appelais toujours le constructeur Adapter avec MainActivity.this
Dans mon cas, l'erreur s'est produite à l'intérieur d'un Fragment
sur cette ligne:
Intent intent = new Intent(getActivity(), SecondaryActivity.class);
C'est arrivé lorsque j'ai double-cliqué sur un élément qui a déclenché le code ci-dessus. Deux SecondaryActivity.class
activités ont donc été lancées simultanément, l'une au-dessus de l'autre. J'ai fermé l'activité SecondaryActivity.class
supérieure en appuyant sur le bouton Précédent, ce qui a déclenché un appel à getActivity()
dans le SecondaryActivity.class
qui est apparu au premier plan. L'appel à getActivity()
a renvoyé null
. C'est une sorte de bug bizarre Android, donc cela ne devrait généralement pas arriver. Vous pouvez bloquer les clics après que l'utilisateur ait cliqué une fois.
Vous devez seulement faire ceci:
Intent myIntent = new Intent(MainActivity.this, nextActivity.class);
Ma classe n'est pas étendue à Activiti. J'ai résolu le problème de cette façon.
class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter {
...
holder.title.setOnClickListener({v->
v.context.startActivity(Intent(context, HomeActivity::class.Java))
})
...
}
J'ai eu le même problème en essayant de montrer un Toast dans un fragment.
Après un certain débogage, j'ai découvert que je retirais le fragment avant d'appeler:
Toast.makeText(getContext(), "text", Toast.LENGTH_SHORT).show();
Comme le fragment avait été supprimé, le contexte est devenu nul, ce qui a provoqué l'exception.
Solution simple: appelez la getContext()
avant de la supprimer le fragment.
Vous résolvez le problème avec un essai/attraper. Ce blocage se produit lorsque l'utilisateur ferme l'application avant l'intention de démarrage.
try
{
Intent mIntent = new Intent(getActivity(),MusicHome.class);
mIntent.putExtra("SigninFragment.user_details", bundle);
startActivity(mIntent);
}
catch (Exception e) {
e.printStackTrace();
}