Центрировать SearchView на панели действий

Как я могу центрировать ActionView (в частности, SearchView) внутри панели действий?

Как показано в приложении Google Книги:

SearchView приложения Google Книги

Мои текущие настройки макета (search_layout.xml):

<?xml version="1.0" encoding="utf-8"?>
<SearchView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:queryHint="@string/search_hint" />

XML-файл моей панели действий (menu.xml):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:icon="@+android:drawable/ic_menu_search"
        android:title="@string/search"
        android:showAsAction="always|collapseActionView"
        android:id="@+id/searchMenuItem"
        android:actionLayout="@layout/search_layout" />
</menu>

Есть ли способ имитировать поведение SearchView Книг?


person Whymarrh    schedule 07.12.2012    source источник
comment
Вы пробовали android:layout_gravity=center_horizontal?   -  person MillyMonster    schedule 07.12.2012
comment
Хм странно. Какой макет вы используете?   -  person MillyMonster    schedule 07.12.2012
comment
попробуйте этот android:layout_centerHorizontal=true   -  person Usman Kurd    schedule 07.12.2012
comment
Вы можете попробовать, если установка ActionBar.LayoutParams для SearchView в коде работает для вас: stackoverflow.com/a/20146626/56285   -  person Jonik    schedule 22.11.2013


Ответы (2)


Насколько я могу судить, View с центром в ActionBar не может быть достигнуто с Action Items в xml menu. Однако это можно реализовать, установив пользовательский макет в файл ActionBar. Основной пример:

An Activity:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActionBar actionBar = getActionBar();
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setCustomView(R.layout.actionbar_layout);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

где actionbar_layout это:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <SearchView
        android:id="@+id/mySearchView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:iconifiedByDefault="false" />
</RelativeLayout>

создает это на 7-дюймовом планшете:

введите здесь описание изображения

Обратите внимание, что для атрибута iconifiedByDefault установлено значение false на SearchView, что заставляет его отображаться развернутым, а не просто значком. Для этого может потребоваться, чтобы вы скрыли программную клавиатуру программно, иначе она будет запущена открытой, когда Активность начинается.

person onosendai    schedule 12.12.2012
comment
Я знаю, что это не видно из изображения, которое у меня есть в вопросе, но SearchView в приложении «Книги» по умолчанию обозначается значком, а затем центрируется на панели действий при расширении. Это выполнимо с пользовательским представлением? - person Whymarrh; 14.12.2012
comment
С макетом в моем ответе, если вы начнете с iconifiedByDefault=true, а затем коснетесь значка, он будет центрирован на панели действий. Но я не знаю, где бы вы хотели, чтобы была начальная позиция нераскрытого значка. Попробуйте этот пример, установите для iconifiedByDefault значение true и посмотрите, хотите ли вы этого. Если нет, и если, например, вы хотите, чтобы значок в крайнем правом углу начинался с, а затем перемещался по центру при щелчке по мере его расширения, вам придется прослушивать событие щелчка и динамически устанавливать параметры макета пользовательского макета из alignParentRight в центр в родительском. - person onosendai; 14.12.2012

Посмотрите здесь. Вы можете просто использовать атрибут android:actionViewClass="android.widget.SearchView", и это должно работать нормально (имейте в виду, что вы можете получить ссылку на searchView в Java и изменить там подсказку, если это то, что вы хотите ).

person Tas Morf    schedule 13.12.2012