setHasOptionsMenu(boolean)上的空指针

时间:2014-11-25 11:33:13

标签: android android-actionbar android-optionsmenu

我有一个利用导航抽屉的活动,我有三个片段子项。我实现了一个Action Bar搜索,虽然在5.0设备上一切正常,但我在其中一个片段上的4.0.3设备上遇到了打嗝。我正在实施搜索如下:

SearchView searchView;

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

        inflater.inflate(R.menu.main, menu); 
        searchView = (SearchView)menu.findItem(R.id.search).getActionView();
        searchView.setSubmitButtonEnabled(false);


        SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String newText){

                if (TextUtils.isEmpty(newText)){

                    CursorAdapter filterAdapter = (CursorAdapter) Cur;
                    filterAdapter.getFilter().filter(newText.toString());
                    searchView.clearFocus();
                }
                else {
                    CursorAdapter filterAdapter = (CursorAdapter) Cur;
                    filterAdapter.getFilter().filter(newText.toString());
                }

                return true;
            }

            @Override
            public boolean onQueryTextSubmit(String query) {
                return true;
            }
        };
        Cur.setFilterQueryProvider(new FilterQueryProvider() {
            public Cursor runQuery(CharSequence constraint) {
                return dbHelper.getSearchList(constraint);
            }
        });searchView.setOnQueryTextListener(textChangeListener);
        super.onCreateOptionsMenu(menu,inflater); 
    }

一开始第一个片段工作正常,当我使用导航抽屉选择一个不同的片段我的应用程序崩溃时,这里是日志猫:

11-25 17:00:17.554: E/AndroidRuntime(6667): java.lang.NullPointerException
11-25 17:00:17.554: E/AndroidRuntime(6667):     at com.exa.FragmentTab2.onCreateOptionsMenu(FragmentTab2.java:4477)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:1871)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.app.Activity.onCreatePanelMenu(Activity.java:2489)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:395)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:760)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.app.Activity.invalidateOptionsMenu(Activity.java:2607)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.app.FragmentManagerImpl.invalidateOptionsMenu(FragmentManager.java:1950)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.app.Fragment.setHasOptionsMenu(Fragment.java:901)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at com.exa.FragmentTab2.onCreateView(FragmentTab2.java:298)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.app.BackStackRecord.run(BackStackRecord.java:635)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.os.Handler.handleCallback(Handler.java:615)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.os.Looper.loop(Looper.java:153)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at android.app.ActivityThread.main(ActivityThread.java:5000)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at java.lang.reflect.Method.invokeNative(Native Method)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at java.lang.reflect.Method.invoke(Method.java:511)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
11-25 17:00:17.554: E/AndroidRuntime(6667):     at dalvik.system.NativeStart.main(Native Method)

在OnCreate中,日志引用此语句:

setHasOptionsMenu(true);

在onCreateOptionsMenu中,日志引用:

Cur.setFilterQueryProvider(new FilterQueryProvider() 

我非常确定我的Cursor不为null。

修改

我删除了

  Cur.setFilterQueryProvider(new FilterQueryProvider() {
            public Cursor runQuery(CharSequence constraint) {
                return dbHelper.getSearchList(constraint);
            }
        });

到onCreate,现在我得到一个空指针:

filterAdapter.getFilter().filter(newText.toString());

1 个答案:

答案 0 :(得分:1)

  

我非常确定我的Cursor不为null。

我更确定你是不正确的。如果NullPointerExceptionCur,那么在该行上获得null的唯一方法就是。

请将您的setFilterQueryProvider()移到更好的位置,例如您为Cur指定值的位置。请注意,您的setFilterQueryProvider()不需要位于onCreateOptionsMenu(),因为它与onCreateOptionsMenu()无关(例如,它不需要MenuMenuInflater } objects)。