gpt4 book ai didi

android - 调用 OnPrepareOptionsMenu 产生空指针异常

转载 作者:太空狗 更新时间:2023-10-29 16:37:53 28 4
gpt4 key购买 nike

每次我调用 getActivity().invalidateOptionsMenu(); 我的应用程序都会因空指针异常而取消赎回权。

我的目标是根据通过抽屉导航中的 ListView 调用的 fragment 更改操作设置。

我的OnPrepareOptionsMenu方法如下:

public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (mNumber == 1) {
menu.findItem(R.id.sortByDivision).setVisible(false);
menu.findItem(R.id.sortByFighter).setVisible(false);
}
if (mNumber == 2) {
menu.findItem(R.id.sortByDivision).setVisible(false);
menu.findItem(R.id.sortByFighter).setVisible(true);
}
if (mNumber == 3) {
menu.findItem(R.id.sortByDivision).setVisible(true);
menu.findItem(R.id.sortByFighter).setVisible(false);
}
if (mNumber == 4) {
menu.findItem(R.id.sortByDivision).setVisible(false);
menu.findItem(R.id.sortByFighter).setVisible(false);
}
return true;
//return super.onPrepareOptionsMenu(menu);
}

调用此方法如下:

  @Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) {
return;
}

//getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}

@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!isAdded()) {
return;
}

if (!mUserLearnedDrawer) {
// The user manually opened the drawer; store this flag to prevent auto-showing
// the navigation drawer automatically in the future.
mUserLearnedDrawer = true;
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
}

//getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
};

如有必要,我可以发布更多代码或整个文件。我的 logcat 指向第一个没有注释掉的 menu.findItem… 语句。

05-27 16:50:17.898  25117-25117/com.MMA E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.MMA, PID: 25117
java.lang.NullPointerException
at com.MMA.BMMA.onPrepareOptionsMenu(BMMA.java:129)
at android.app.Activity.onPreparePanel(Activity.java:2564)
at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:464)
at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:800)
at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:221)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:543)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)

最佳答案

花了我一段时间,但我想通了。当未加载 View 时,我正在调用以更改我的操作栏项目,这导致我调用了不存在的值。我用 if 语句修复了这个问题,该语句不允许我的 on prepare 方法在 View 中有值之前执行任何操作。

高效?..可能不是。有用吗?是的!

 if(menu.findItem(R.id.sortByDivision) != null && menu.findItem(R.id.sortByFighter) != null) {
if (mNumber == 1) {
menu.findItem(R.id.sortByDivision).setVisible(false);
menu.findItem(R.id.sortByFighter).setVisible(false);
}

if (mNumber == 2) {
menu.findItem(R.id.sortByDivision).setVisible(false);
menu.findItem(R.id.sortByFighter).setVisible(true);
}
if (mNumber == 3) {

menu.findItem(R.id.sortByDivision).setVisible(true);
menu.findItem(R.id.sortByFighter).setVisible(false);
}
if (mNumber == 4) {
menu.findItem(R.id.sortByDivision).setVisible(false);
menu.findItem(R.id.sortByFighter).setVisible(false);
}
}
return true;
//return super.onPrepareOptionsMenu(menu);
}

关于android - 调用 OnPrepareOptionsMenu 产生空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23898954/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com