ActionBar是Android的窗口功能,可识别应用程序和用户位置,并提供用户操作和导航模式。
使用parent="@android:style/Widget.Holo.Light.ActionBar"带来深色ActionBar
这是我当前的样式文件,因为我想要一个带有浅色 ActionBar 的深色主题。 <item name="android:actionBarStyle">@...</desc> <question vote="2"> <p>这是我当前的样式文件,因为我想要一个带有浅色 ActionBar 的深色主题。</p> <pre><code><style name="AppBaseTheme" parent="@android:Theme.Holo"> <item name="android:actionBarStyle">@style/MyActionBar</item> </style> <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:background">#FF00FF</item> </style> </code></pre> <p>工作正常,因为我的 ActionBar 作为粉红色背景(不在屏幕截图中共享,因为它太混乱了)。</p> <p>但是,不幸的是,尽管我使用了:Widget.Holo.<strong>Light</strong>.ActionBar,我的ActionBar仍然是深色主题:</p> <p><img src="https://cdn.imgupio.com/i/AWkuc3RhY2suaW1ndXIuY29tL0d5THZGLnBuZw==" alt="enter image description here"/></p> <p>如何在我的深色主题上强制使用 Light ActionBar?</p> </question> <answer tick="false" vote="0"> <p>这可能对你有帮助:</p> <pre><code><style name="AppTheme" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/AppTheme.ActionBar</item> <item name="android:textAllCaps">false</item> </style> <style name="AppTheme.ActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:background">@drawable/actionbar_background</item> <item name="android:titleTextStyle">@style/AppTheme.ActionBar.Text</item> <item name="android:textColor">@color/white</item> </style> </code></pre> <p>在<pre><code><item name="android:background">@drawable/actionbar_background</item></code></pre>中,如果你想要渐变,你可以声明drawable xml,或者你可以直接在这里声明颜色值。</p> </answer> </body></html>
我需要知道 ActionBar 的确切大小(以像素为单位),以便应用正确的背景图像。
我正在尝试通过工具栏使用 Android Jetpack 设置指南。指南说根标签是 ,所以我不能在 xml 中包含工具栏。我正在使用 NoAct...
如何在片段中使用 MenuProvider 设置 NavigationUI?
我有一个与导航主机有关的活动,它使用 NavigationUI 处理导航。 在我的片段中,我有 optionsMenu 并且 setHasOptionsMenu(true) 已被弃用,而不是我使用
如何在删除徽标和设置标题时防止操作栏闪烁 程序化地 下面是我的 MainActivity.java 中的代码。这改变了动作 酒吧。但它首先显示...
我想在我的应用程序中使用 ActionBar,最小 sdk 设置为 7。我必须导入 android.support.v7.*; .但是当我导入我的应用程序时,在放置支持库之后,我看到了 v4 而不是 v7。我有下...
我同时实现了一个 DrawerNavigationView 和一个 BottomNavigationView,但问题是 ActionBar ......默认片段可以在这里输入图像描述但是改变片段它
我有一个包含两个片段的片段活动。当我在 Fragment 活动中通过 .setLogo(R.id.drawable) 函数设置徽标时,会出现徽标,但问题如下 当我创造了一个新的行为...
我试图通过单击 ActionBar(工具栏)中的汉堡包按钮打开 NavigationView。但是我已经卡在显示这个汉堡包图标的阶段了,因为谷歌
我正在使用本教程来实现 facebook 登录等。 Facebook登入 我在其中添加了新片段以显示朋友列表。现在,当我在新添加的片段上按下后退按钮时,它需要...
我想在没有自定义视图帮助的情况下将操作栏标题对齐到中心。我将不胜感激任何帮助。 不使用自定义视图,只修改默认操作栏标题
我尝试创建一个新的 Android 应用程序,并尝试使用行 requestWindowFeature(Window.FEATURE_NO_TITLE); 在 MainActivity 的构造函数中隐藏操作栏; 我以前做过...
背景 我在操作栏(实际上是工具栏)中有一个菜单项,单击该菜单项会显示可供选择的项目列表,类似于单选按钮: 背景 我在操作栏(实际上是工具栏)中有一个菜单项,单击该菜单项会显示可供选择的项目列表,类似于单选按钮: <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:icon="@drawable/..." android:title="@string/..." app:showAsAction="always"> <menu> <group android:id="@+id/..." android:checkableBehavior="single"> <item .../> <item .../> <item .../> </group> </menu> </item> </menu> 我需要在这个项目列表下面放一个项目,它和列表之间会有一个分隔线。类似于材料设计指南显示的内容(取自here): 编辑:这是我想做的草图: 问题 我找不到办法去做。 我试过的 我找到的唯一可能的解决方案是: 改变活动的主题(这里),但这也会影响活动的其他菜单项 方法在菜单项出现在操作栏上时在它们之间放置分隔线,但此处它们不会出现在工具栏本身上。它们出现在所选项目的弹出菜单上。 我试过在list和extra item之间放fake items,也试过放group,空group甚至各种属性都试过 遗憾的是没有任何效果。 问题 如何在操作项的弹出菜单的特定项之间添加分隔线? 也许我需要在单击操作项时创建自定义弹出菜单(如这里)?如果是这样,我如何在特定项目之间放置分隔线? 也许使用微调器作为行动项目? 你应该使用动作布局 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".LandingActivity"> <item android:id="@+id/action_cart" android:title="cart" android:actionLayout="@layout/cart_update_count" android:icon="@drawable/shape_notification" app:showAsAction="always"/> </menu> 然后动作布局可以有带分隔线的文本视图。 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical"> <View android:id="@+id/divider" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/divider"/> <TextView android:id="@android:id/text" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/selectableItemBackground" android:gravity="center_vertical" android:textAppearance="?attr/textAppearanceListItemSmall"/> </LinearLayout> 然后你可以在代码中添加点击监听器 从 SDK 版本 28 开始,您可以使用 menu.setGroupDividerEnabled(boolean)。如果您使用 ContextMenu 这仅在 SDK 28+ 上受支持,但是 MenuCompat 在 onCreateOptionsMenu() 中使用时提供向后兼容性。 这将在每个不同的groupId的动作之间添加一个分隔符,如下所示0和1: menu.add(0, getAdapterPosition(), action1, R.string.action1); menu.add(1, getAdapterPosition(), action2, R.string.action2); menu.setGroupDividerEnabled(true); // Or for MenuCompat < SDK 28: MenuCompat.setGroupDividerEnabled(menu, true); 文档在这里:https://developer.android.com/reference/android/view/Menu#setGroupDividerEnabled(boolean) 编辑:提问者要求的示例代码: 这是我目前在我的应用程序中使用的代码,位于 RecyclerView 适配器中。它也应该与您的菜单实现一起使用。由于您通过 XML 定义菜单,因此只要您引用菜单资源,下面的内容也适用于您。结果如下: Override onCreateContextMenu 或您菜单的相关onCreate.. 方法,如下所示: @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { menu.setHeaderTitle(getStr(R.string.actions_title)); // Groups 0 and 1, first parameter for menu.add() menu.add(0, getAdapterPosition(), 0, R.string.homescreen); menu.add(0, getAdapterPosition(), 1, R.string.lockscreen); menu.add(0, getAdapterPosition(), 2, R.string.wpLocation_both); menu.add(1, getAdapterPosition(), 3, R.string.action_download); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { menu.setGroupDividerEnabled(true); // This adds the divider between groups 0 and 1, but only supported on Android 9.0 and up. } } 好的,我找到了一个很好的解决方法,但我不确定样式应该是这样的。这就是我所缺少的: 项目的背景位于微调器弹出窗口的背景之上,我不确定这是否是正确的放置方式。 我将支持库的白色背景用于微调器的弹出窗口。我认为应该有更好的方法让它变白。 我需要知道分隔线的正确样式是什么。现在我用了一个简单的 操作栏项目样式丢失。我只是用了一个简单的ImageView,我觉得应该不一样吧 出于某种原因,在某些 Android 版本(可能是 Lollipop 及更低版本)上,项目的背景看起来是黑色而不是白色。 微调器有时可能会遇到 setOnItemSelectedListener 问题,不确定何时。 主要活动 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); final MenuItem item = menu.findItem(R.id.action_settings); final Spinner spinner = ((Spinner) MenuItemCompat.getActionView(item)); SimpleImageArrayAdapter adapter = new SimpleImageArrayAdapter(this); spinner.setAdapter(adapter); return true; } public class SimpleImageArrayAdapter extends ArrayAdapter<String> { private final String[] items = {"item 1", "item 2", "item 3", "extra item"}; public SimpleImageArrayAdapter(Context context) { super(context, 0); } @Override public int getCount() { return items.length; } @Override public String getItem(final int position) { return items[position]; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { View rootView = convertView == null ? LayoutInflater.from(getContext()).inflate(R.layout.spinner_item, parent, false) : convertView; TextView tv = (TextView) rootView.findViewById(android.R.id.text1); tv.setTextColor(0xff000000); tv.setText(items[position]); boolean isLastItem = position == getCount() - 1; rootView.findViewById(R.id.action_divider).setVisibility(isLastItem ? View.VISIBLE : View.GONE); rootView.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); return rootView; } @Override public View getView(int position, View convertView, ViewGroup parent) { //this is the view that's shown for the spinner when it's closed ImageView iv = new ImageView(getContext()); iv.setImageResource(android.R.drawable.ic_menu_add); int viewSize = getDimensionFromAttribute(MainActivity.this, android.support.v7.appcompat.R.attr.actionBarSize); iv.setLayoutParams(new ViewGroup.LayoutParams(viewSize, viewSize)); iv.setScaleType(ScaleType.CENTER_INSIDE); iv.setBackgroundResource(getResIdFromAttribute(MainActivity.this, R.attr.selectableItemBackground)); return iv; } } public static int getResIdFromAttribute(final Activity activity, final int attr) { if (attr == 0) return 0; final TypedValue typedValue = new TypedValue(); activity.getTheme().resolveAttribute(attr, typedValue, true); return typedValue.resourceId; } public static int getDimensionFromAttribute(final Context context, final int attr) { final TypedValue typedValue = new TypedValue(); if (context.getTheme().resolveAttribute(attr, typedValue, true)) return TypedValue.complexToDimensionPixelSize(typedValue.data, context.getResources().getDisplayMetrics()); return 0; } res/menu/menu_main.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.user.myapplication.MainActivity"> <item android:id="@+id/action_settings" android:actionLayout="@layout/spinner" android:title="" app:actionLayout="@layout/spinner" app:showAsAction="always" /> </menu> res/layout/spinner_item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/action_divider" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/divider"/> <TextView android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/selectableItemBackground" android:gravity="center_vertical" android:minHeight="?attr/listPreferredItemHeightSmall" android:paddingEnd="?attr/listPreferredItemPaddingRight" android:paddingLeft="?attr/listPreferredItemPaddingLeft" android:paddingRight="?attr/listPreferredItemPaddingRight" android:paddingStart="?attr/listPreferredItemPaddingLeft" android:textAppearance="?attr/textAppearanceListItemSmall"/> </LinearLayout> res/layout/spinner.xml <?xml version="1.0" encoding="utf-8"?> <Spinner android:id="@+id/spinner" style="@style/SpinnerWithoutArrow" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" /> res/values/styles.xml <style name="SpinnerWithoutArrow" parent="@style/Widget.AppCompat.Spinner"> <item name="android:background">@null</item> <item name="android:popupBackground">@drawable/abc_popup_background_mtrl_mult</item> </style> res/drawable/divider.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:height="1dp"/> <solid android:color="#FFff0000" /> </shape> 这可以通过使用弹出窗口和列表视图来完成。在您的列表视图中,您可以有不同的视图类型,例如菜单项和分隔线。 我列出弹出窗口部分的代码: LayoutInflater inflater = LayoutInflater.from(context); View view = inflater.inflate(R.layout.option_menu, null); ListView listView = (ListView) view.findViewById(R.id.listView); listView.setDivider(null); mAdapter = new OptionListAdapter(context, options); listView.setAdapter(mAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //TODO: The code when item is clicked. } }); mPopupWindow = new PopupWindow(context, null, R.attr.popupMenuStyle); mPopupWindow.setFocusable(true); // otherwise on android 4.1.x the onItemClickListener won't work. mPopupWindow.setContentView(view); mPopupWindow.setOutsideTouchable(true); int height = 0; int width = 0; float density = context.getResources().getDisplayMetrics().density; int minWidth = Math.round(196 * density); // min width 196dip, from abc_popup_menu_item_layout.xml int cellHeight = context.getResources().getDimensionPixelOffset(R.dimen.option_height); int dividerHeight = context.getResources().getDimensionPixelOffset(R.dimen.divider_height); final int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); final int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); for (int i = 0; i < mAdapter.getCount(); i++) { Object item = mAdapter.getItem(i); if (item != null) { View childView = mAdapter.getView(i, null, listView); childView.measure(widthMeasureSpec, heightMeasureSpec); height += cellHeight; width = Math.max(width, childView.getMeasuredWidth()); } else { height += dividerHeight; // divider } } width = Math.max(minWidth, width); Drawable background = mPopupWindow.getBackground(); // 9-pitch images if (background != null) { Rect padding = new Rect(); background.getPadding(padding); height += padding.top + padding.bottom; width += padding.left + padding.right; } mPopupWindow.setWidth(width); mPopupWindow.setHeight(height); mPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); 然后您可以使用以下方法显示弹出窗口: PopupWindowCompat.showAsDropDown(mPopupWindow, parent, x, y, gravity); 在列表视图的适配器中,您可以覆盖 getViewTypeCount() 和 getItemViewType() 以支持菜单项布局和分隔线布局,也可以添加您需要的任何视图类型。 这是我的应用程序中的快照: 在Material3 Design、MDC-Android中,制作各组菜单项,调用setGroupDividerEnabled(Boolean). 分隔符将插入组或菜单项之间。 MyActivity.kt private val binding by lazy { ActivityMyBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) // other initializations.. // ... binding.toolbar.menu.setGroupDividerEnabled(true) } activity_my.xml <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <com.google.android.material.appbar.MaterialToolbar <!-- Other properties --> android:id="@+id/toolbar" app:menu="@menu/main" /> </com.google.android.material.appbar.AppBarLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout> menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/item0" android:title="item0" app:showAsAction="never" /> <item android:id="@+id/item1" android:title="item1" app:showAsAction="never" /> <group android:id="@+id/group0"> <item android:id="@+id/item2" android:title="group0 item2" app:showAsAction="never" /> </group> <group android:id="@+id/group1"> <item android:id="@+id/item3" android:title="group1 item3" app:showAsAction="never" /> <item android:id="@+id/item4" android:title="group1 item4" app:showAsAction="never" /> </group> </menu> 我是这样做的: 参考截图: style.xml: <style name="popup" parent="Widget.AppCompat.ListView.DropDown"> <item name="android:divider">@color/colorPrimary</item> <item name="android:dividerHeight">1dp</item> <item name="android:textColor">@color/colorPrimary</item> <item name="android:itemBackground">@android:color/white</item> </style> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!--- Customize popmenu --> <item name="android:dropDownListViewStyle">@style/popup</item> </style> Java代码: private void showPopup(View v) { Context wrapper = new ContextThemeWrapper(this, R.style.popup); PopupMenu mypopupmenu = new PopupMenu(wrapper, v); MenuInflater inflater = mypopupmenu.getMenuInflater(); inflater.inflate(R.menu.menu_patient_language, mypopupmenu.getMenu()); mypopupmenu.show(); mypopupmenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { txtPreferredLanguage.setText(item.getTitle().toString()); switch (item.getItemId()) { case R.id.menuEnglish: // Your code goes here break; case R.id.menuFrench: // Your code goes here break; } return false; } }); } 希望这对你有帮助。 对我有用的超级简单的解决方案: 为背景定义一个drawable: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@android:color/white"/> <stroke android:width="3dp" android:color="@color/colorPrimary"/> </shape> 然后在样式中使用背景: <style name="bluetooth_popup" parent="@android:style/Widget.DeviceDefault.Light.PopupMenu"> <item name="android:textColor">@color/colorPrimary</item> <item name="android:textStyle">bold</item> <item name="android:textAllCaps">true</item> <item name="android:background">@android:color/transparent</item> <item name="android:itemBackground">@drawable/bluetooth_popup_buttons</item> 现在: group1[ item0 item1 item2 ] group1[item3]; 改为: group1[ item0 item1] group1[item2 item3] 组有一个divider; 喜欢那组可以在divder之间加一个item; 如果divider不可用,试试background; 我从不使用menu; 这是我的猜测;
使用Holo主题的API级别> 14,我在ActionBar的图标上找回了众所周知的左边距外观,如下所示。 ...</root>
我有一个功能,我需要一个菜单项在SearchView展开时出现,在SearchView关闭时消失。我把展开时的菜单项设置为false,这使得 ...
我想用两种方式使用一个活动,它显示了一个可以编辑的项目列表,添加新的项目等,它显示了项目列表,以便选择一个。由于活动的主要逻辑是......。
我是安卓开发的新手,在锻炼中不断学习。所以,我正在开发一个带有导航抽屉的应用程序,其中有菜单按钮。此外,我想添加返回(箭头)按钮......
我试图使用下面的菜单在工具栏中显示一些图标,但在输出中没有显示图标,而只是显示文本。如何显示图标而不是文本menu.xml。
是的,我知道网上有很多类似的问题和答案。在过去的三个小时里,我检查了所有的问题和答案。没有任何解决方案对我有效。我只是启动了一个Android Studio(v1.0.2) ...