[android] MenuItemCompat.getActionView는 항상 null을 반환합니다

방금 v7 AppCompat지원 라이브러리를 구현 했지만 MenuItemCompat.getActionView테스트 한 모든 Android 버전에서 항상 null을 반환합니다 (4.2.2, 2.3.4 ….)

SearchView작업 표시 줄에 표시되지만 터치 작업에 응답하지 않으며 표시하도록 확장되지 않으며 EditText단순한 아이콘과 같습니다.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    if (searchView != null) {
        SearchViewCompat.setOnQueryTextListener(searchView, mOnQueryTextListener);
        searchView.setIconifiedByDefault(false);
        Log.d(TAG,"SearchView not null");
    } else
        Log.d(TAG, "SearchView is null");
    }
    return super.onCreateOptionsMenu(menu);
}

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/action_search"
          app:showAsAction="always|collapseActionView"
          android:icon="@drawable/abc_ic_search"
          android:title="@string/action_bar_search"
          android:actionViewClass="android.support.v7.widget.SearchView"/>

    <item android:id="@+id/action_refresh"
          android:icon="@drawable/refresh"
          android:title="@string/action_bar_refresh"
          app:showAsAction="ifRoom"/>
</menu>



답변

마지막으로 해결책을 찾았습니다.

  1. 네임 스페이스의 변경 actionViewClass에서 android:actionViewClassapp:actionViewClass

  2. android.support.v7.widget.SearchView.OnQueryTextListener현재 활동을위한 인터페이스 구현

  3. setOnQueryTextListener대신에 직접 사용하십시오SearchViewCompat.setOnQueryTextListener

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
      MenuInflater inflater = getMenuInflater();
      inflater.inflate(R.menu.menu, menu);
    
      MenuItem searchItem = menu.findItem(R.id.action_search);
      SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
      if (searchView != null) {
         searchView.setOnQueryTextListener(this);
      }
    
      return super.onCreateOptionsMenu(menu);
    }

답변

제 경우에는 ProGuard 파일이었습니다. 이 줄을 추가해야합니다.

-keep class android.support.v7.widget.SearchView { *; }


답변

나를 위해 잘못된 menu.xml네임 스페이스 가져 오기로 인해이 문제가 발생했습니다.

내 원본 menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/tools">
        <item android:id="@+id/action_search"
              android:title="@string/map_option_search"
              android:icon="@drawable/ic_action_search"
              app:showAsAction="collapseActionView|ifRoom"
              app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>

(가) 것 같습니다 xmlns:app="http://schemas.android.com/tools"일으키는 MenuItemCompat.getActionView()돌아갑니다 null. 이 가져 오기를 변경 xmlns:app="http://schemas.android.com/apk/res-auto"하여 문제를 해결했습니다.

새로운 작업 menu.xml:

<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/map_option_search"
              android:icon="@drawable/ic_action_search"
              app:showAsAction="collapseActionView|ifRoom"
              app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>


답변

문제는 Support V7 패키지에서 SearchView를 사용하고 API 레벨이 ….. 22 ??로 설정되어 있다는 것입니다.

문제를 해결하기 위해 코드를 다음과 같이 변경하십시오.

menu.xml

<?xml version="1.0" encoding="UTF-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/actionbar_button_search"
        android:title="Search"
        android:showAsAction="always"
        android:actionViewClass="android.widget.SearchView" />
</menu> 


답변

나는 같은 오류 getActionView()가 있었고 내 메서드 는 항상 null을 반환했습니다. 그래서 나는 다음과 같이 만들었습니다.

<item android:id="@+id/action_search"
      android:icon="@drawable/abc_ic_search"
      android:title="@string/search_title"
      android:showAsAction="always"
      android:actionViewClass="android.widget.SearchView"/>

사람들이 app : 또는 yourapp를 사용하고 있다는 게시물을 보았지만 정상적으로 사용했습니다 android:ActionVewClass.

onCreateOptionsMenu방법에 :

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.feed, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager =
        (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
            .getActionView();
    searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getComponentName()));

    return true;
}

그리고 onCreate방법 을 넣는 것을 잊지 마십시오 .

// enabling action bar app icon and behaving it as toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);

이것은 나의 활동 “확장”에 대한 아주 잘 작동 FragmentActivity하고 ActionBarActivity.


답변

위의 Mohsen Afshin의 대답은 출발점이며 설정과 작동하도록 약간 조정했습니다.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    // SearchView searchView = (SearchView) MenuItemCompat
    //    .getActionView(searchItem);
    SearchView searchView = (SearchView) searchItem.getActionView();
    if (searchView != null) {
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                // do something with s, the entered string
                query = s;
                Toast.makeText(getApplicationContext(),
                    "String entered is " + s, Toast.LENGTH_SHORT).show();
                return true;
            }
            @Override
            public boolean onQueryTextChange(String s) {
                return false;
            }
        });
    }
    return super.onCreateOptionsMenu(menu);
}

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity" >

<item android:id="@+id/action_search"
    android:orderInCategory="5"
    android:title="Search"
    android:icon="@drawable/ic_action_search"
    android:showAsAction="ifRoom|collapseActionView"
    android:actionViewClass="android.widget.SearchView" />
</menu>


답변

나는 동일한 코드를 가졌으나 가져 오기를 사용하는 android.support.v7.widget.SearchView;내가 사용하고 있었다 import android.widget.SearchView;. 이것은 null값 에 대한 내 문제를 해결했습니다 . 따라서 검색 활동 에서이 코드를 변경하면 작동하고 XML 파일의 네임 스페이스도 변경됩니다.