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

时间:2018-02-12 10:22:53

标签: android android-layout android-actionbar

我尝试按照here所述设置一个actionView的MenuItem。

在我的情况下,ActionView小部件是SeekBar

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

enter image description here

enter image description here

文档说:

  

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

就我而言,没有任何东西可以“扩展”。而不是占据ActionBar的整个宽度,而不是它。

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

我还尝试使用Theme.AppCompat.Light.DarkActionBarTheme.AppCompat.Light.NoActionBar在布局中提供工具栏,但没有任何明显的差异。

以下是我使用的代码:

MainActivity

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;
    }
}

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>

我还尝试了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"
/>

我在其中尝试了不同版本的ViewGroups,如Linear,Relative或FrameLayouts,或尝试设置我的SeekBar的固定宽度而没有任何成功。

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

2 个答案:

答案 0 :(得分:3)

enter image description here

添加Seekbar作为菜单项,将占用默认menu item的大小。 如果您需要Seekbar扩展appbar,那么您可以创建自己的Toolbar并添加SeekBar这样的内容。

<youtLayoutRoot>
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:titleTextColor="@color/white" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1">
        <SeekBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:max="100"
            android:progress="10"/>
    </LinearLayout>
</android.support.v7.widget.Toolbar>
<!-- your content layout here -->
</youtLayoutRoot>

activity的主题设为Theme.AppCompat.Light.NoActionBar并运行application。您应该可以在seekbar上看到toolbar跨越。

在您的活动中,只需对菜单进行充气即可。 它适用于我,希望带有菜单项的搜索栏也适合你。

enter image description here

toolbar.inflateMenu(R.menu.menu_delete)
    toolbar.setNavigationIcon(R.drawable.vector_back)
    toolbar.setNavigationOnClickListener {
        onBackPressed()
    }
    toolbar.setOnMenuItemClickListener { menuItem ->
        when (menuItem.itemId) {
            R.id.delete -> {
                deleteCall()
                true
            }
            else -> {
                false
            }
        }
    }

答案 1 :(得分:1)

“魔法”发生在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() {

    }
}

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

还要确保使用适当的CollapsibleActionView

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

如果您使用android.widget.Toolbar android.view.CollapsibleActionView