我尝试按照here所述设置一个actionView
的MenuItem。
在我的情况下,ActionView
小部件是SeekBar。
问题是,当图标点击显示ActionView
时,其宽度比预期的要小,如下面的屏幕截图所示:
文档说:
如果小部件位于应用栏上,则应用应将小部件显示为 一个图标。如果窗口小部件位于溢出菜单中,则应显示该应用程序 小部件作为菜单项。 当用户与操作进行交互时 视图,它会扩展以填充应用栏。
就我而言,没有任何东西可以“扩展”。而不是占据ActionBar
的整个宽度,而不是它。
要修复它,我尝试使用另一个像EditText
的视图,但得到了类似的结果。 (EditText在开始时很小,但在写入时会扩展)。
它似乎适用于文档中使用的android.support.v7.widget.SearchView
。
我还尝试使用Theme.AppCompat.Light.DarkActionBar
或Theme.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的固定宽度而没有任何成功。
我在这里错过了什么或做错了什么?
答案 0 :(得分:3)
添加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
跨越。
在您的活动中,只需对菜单进行充气即可。 它适用于我,希望带有菜单项的搜索栏也适合你。
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