嗨,我正在使用实现接口的Fragments。
public class SigninFragment extends Fragment implements SigninInterface
片段类中接口的方法实现如下。
@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
}
}
在执行AsynchronousTask(扩展AsyncTask)类之后调用此方法。
但是我崩溃了。并显示错误消息
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)
我试过自己并在Google上进行过探索。但我没有得到任何解决方案。有人可以帮忙吗?
我发现了我所做的错误。我们需要从覆盖方法OnAttach()获取活动实例例如,
public MainActivity activity;
@Override
public void onAttach(Activity activity){
this.activity = activity;
}
然后将活动作为上下文传递如下。
Intent mIntent = new Intent(activity, MusicHome.class);
这个问题的答案帮助我找到了我的问题,但我的来源不同,所以希望这可以揭示有人找到这个页面寻找“随机”上下文崩溃的答案:
我已经指定了一个SharedPreferences对象,并尝试在它的类级声明中实例化它,如下所示:
public class MyFragment extends FragmentActivity {
private SharedPreferences sharedPref =
PreferenceManager.getDefaultSharedPreferences(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
在onCreate之前引用this
导致“java.lang.NullPointerException:尝试在空对象引用上调用虚方法'java.lang.String android.content.Context.getPackageName()'”对我来说是错误的。
在onCreate()中实例化对象解决了我的问题,如下所示:
public class MyFragment extends FragmentActivity {
private SharedPreferences sharedPref ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
希望有所帮助。
android API等级23。
使用
的getContext()
代替
getActivity()
getActivity()给出父Activity,一个Context对象
在这里你可以使用
MyActivity.this
代替
getActivity()/ getApplicationContext()
对我来说问题是我将Activity传递给构造函数,而不是Context
public Adapter(Activity activity, List<MediaItem> items, boolean can) {
mItems = items;
canEdit = can;
mActivity = activity;
}
并使用此活动getDefaultSharedPreferences(),所以我将Activity更改为Context,我仍然使用MainActivity.this调用Adapter构造函数。
你只需要这样做:
Intent myIntent = new Intent(MainActivity.this, nextActivity.class);
在我的情况下,错误发生在这一行的Fragment
内:
Intent intent = new Intent(getActivity(), SecondaryActivity.class);
它发生在我双击一个触发上面代码的项目时,所以两个SecondaryActivity.class
活动同时启动,一个在另一个上面。我通过按下后退按钮关闭了顶部的SecondaryActivity.class
活动,该按钮触发了getActivity()
的SecondaryActivity.class
调用。对getActivity()
的召唤让null
回归。这是一种奇怪的Android bug,所以通常不应该发生。
我的课程没有扩展到Activiti。我这样解决了问题。
class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter {
...
holder.title.setOnClickListener({v->
v.context.startActivity(Intent(context, HomeActivity::class.java))
})
...
}
您可以使用try / catch解决问题。当用户在开始意图之前关闭应用程序时,会发生此崩溃。
try
{
Intent mIntent = new Intent(getActivity(),MusicHome.class);
mIntent.putExtra("SigninFragment.user_details", bundle);
startActivity(mIntent);
}
catch (Exception e) {
e.printStackTrace();
}