用户定义的ActionBar操作视图:获得正确的宽度

Dam*_*ian 17 android android-actionbar

冰淇淋三明治:

我想通过标准的Action View机制向ActionBar 添加一个AutoCompleteTextView(因为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>
Run Code Online (Sandbox Code Playgroud)

这可行,但默认情况下它不会占用ActionBar中的可用空间,我想要这样做.

查看了SearchView源代码,看了它如何覆盖onMeasure,并为我自己的类做了同样的事情,我从AutoCompleteTextView派生.当我这样做时,AutoCompleteTextView消耗所有空间,没有空间用于我想要显示在其右侧的两个菜单项.

MeasureSpec.getMode()MeasureSpec.AT_MOST时,看起来MeasureSpec.getSize()返回的宽度没有考虑其他两个菜单项.

有人做过类似的事吗?有什么建议?

谢谢,达米安

ste*_*pic 13

我认为这可能会有所帮助:

使用自定义布局创建可折叠菜单项:

<?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>
Run Code Online (Sandbox Code Playgroud)

这是自定义布局:

<?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" />
Run Code Online (Sandbox Code Playgroud)

然后在你的活动中:

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;
        }
    });
Run Code Online (Sandbox Code Playgroud)


ink*_*nky 7

我无法得到Matthias的建议在代码中工作(也许我遗漏了一些东西),但是在我的Action View中向最顶层元素添加minWidth属性就可以了.

<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>
Run Code Online (Sandbox Code Playgroud)