android中的NullPointerException,同时在menu.xml中使用actionLayout

Posted

技术标签:

【中文标题】android中的NullPointerException,同时在menu.xml中使用actionLayout【英文标题】:NullPointerException in android while using actionLayout in menu.xml 【发布时间】:2014-09-14 03:37:53 【问题描述】:

我想在我的应用程序的菜单中使用自定义 SearchView,但是在 menu.xml 中使用 actionLayout 时,我在 android 中遇到了 NullPointerException 我有菜单的自定义布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_ >
<Button
    android:id="@+id/search_btn"
    style="?android:attr/buttonStyleSmall"
    android:layout_
    android:layout_
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:background="@android:drawable/ic_menu_search"/>

<EditText
    android:id="@+id/search_et"
    android:layout_
    android:layout_
    android:layout_alignBottom="@+id/search_btn"
    android:layout_toLeftOf="@+id/search_btn"
    android:ems="10"
    android:inputType="none" >

    <requestFocus />
</EditText>

我的 menu.xml 是:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
    android:id="@+id/search_view"        
    android:icon="@android:drawable/ic_menu_search"
    android:actionLayout="@layout/search_menu"
    android:showAsAction="collapseActionView|ifRoom"
    android:title="@string/search_title"/>
</menu>

现在我想在 _search_btn_ 上添加 OnClickListener 所以我也这样做了:

@Override
public boolean onCreateOptionsMenu(Menu menu) 
    getMenuInflater().inflate(R.menu.menu, menu);

    searchButton = (Button) menu.findItem(R.id.search_btn);

    searchButton.setOnClickListener(new OnClickListener()  // SEE HERE I'M GETTING NullPointerException 
        @Override
        public void onClick(View v) 
            Toast.makeText(MainActivity.this, ((EditText) findViewById(R.id.search_et)).getText().toString(), Toast.LENGTH_LONG).show();

        
    );
    return true;

但我在上面提到的行上得到了 NullPointerException。如何将 ClickListener 添加到该按钮???

【问题讨论】:

为什么不使用onOptionsItemSelected 对不起,我没得到请你给我一些代码 Snnip :-P 你有追溯吗? ***.com/questions/7479992/… 【参考方案1】:

请尝试 onOptionsItemSelected 方法。

@Override
public boolean onOptionsItemSelected(MenuItem item) 
    // Handle item selection
    switch (item.getItemId()) 
    case R.id.search_view:
        //write your code here
        return true;
    default:
        return super.onOptionsItemSelected(item);
    

【讨论】:

【参考方案2】:

嗯,你没有得到你的按钮的引用。即在searchButton = (Button) menu.findItem(R.id.search_btn); 中,您的 searchButton 为空。

您使用了错误的 ID。

【讨论】:

【参考方案3】:

您使用了错误的 ID。为您的菜单项使用 id。您可以在 MenuItem 上使用 getActionView 来获取布局。

@Override
 public boolean onCreateOptionsMenu(Menu menu) 
     getMenuInflater().inflate(R.menu.menu, menu);

    MenuItem searchItem = menu.findItem(R.id.search_view);
    Button searchButton = searchItem.getActionView().findViewById(R.id.search_btn);
    searchButton.setOnClickListener(new OnClickListener()  // SEE HERE I'M GETTING    NullPointerException 
        @Override
        public void onClick(View v) 
            Toast.makeText(MainActivity.this, ((EditText)    findViewById(R.id.search_et)).getText().toString(), Toast.LENGTH_LONG).show();

        
    );
   return true;

【讨论】:

您的回答很有帮助!即使在使用 NavigationView 的情况下,我们也可以这样做(在 onCreate() 方法而不是 onCreateOptionsMenu() 中)。我们只能以其他方式获取对 MenuItem 的引用:NavigationView navigationView = this.findViewById(R.id.navigation_view); MenuItem searchItem = navigation.getMenu().findItem(R.id.search_view); //...

以上是关于android中的NullPointerException,同时在menu.xml中使用actionLayout的主要内容,如果未能解决你的问题,请参考以下文章

数组的常见异常

如何为同一服务使用@Autowired 注解两个或多个不同的组件类?

如何在 webview 中禁用与 html5 视频的交互或正确捕获它们的异常?

Android中的Menu

android中的java.lang.OutOfMemoryError,同时从android中的画廊获取图像

android 6中的android webview youtube视频中的全屏模式问题