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 视频的交互或正确捕获它们的异常?