【问题标题】:Action Bar Search View (Android) null error操作栏搜索视图 (Android) 空错误
【发布时间】:2014-04-03 20:49:31
【问题描述】:

如果它必须对片段和片段标题或抽屉做某事,我不确定为什么它显示为 null,因为它位于从中提取该片段的主要活动中。

这是我的菜单 xml 项:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
        android:title="@string/action_search"
        android:icon="@drawable/ic_action_search"
        app:showAsAction="always"
        app:actionViewClass="android.support.v7.widget.SearchView" />
</menu>

这里是片段代码:

public class BrowseFragment extends Fragment {

    //action bar expands to search
    //search - keyword or tab search, title
    //include popular - same algorithm as home
    //show categories

    //category click takes you to grid activity
//adapter with custom model
    private CategoryViewerAdapter adapter;

    //list with custom model
    private List<CategoryItem> categoriesList;

    //List view
    private ListView categoryListView;

    //SearchView
    private SearchView search;

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.browse, menu);

        //find the menu item and set search view at the same time
        search = (SearchView) menu.findItem(R.id.action_search).getActionView();


        //to always show the search view - to include this must implement it above
        search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                return false;
            }
        });
        search.setIconified(false);

        super.onCreateOptionsMenu(menu,inflater);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_browse, container, false);

        //Allows menu options in fragment
        setHasOptionsMenu(true);


        //Set adapter for multi-select model and adapter
        adapter = new CategoryViewerAdapter(getActivity(), getSingleCategory());
        categoryListView = (ListView) rootView.findViewById(R.id.categoryListView);
        categoryListView.setAdapter(adapter);


        return rootView;
    }

    //call to retrieve list
    private List<CategoryItem> getSingleCategory() {
        //initiate new list
        categoriesList = new ArrayList<CategoryItem>();

        //called to get string array
        Resources res = getResources();
        String[] categories = res.getStringArray(R.array.categories);

        //loop through string array
        for (String category : categories) {
            categoriesList.add(get(category));
        }

        return categoriesList;
    }

    //call model to set names and methods for each item
    private CategoryItem get(String name) {
        return new CategoryItem(name);
    }


}

空指针错误指向这一行:

search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

这是错误日志:

03-03 02:50:33.590  15744-15744/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.app, PID: 15744
    java.lang.NullPointerException
            at com.example.app.BrowseFragment.onCreateOptionsMenu(BrowseFragment.java:64)
            at android.app.Fragment.performCreateOptionsMenu(Fragment.java:1780)
            at android.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:1927)
            at android.app.Activity.onCreatePanelMenu(Activity.java:2539)
            at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:436)
            at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:800)
            at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:221)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:543)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android android-fragments android-actionbar


    【解决方案1】:

    你在使用 Proguard 吗?如果是这样,请确保您有一个保留 android.support.v7.widget.SearchView 类的规则。

    例如,要保留所有不同版本的支持库中的所有内容,请添加:

    -keep class android.support.** { *; }
    -keep interface android.support.** { *; }
    

    到您的proguard-rules.txt 文件。

    【讨论】:

    • 谢谢!那是为我做的。
    • 请注意,仅使用 -keep class android.support.v7.widget.SearchView { *; } 也适用于这种情况,它比保留所有支持库类要好
    • 这对我有用。第二行是做什么用的,保留界面
    • 保持-keep class android.support.v7.widget.SearchView { *; } 为我工作。谢谢老兄。
    【解决方案2】:

    我遇到了同样的问题。我的解决方案在菜单中。

    我有:

    app:actionViewClass="android.support.v4.widget.SearchView"
    

    我应该有的时候

    app:actionViewClass="android.support.v7.widget.SearchView"
    

    【讨论】:

    • 这两行和我一模一样,我错过了什么?
    • v7 和 v4 的区别
    【解决方案3】:

    我的错误是 MenuInflater 的初始化错误。

    MenuInflater inflater = getMenuInflater();
    

    修正问题解决后。

    MenuInflater inflater = new MenuInflater(getApplicationContext());
    

    【讨论】:

      猜你喜欢
      • 2016-11-05
      • 2023-03-06
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多