Android SearchView setOnActionExpandListener 不起作用
Android SearchView setOnActionExpandListener doesn't work
我需要在我的 SearchView 是否折叠时进行拦截,以便更改我的 Activity 中的一些片段,即 AppCompatActivity。
我使用 MenuItemCompat.setOnActionExpandListener 方法创建了一个侦听器,但它似乎从未被调用过。
同样奇怪的是,在我的方法 onOptionsItemSelected 中,经过一些调试后,我检查仍然在这里我不能拦截任何东西。我尝试了关于这个问题的各种方法,但没有办法解决它。
这是我的代码:
menu_search_cat.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"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".CategoriesActivity">
<item android:id="@+id/search"
android:title="@string/search_title"
android:orderInCategory="1"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="always"
app:actionViewClass="android.widget.SearchView" />
类别Activity
import android.widget.SearchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_categories);
...
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_search_cat, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
searchView.setOnQueryTextListener(this);
MenuItem searchItem = menu.findItem(R.id.search);
MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
if (BuildConfig.DEBUG) {
Log.d(TAG, "onSearchViewExpand");
}
toggleDown();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_from_right, R.anim.slide_out_to_left);
SuggestionsFragment newFragment = SuggestionsFragment.newInstance(mBusiness);
ft.replace(R.id.category_container, newFragment, "suggestionsFragment");
ft.addToBackStack(null);
ft.commit();
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
if (BuildConfig.DEBUG) {
Log.d(TAG, "onSearchViewCollapse");
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_from_left, R.anim.slide_out_to_right);
MacroCategoriesFragment newFragment = new MacroCategoriesFragment();
ft.replace(R.id.category_container, newFragment, "macrocatFragment");
ft.commit();
return true;
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (BuildConfig.DEBUG) {
Log.d(TAG, "onOptionsItemSelected: "+item.toString());
}
// handle arrow click here
if (item.getItemId() == android.R.id.home) {
onBackPressed();
}
if (item.getItemId() == R.id.search) {
//never work here
}
return super.onOptionsItemSelected(item);
}
我解决了这个问题:只有当我的 MenuItem 的 ActionView 在我的菜单文件中也被标记为 collapseActionView 时,onActionExpandListener 才有效。于是我修改成这样:
<item
android:id="@+id/search"
android:title="@string/search_title"
android:orderInCategory="1"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.widget.SearchView" />
我需要在我的 SearchView 是否折叠时进行拦截,以便更改我的 Activity 中的一些片段,即 AppCompatActivity。 我使用 MenuItemCompat.setOnActionExpandListener 方法创建了一个侦听器,但它似乎从未被调用过。 同样奇怪的是,在我的方法 onOptionsItemSelected 中,经过一些调试后,我检查仍然在这里我不能拦截任何东西。我尝试了关于这个问题的各种方法,但没有办法解决它。 这是我的代码:
menu_search_cat.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"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".CategoriesActivity">
<item android:id="@+id/search"
android:title="@string/search_title"
android:orderInCategory="1"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="always"
app:actionViewClass="android.widget.SearchView" />
类别Activity
import android.widget.SearchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_categories);
...
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_search_cat, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
searchView.setOnQueryTextListener(this);
MenuItem searchItem = menu.findItem(R.id.search);
MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
if (BuildConfig.DEBUG) {
Log.d(TAG, "onSearchViewExpand");
}
toggleDown();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_from_right, R.anim.slide_out_to_left);
SuggestionsFragment newFragment = SuggestionsFragment.newInstance(mBusiness);
ft.replace(R.id.category_container, newFragment, "suggestionsFragment");
ft.addToBackStack(null);
ft.commit();
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
if (BuildConfig.DEBUG) {
Log.d(TAG, "onSearchViewCollapse");
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_from_left, R.anim.slide_out_to_right);
MacroCategoriesFragment newFragment = new MacroCategoriesFragment();
ft.replace(R.id.category_container, newFragment, "macrocatFragment");
ft.commit();
return true;
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (BuildConfig.DEBUG) {
Log.d(TAG, "onOptionsItemSelected: "+item.toString());
}
// handle arrow click here
if (item.getItemId() == android.R.id.home) {
onBackPressed();
}
if (item.getItemId() == R.id.search) {
//never work here
}
return super.onOptionsItemSelected(item);
}
我解决了这个问题:只有当我的 MenuItem 的 ActionView 在我的菜单文件中也被标记为 collapseActionView 时,onActionExpandListener 才有效。于是我修改成这样:
<item
android:id="@+id/search"
android:title="@string/search_title"
android:orderInCategory="1"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.widget.SearchView" />