如何在SupportActionBar中设置扩展的ActionView宽度以填充可用空间

Raf*_*l T 8 android android-layout android-actionbar

我尝试使用此处actionView描述的设置MenuItem .

在我的例子中,ActionViewWidget是一个SeekBar.

问题是,当ActionView点击图标时,它的宽度比预期的要小,如下面的截图所示:

在此输入图像描述

在此输入图像描述

文档说:

如果小部件位于应用栏上,则应用应将小部件显示为图标.如果窗口小部件位于溢出菜单中,则应用程序应将窗口小部件显示为菜单项.当用户与操作视图交互时,它会展开以填充应用栏.

就我而言,没有任何东西可以"扩展".它没有占据整个宽度,而是ActionBar微小的.

为了解决这个问题,我尝试使用另一个类似的视图EditText,但得到了类似的结果 (EditText在开始时很小,但在写入时会扩展).它似乎android.support.v7.widget.SearchView适用于文档中使用的.

我也尝试过Theme.AppCompat.Light.DarkActionBarTheme.AppCompat.Light.NoActionBar在布局中提供工具栏而没有任何明显的区别.

这是我使用的代码:

主要活动

public class MainActivity extends AppCompatActivity {

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

        /* set this on other layout with toolbar in it
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        */
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.camera_menu, menu);
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

app_menu.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">
    <item
        android:id="@+id/action_item"
        android:title="Action"
        android:icon="@drawable/ic_icon_in_black_24dp"
        app:showAsAction="ifRoom|collapseActionView"
        app:actionViewClass="android.widget.SeekBar"
        />
</menu>
Run Code Online (Sandbox Code Playgroud)

我也试过app:actionViewLayout=@layout/seekbar_layout而不是actionViewClass seekbarLayout就是这样的

<?xml version="1.0" encoding="utf-8"?>

<SeekBar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/action_seekbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
/>
Run Code Online (Sandbox Code Playgroud)

我也试过不同的版本,ViewGroups比如Linear,Relative或FrameLayouts,或试图设置我的SeekBar的固定宽度而没有任何成功.

我在这里错过了什么或做错了什么?

art*_*nig 2

“魔法”发生在Toolbar.expandItemActionView。此方法覆盖展开的布局参数ActionView并将宽度设置为wrap_content。现在提出一种可能的解决方案:

Toolbar.expandItemActionView检查是否ActionView实现CollapsibleActionView接口并调用CollapsibleActionView.onActionViewExpanded方法(如果是)。这是您修复布局参数并将宽度设置为 的机会match_parent。从 派生一个自定义类SeekBar并让它实现CollapsibleActionView

public class CollapsibleSeekBar extends AppCompatSeekBar implements CollapsibleActionView {
    public CollapsibleSeekBar(Context context) {
        super(context);
    }

    public CollapsibleSeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CollapsibleSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void onActionViewExpanded() {
        ViewGroup.LayoutParams params = getLayoutParams();
        params.width = ViewGroup.LayoutParams.MATCH_PARENT;
        setLayoutParams(params);
        requestLayout();
    }

    @Override
    public void onActionViewCollapsed() {

    }
}
Run Code Online (Sandbox Code Playgroud)

通过在您的菜单项中使用它app:actionViewClass

还要确保使用适当的CollapsibleActionView.

如果您正在使用,android.support.v4.widget.Toolbar您还需要android.support.v7.view.CollapsibleActionView.

如果你有用android.widget.Toolbar的 话android.view.CollapsibleActionView