【问题标题】:How to set expanded ActionView's width in SupportActionBar to fill the available space如何在 SupportActionBar 中设置展开的 ActionView 的宽度以填充可用空间
【发布时间】:2018-02-12 10:22:52
【问题描述】:

我尝试使用actionView 设置一个MenuItem,如here 所述。

在我的例子中,ActionView 小部件是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;
    }
}

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,比如线性、相对或框架布局,或者尝试设置我的 SeekBar 的固定宽度但没有任何成功。

我在这里遗漏了什么或做错了什么?

【问题讨论】:

  • 如果你想要一个 seekBar 作为菜单项。那么您应该将其添加为工具栏内的视图。 MenuItem 具有特定的大小。
  • 你能再详细一点吗?你是什​​么意思“将它添加到工具栏中”?这是否意味着我必须自己处理显示/隐藏 SeekBar 并且不能使用 ActionBar/actionView 的内置机制?为什么这对文档中的support.SearchView 有效
  • SearchView 也是一个菜单项。我认为当它展开时,其他视图是可见的,即搜索编辑文本。
  • SearchView 扩展 LinearLayout 并在文档中默认使用 iconified 来说明问题...... developer.android.com/reference/android/widget/SearchView.html 我想这就是我需要的属性
  • 已经回答here

标签: android android-layout android-actionbar


【解决方案1】:

添加 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。您应该能够看到跨越toolbarseekbar

在您的活动中,只需膨胀菜单,它就会缩小它的大小。 它对我有用,希望带有菜单项的搜索栏也对你有用。

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

【讨论】:

  • shure,我的工具栏中有一个搜索栏,但如果我通过onCreateOptionsMenu 添加项目,它不会显示,因为搜索栏占用了所有空间。我希望作为 actionView 的搜索栏出现在 MenuItem 点击
  • 你说的也是可以的。我会尝试并更新代码。
  • @RafaelT 嘿,这是你要问的吗?
  • 不,不是。 1. 我明确要求actionView,如我在问题顶部链接的文档中所述。 2.您提供的代码似乎是在其他地方复制的,不能解决问题,甚至不是 java (kotlin?)
  • 在此版本中,Android 引入了一个新的工具栏小部件。这是 Action Bar 模式的概括,它为您提供了更多的控制和灵活性。工具栏是您的层次结构中的一个视图,就像任何其他视图一样,可以更轻松地与您的其余视图交错、对其进行动画处理以及对滚动事件做出反应。您还可以将其设置为 Activity 的操作栏,这意味着您的标准选项菜单操作将显示在其上。
【解决方案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() {

    }
}

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

还要确保使用适当的CollapsibleActionView

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

如果您有android.widget.Toolbar,请使用android.view.CollapsibleActionView

【讨论】:

  • 抱歉,我试过了,但onActionViewExpanded 永远不会被调用!因此,我得到相同的结果
  • 你知道重写 ActionView 的 LayoutParams 的可能原因吗?这会阻止其他事情吗?
  • 原因是菜单项插入的ActionView没有父视图(getParent() = null)。 Here is the the corresponding code.
  • 我明白了,但 generateDefaultLayoutParams() 不应该返回 height=WRAP_CONTENT 和 width=MATCH_PARENT 而不是 WRAP_CONTENT 两次?
  • 谷歌工程师肯定可以解释原因:)
猜你喜欢
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 2010-11-18
  • 2011-06-27
  • 2020-05-22
相关资源
最近更新 更多