【问题标题】:Referencing options menu item as view throws NullPointerException将选项菜单项作为视图引用会引发 NullPointerException
【发布时间】:2016-01-14 13:57:28
【问题描述】:

我正在使用 MaterialShowcaseView 库构建用户指南。我计划通过片段中的所有工具栏选项菜单项引导用户(Theme.AppCompat 不使用操作栏)。因此,我需要将每个选项菜单项作为视图引用。但不幸的是,我在onCreateOptionsMenu 收到 NullPointerException

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    getActivity().getMenuInflater().inflate(R.menu.account_summary_menu, menu);
    View item = menu.findItem(R.id.action_filter).getActionView();
    if(item == null)  Log.d("TAG", "null");

    super.onCreateOptionsMenu(menu, inflater);
}

这在onOptionsItemSelected 方法中效果很好,但不是首选。任何帮助都非常感谢。

UPD:片段代码

public class AccountSummary extends Fragment {

public AccountSummary() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_account_summary, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    getActivity().setTitle(getResources().getStringArray(R.array.drawer_menu)[0]);

}

@Override
public void onResume() {
    super.onResume();

}

//Create options menu
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.account_summary_menu, menu);
    super.onCreateOptionsMenu(menu, inflater);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_filter:
            showPopup();
            return true;

        case R.id.document_share:
            try {
                ExportData.exportSummaryAsCsv(getContext(), prepareCsvData());
            } catch (IOException e) {
                e.printStackTrace();
            }
        default:
            return super.onOptionsItemSelected(item);
    }

}

}

UPD2 接缝在菜单膨胀完成之前创建视图。我想我可以使用Thread.sleep() 之类的解决方法,但还有更优雅的方法吗?

【问题讨论】:

  • 嗨@burzakovskiy 我面临同样的问题,我的要求也是一样的。我正在使用“mreram:showcaseview”库作为用户指南。在此我必须通过 View 对象来突出显示该部分。我在查找选项菜单图标的视图对象(右上角的三个点)时遇到问题,如果您有任何想法,请帮助我。

标签: android android-fragments android-optionsmenu showcaseview


【解决方案1】:

由于片段等价物已经为您提供了 MenuInflater,可能尝试这样做..

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}

在你的情况下,getActivity() 可能会抛出一个空指针,因为首先调用 Activity 的 onCreate 方法,然后在它完成之前调用 onCreateOptionsMenu

【讨论】:

  • @burzakovskiy 你能把片段代码贴在这里
  • 使用片段代码更新问题。辅助方法已删除
猜你喜欢
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多