Android ActionBar: сворачиваемый SearchView с кнопкой действия
Как построить ActionBar
с помощью разборного вида поиска с видимым элементом одного действия, когда расширяется вид поиска? Чтобы быть более наглядным, это то, что мне нужно:
Обратите внимание, что есть другие пункты меню, а android:uiOptions="splitActionBarWhenNarrow"
определяется в AndroidManifest.xml
.
Я попытался настроить макет элемента пользовательского поиска:
menu.xml
<item
android:id="@+id/menu_search"
android:actionLayout="@layout/actionbar_search"
android:icon="@drawable/action_search"
android:showAsAction="always|collapseActionView"
android:title="@string/search" />
actionbar_search.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="right"
android:orientation="horizontal" >
<com.actionbarsherlock.widget.SearchView
android:id="@+id/search_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:iconifiedByDefault="false"
android:queryHint="@string/search_hint" />
<ImageButton
android:id="@+id/add_item"
android:layout_width="wrap_content"
android:layout_height="match_parent"
style="@style/Widget.Sherlock.ActionButton"
android:src="@drawable/content_new"/>
</LinearLayout>
Но по умолчанию поиск по поиску принимает всю доступную ширину и кнопка не отображается. Я не знаю, как заставить SearchView
заполнить все свободное пространство между значком приложения и пунктом меню. Все, что я нашел, это свойство android:maxWidth
, но это только позволяет жестко закодированное измерение, и я ищу более гибкое решение. Я тоже не пробовал RelativeLayout
с android:layout_toRightOf="@id/search_view"
.
Ответы
Ответ 1
После рассмотрения предложений от комментариев многие поисковые запросы и тестирование помогли добиться желаемого эффекта. Я не горжусь этим решением, но оно работает, оно не слишком сложное и должно быть достаточно для этого случая.
В резюме, что я сделал:
- Размещено
SearchView
с пользовательской кнопкой "добавить элемент" в customView
от ActionBar
.
- Удалены
collapseActionView
и android:actionLayout
из элемента поиска в menu.xml
- Программно свернуть/развернуть
SearchView
.
Некоторый код, чтобы лучше понять, что я сделал. Возможно, это может быть полезно для кого-то.
menu.xml
<item
android:id="@+id/menu_search"
android:icon="@drawable/action_search"
android:showAsAction="always"
android:title="@string/search" />
// ... other menu items
actionbar_search.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="right"
android:orientation="horizontal">
<com.actionbarsherlock.widget.SearchView
android:id="@+id/search_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:iconifiedByDefault="false"
android:queryHint="@string/search_hint"
android:visibility="invisible" />
<ImageButton
android:id="@+id/add_item"
android:layout_width="wrap_content"
android:layout_height="match_parent"
style="@style/Widget.Sherlock.ActionButton"
android:src="@drawable/content_new"
android:title="@string/add_item" />
</LinearLayout>
MainActivity.java
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
actionBar.setCustomView(R.layout.actionbar_search);
actionBarCustomView = ab.getCustomView();
searchView = ((SearchView) actionBarCustomView.findViewById(R.id.search_view));
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
searchView.setVisibility(View.INVISIBLE);
return false;
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// ...
case R.id.menu_search:
if (searchView.getVisibility() == View.VISIBLE) {
searchView.setIconified(true);
searchView.setVisibility(View.INVISIBLE);
} else {
searchView.setMaxWidth(abCustomView.getWidth() - addButton.getWidth());
searchView.setVisibility(View.VISIBLE);
searchView.setIconified(false);
}
break;
// ...
}
return true;
}
@Override
public void onBackPressed() {
if (searchView.getVisibility() == View.VISIBLE) {
searchView.setIconified(true);
searchView.setVisibility(View.INVISIBLE);
return;
}
// ...
}
Ответ 2
Вы можете сделать это только с помощью yourmenu.xml.
Установите другой значок меню, чтобы он всегда показывался как действие.
Ваш файл menu.xml должен выглядеть так:
<item
android:id="@+id/menu_search"
android:actionLayout="@layout/actionbar_search"
android:icon="@drawable/action_search"
android:showAsAction="always|collapseActionView"
android:title="@string/search"
/>
<item
android:id="@+id/your_other_menu_id"
android:showAsAction="always"
android:icon="@android:drawable/your_other_menu_ic"
/>
Ответ 3
Просто вы можете сделать это, как это
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setIconified(true); //to be opened collapsed
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.action_search:
searchView.setIconified(false);// to Expand the SearchView when clicked
return true;
}
return false;
}
И в элементе поиска в menu.xml make
showAsAction = "всегда"
Примечание. Я использую android.support.v7.widget.SearchView, но в вашем случае это не имеет значения.
Ответ 4
Просто измените меню xml. префикс showaction к имени вашего приложения
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/menu_search"
android:actionLayout="@layout/actionbar_search"
android:icon="@drawable/action_search"
app:showAsAction="always|collapseActionView"
android:title="@string/search"
/>
</menu>