48

SearchView ウィジェットをアクティビティの ActionBar に追加しようとすると問題が発生します。getActionView を呼び出して SearchView オブジェクトを取得すると、null 値が返されます。

私は Android 開発者ガイドをフォローしており、インターネット上の他のリンクだけでなく、大量の SO の質問も調べました。すべて役に立たない。それは簡単なことかもしれませんが、私はそれを理解することができませんでした.私のコードは基本的にGoogleのコードと同じようです(いくつかの名前の変更などを除いて)が、それでも動作しません.

どんな助けでも大歓迎です。

以下に、コードの関連ビットを示します。何が間違っている可能性があるかについて何か考えがあるかどうか不明な点がある場合はお知らせください。

活動コード:

    private ListView workflowListView;
    private DrawerLayout drawerLayout;
    private ListView drawerList;
    private ActionBarDrawerToggle drawerToggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
        setContentView(R.layout.activity_workflow_list);

        workflowListView = (ListView) findViewById(R.id.workflowListView);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawerList = (ListView) findViewById(R.id.drawer_list);

        drawerToggle = new ActionBarDrawerToggle(
             this,                  /* host Activity */
             drawerLayout,         /* DrawerLayout object */
             R.drawable.ic_launcher,  /* nav drawer icon to replace 'Up' caret */
             R.string.app_name,  /* "open drawer" description */
             R.string.app_name  /* "close drawer" description */
             ) {

                /** Called when a drawer has settled in a completely closed state. */
                public void onDrawerClosed(View view) {
    //                getActionBar().setTitle("Closed drawer");
                }

                /** Called when a drawer has settled in a completely open state. */
                public void onDrawerOpened(View drawerView) {
    //                getActionBar().setTitle("Open drawer");
                }
       };

       drawerLayout.setDrawerListener(drawerToggle);
       ActionBar actionBar = getActionBar();
       actionBar.setDisplayShowTitleEnabled(false);

       actionBar.setDisplayHomeAsUpEnabled(true);
       actionBar.setHomeButtonEnabled(true);
       actionBar.setIcon(android.R.color.transparent);

       String[] testData = {"a", "b", "c", "d"};
       ArrayList<String> workflowList = new ArrayList<String>();
           for (String s : testData) {

                workflowList.add(s);
           }

       ArrayAdapter<String> workflowAdapter = new ArrayAdapter<String>(this.getApplicationContext(), R.layout.workflow_list_item, workflowList);

            workflowListView.setAdapter(workflowAdapter);
   }


   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
   // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();

        inflater.inflate(R.menu.workflow_list, menu);
        inflater.inflate(R.menu.options_menu, menu);

        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        // The below line returned null even though it was used in Google sample code
        SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();

        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

        return super.onCreateOptionsMenu(menu);
    }

xml/検索可能.xml:

<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint"
        android:includeInGlobalSearch="false" />

メニュー/options_menu.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/search"
          android:title="@string/search_title"
          android:icon="@drawable/ic_action_search"
          android:showAsAction="always|collapseActionView"
          android:actionViewClass="android.support.v7.widget.SearchView" />
</menu>
4

8 に答える 8

25

v21 サポート ライブラリに切り替えたときに、リリース ビルドでは同様の現象が発生した可能性がありますが、デバッグ ビルドでは発生しませんでした。難読化の問題であることが判明し、この行を proguard-rules.txt ファイルに追加すると修正されました。

-keep class android.support.v7.widget.SearchView { *; }
于 2014-11-12T21:54:32.657 に答える
1

次の行がnullを返すという非常によく似た問題がありました

SearchView searchView = (android.support.v7.widget.SearchView)MenuItemCompat.getActionView(searchMenuItem);

修正はstyles.xmlファイルにあり、AppTheme の親をTheme.AppCompat.Light

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
于 2014-08-02T21:33:21.047 に答える
0

まだ探している人のために、私は上記のすべてに従ったが、物事を進めることができなかった. searchView.setSearchableInfo... を null チェックでラップすると、できあがりです! 当然のように走りました。

if (searchView != null) {
    searchView.setSearchableInfo(searchManager.getSearchableInfo(
                    new ComponentName(getApplicationContext(), SearchActivity.class)));
}
于 2016-04-24T03:40:25.910 に答える
-1

FragmentActivityを占有していると思います。ActionBarActivityを拡張する必要があります

于 2014-02-11T22:55:56.787 に答える
-2

私も同じ問題を抱えていました。私の解決策は次のとおりです android:actionViewClass="android.support.v7.widget.SearchView"

android:actionViewClass="android.widget.SearchView"
于 2013-12-18T16:08:19.080 に答える