Определяемый пользователем ActionBar Action View: получение правильной ширины - PullRequest
17 голосов
/ 14 февраля 2012

On Ice Cream Sandwich:

Я хочу добавить AutoCompleteTextView к ActionBar через стандартный механизм Action View (потому что SearchView недоступен до ICS, и я также использую ActionBarSherlock ):

<item android:id="@+id/menu_search" android:actionViewClass="com.example.AutoCompleteActionView" android:showAsAction="ifRoom" android:title="@string/address"></item>
<item android:id="@+id/menu_close" android:icon="@drawable/ic_menu_close_clear_cancel" android:showAsAction="always"></item>
<item android:id="@+id/menu_ok" android:icon="@drawable/ic_menu_ok" android:showAsAction="always"></item>

Это работает, однакопо умолчанию он не использует доступное пространство в панели действий, которое мне бы хотелось.

Я посмотрел на источник для SearchView и увидел, как он переопределяет onMeasure и сделал то же самое для моего собственного класса, который я получил из AutoCompleteTextView.Когда я это делаю, AutoCompleteTextView потребляет все пространство , не оставляя места для двух пунктов меню, которые я хочу отобразить справа от него.

Выглядит так, как будто ширина, возвращенная из MeasureSpec.getSize () не учитывает два других элемента меню, когда MeasureSpec.getMode () равно MeasureSpec.AT_MOST .

Кто-нибудь делал что-нибудь подобное?Есть предложения?

Спасибо, Дамиан

Ответы [ 5 ]

13 голосов
/ 15 апреля 2012

Я думаю, что это может помочь:

Создание разборного пункта меню с пользовательским макетом:

<?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
  <item
    android:id="@+id/menuSearch"
    android:showAsAction="always|collapseActionView" android:icon="@drawable/action_search" android:actionLayout="@layout/collapsible_absearch">
  </item>
</menu>

Это пользовательский макет:

<?xml version="1.0" encoding="utf-8"?>
 <AutoCompleteTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ab_Search"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search" />

Тогда в вашей деятельности:

public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.activitymenu, menu);

    MenuItem menuItem=menu.findItem(R.id.menuSearch);

    menuItem.setOnActionExpandListener(new OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            mAbSearch=(AutoCompleteTextView) item.getActionView().findViewById(R.id.ab_Search);

            // Set your adapter and do whatever you want

            return true;
        }
    });
7 голосов
/ 10 июля 2012

Мне не удалось получить предложение Матиаса работать в коде (возможно, я что-то упустил), но добавление атрибута minWidth к самому верхнему элементу в моем Action View помогло.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="64dip"
    android:minWidth="64dip"
    android:layout_height="match_parent"
    android:gravity="center" >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"        
        android:layout_gravity="center"
        android:id="@+id/imageViewAnimatedProgressSpinner"
        android:background="@drawable/animated_progress_spinner" />

</FrameLayout>
3 голосов
/ 22 июля 2012

Вам это поможет?:

    ActionBar.LayoutParams layoutParams = new LayoutParams(android.app.ActionBar.LayoutParams.MATCH_PARENT, android.app.ActionBar.LayoutParams.MATCH_PARENT);
    View customNav = LayoutInflater.from(getSupportActionBar().getThemedContext()).inflate(R.layout.your_layout, null);
    getSupportActionBar().setCustomView(customNav, layoutParams);
    getSupportActionBar().setDisplayShowCustomEnabled(true);
2 голосов
/ 11 января 2014

может быть с опозданием на несколько световых лет, но если кто-то придет посмотреть, сделайте следующее на ваших видах действий, чтобы их стилизовали как значки на панели действий по умолчанию,

//Define a style which extends the themed action button in styles.xml, if you want you can use references to have dynamic styles.. this is an example for holo theme
<style name="ActionButtonStyle" parent="@android:style/Widget.Holo.ActionButton">

</style>

//For your action view, use this as the style, I find the issue with Progress bars and hence //the example,

<?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"
    style="@style/ActionButtonStyle" >

    <ProgressBar
        android:id="@+id/progressBar2"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ProgressBar>

</LinearLayout>
1 голос
/ 01 марта 2015
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="wrap_content"
                android:layout_height="match_parent">
    <EditText xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:id="@+id/visibility_search_edit_text"/>
</RelativeLayout>

Кредит на этот пост: Установите ширину ActionView для Android ActionBar в соответствии с шириной ActionBar .Это заставит его растянуться.

...