[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>
답변
마지막으로 해결책을 찾았습니다.
-
네임 스페이스의 변경
actionViewClass
에서android:actionViewClass
에app:actionViewClass
-
android.support.v7.widget.SearchView.OnQueryTextListener
현재 활동을위한 인터페이스 구현 -
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 파일의 네임 스페이스도 변경됩니다.