在ActionView项上获取空指针

时间:2017-09-21 14:11:22

标签: java android xml navigation-drawer

当我尝试在抽屉菜单项中引用actionView时,我得到空指针。我需要在我的nl.dionsegijn.steppertouch.StepperTouch文件中引用视图locaton_item_layout.xml(在MainActivity.java中定义)。我试图运行以下代码来执行此操作。现在,变量actionViewLayout返回的值为null。我不确定我在这里失踪了什么。请帮忙。

这是我的MainActivity.java文件:

...
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main_drawer, menu);
        LinearLayout actionViewLayout = (LinearLayout) menu.findItem(R.id.item_with_action).getActionView();
        stepperTouch = (StepperTouch) actionViewLayout.findViewById(R.id.stepperTouch);
        return super.onCreateOptionsMenu(menu);
    }
...

此处有activity_main_drawer.xml个文件:

...
    <item
        android:id="@+id/item_with_action"
        android:title="Show Results for"
        app:actionLayout="@layout/location_item_layout">
        app:showAsAction="always"
    </item>
...

此处location_item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:id="@+id/actionviewlayout">
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Now+"
    android:textSize="30sp"/>
    <nl.dionsegijn.steppertouch.StepperTouch
        android:id="@+id/stepperTouch"
        android:layout_width="100dp"
        android:layout_height="40dp">
    </nl.dionsegijn.steppertouch.StepperTouch>
</LinearLayout>

1 个答案:

答案 0 :(得分:0)

您需要访问onPrepareOptionsMenu()中的菜单项。您应该只在onCreateOptionsMenu()中初始化菜单。来自the documentation

  

系统调用onCreateOptionsMenu()后,它会保留一个实例   您填充的菜单,并且不会再次调用onCreateOptionsMenu()   除非由于某种原因菜单失效。但是,您应该仅使用onCreateOptionsMenu()来创建初始菜单状态和   不要在活动生命周期内进行更改。

     

如果要根据发生的事件修改选项菜单   在活动生命周期中,你可以这样做   onPrepareOptionsMenu()方法。此方法将传递Menu对象   因为它当前存在,所以你可以修改它,如添加,删除或   禁用项目。 (片段还提供onPrepareOptionsMenu()   回调。)

因此,您需要将代码移至onPerepareOptionsMenu()

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
  LinearLayout actionViewLayout = (LinearLayout) menu.findItem(R.id.item_with_action).getActionView();
  stepperTouch = (StepperTouch) actionViewLayout.findViewById(R.id.stepperTouch);

  return super.onPrepareOptionsMenu(menu);
}