【发布时间】:2015-07-25 12:54:41
【问题描述】:
较旧的 API 15 和 16 没有此错误,但由于某种原因,新的 API 19 在 SearchView.setOnQueryTextListener(this) 处抛出了 NullPointerException。
我可以通过将侦听器移动到 onCreateOptionsMenu 来修复它,但是当我将它移回onCreateView时,它在旧设备上不起作用,反之亦然。
public class EventFragment extends Fragment implements AdapterView.OnItemClickListener, SearchView.OnQueryTextListener, View.OnClickListener
{
private List<EventItem> items;
private ProgressBar progressBar;
private View view;
private JazzyListView listView;
static EventAdapter adapter;
SearchView searchView;
@Override
public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
getActivity().invalidateOptionsMenu();
// creates call to
// onPrepareOptionsMenu()
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem searchItem= menu.findItem(R.id.search);
searchView =
(SearchView) MenuItemCompat.getActionView(searchItem);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (view == null) {
//inflate the layout for the items in view
view = inflater.inflate(R.layout.fragment_layout, container, false);
progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
listView = (JazzyListView) view.findViewById(R.id.listView);
Button button = (Button) view.findViewById(R.id.button3);
//Customize listView/searchview
listView.setTextFilterEnabled(true);
listView.setOnItemClickListener(this);
listView.setSmoothScrollbarEnabled(true);
searchView.setOnQueryTextListener(this);
button.setOnClickListener(this);
startService();
} else {
// If we are returning from a configuration change:
// remove view and re-attach it to the current configuration
ViewGroup parent = (ViewGroup) view.getParent();
parent.removeView(view);
}
return view;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
这里是菜单:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
android:title="@string/hello"
android:icon="@drawable/search"
android:showAsAction="collapseActionView|always"
android:actionViewClass="android.widget.SearchView"
/>
</menu>
这里是日志:
05-13 16:33:34.146 10646-10646/com.parse.starter E/CrashReporting﹕ ParseCrashReporting caught a RuntimeException exception for com.parse.starter. Building report.
05-13 16:33:34.169 10646-10646/com.parse.starter E/CrashReporting﹕ Handling exception for crash
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.parse.starter/com.parse.starter.EventKGHS}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2035)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2060)
at android.app.ActivityThread.access$600(ActivityThread.java:127)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1181)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4558)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.parse.starter.EventFragment.onQueryTextChange(EventFragment.java:160)
at android.widget.SearchView.onTextChanged(SearchView.java:1091)
at android.widget.SearchView.access$2000(SearchView.java:90)
at android.widget.SearchView$11.onTextChanged(SearchView.java:1550)
at android.widget.TextView.sendOnTextChanged(TextView.java:7692)
at android.widget.TextView.setText(TextView.java:3365)
at android.widget.TextView.setText(TextView.java:3218)
at android.widget.EditText.setText(EditText.java:78)
at android.widget.TextView.setText(TextView.java:3193)
at android.widget.TextView.onRestoreInstanceState(TextView.java:3093)
at android.view.View.dispatchRestoreInstanceState(View.java:9968)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2324)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2324)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2324)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2324)
at android.view.View.restoreHierarchyState(View.java:9946)
at com.android.internal.view.menu.MenuBuilder.restoreActionViewStates(MenuBuilder.java:358)
at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:429)
at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:890)
at android.app.Activity.invalidateOptionsMenu(Activity.java:2671)
at com.parse.starter.EventFragment.onCreate(EventFragment.java:57)
at android.support.v4.app.Fragment.performCreate(Fragment.java:1763)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:913)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133)
at android.app.Activity.performStart(Activity.java:4646)
.......
从缺乏输入和结果来看。我一定发现了一个错误!我会尽快报告。
更新:如果我使用其他东西而不是将 onquerylistener 设置为“this”怎么办?
【问题讨论】:
-
你也可以发布你的异常堆栈吗?
-
如果我把它移到 onCreate 会怎样?
-
好的,我再次将其移至 onCreate,它仅适用于旧设备
-
在调用
findViewById()之前需要先给菜单充气 -
哦,是的,我知道。充气它会创建两个相同的项目,因为我已经在另一个类中充气了它。另外,我在它收到异常时给它充气了,但它没有帮助。
标签: java android nullpointerexception android-actionbar searchview