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

时间:2014-07-23 05:03:39

标签: java android xml nullpointerexception

我想在我的应用程序的菜单中使用自定义SearchView但是我在android中遇到了一个N​​ullPointerException而在menu.xml中使用了actionLayout 我有菜单的自定义布局:

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

<EditText
    android:id="@+id/search_et"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    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添加到该按钮???

3 个答案:

答案 0 :(得分:2)

您使用的是错误的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;
}

答案 1 :(得分: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 :(得分:0)

好吧,你没有得到你的按钮的参考。即在searchButton = (Button) menu.findItem(R.id.search_btn);中,你的searchButton为空。

您使用了错误的ID。