- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有办法在不更改“正常”ActionBar 图标的情况下更改 ActionMode 溢出图标?
最佳答案
I still need to figure out how to only change the Overflow-Icon inside of the ActionMode-Actionbar as I changed my Overflow-Icon in the default-Actionbar which is not visible in the ActionMode-Actionbar (and no, I don't want to change the background of my ActionMode-Actionbar!)
好的。
让我们从定义一些样式开始。我将尝试解释为什么我们以这种方式定义它们:
// This is just your base theme. It will probably include a lot more stuff.
// We are going to define the style 'OverflowActionBar' next.
<style name="BaseTheme" parent="android:Theme.Holo.Light">
....
....
....
<item name="android:actionOverflowButtonStyle">@style/OverflowActionBar</item>
</style>
// Assigning a parent to this style is important - we will inherit two attributes -
// the background (state-selector) and the content description
<style name="OverflowActionBar" parent="@android:style/Widget.Holo.ActionButton.Overflow">
<item name="android:src">@drawable/overflow_menu_light</item>
</style>
// Next up is an extension to our 'BaseTheme'. Notice the parent here.
<style name="ChangeOverflowToDark" parent="@style/BaseTheme">
<item name="android:actionOverflowButtonStyle">@style/OverflowActionMode</item>
</style>
// One last thing is to define 'OverflowActionMode'. Again, we inherit useful
// attributes by assigning 'Widget.Holo.ActionButton.Overflow' as the parent.
<style name="OverflowActionMode" parent="@android:style/Widget.Holo.ActionButton.Overflow">
<item name="android:src">@drawable/overflow_menu_dark</item>
</style>
我们对 styles.xml
的所有工作都已完成。最后一点发生在运行时。我想您已经实现了 ActionMode.Callback
。
在您的 Activity 中,定义一个方法 - changeOverflowIcon()
:
public void changeOverflowIcon() {
getTheme().applyStyle(R.style.ChangeOverflowToDark, true);
}
您将从 ActionMode.Callback
实现的 onCreateActionMode(...)
调用此方法:
public class CustomActionModeCallback implements ActionMode.Callback {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
changeOverflowIcon()
// other initialization
return true;
}
@Override
public boolean onPrepareActionMode(final ActionMode mode, Menu menu) {
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {}
}
一些解释:
'BaseTheme' 中的分配用于 ActionBar
。它将选择可绘制对象 overflow_menu_light
,因为我们将其分配到您应用的基本主题中。
getTheme().applyStyle(R.style.ChangeOverflowToDark, true)
第二个参数 true
强制当前主题用新属性覆盖旧属性。因为我们只在 ChangeOverflowToDark
中定义了一个属性,所以它的值被覆盖了。 ActionBar
不受影响,因为它已经使用了旧属性。但是, Action 模式尚未创建(它将在我们从 onCreateActionMode(...)
返回 true
时创建)。当 Action 模式检查此属性值时,它会获取新的值。
还有更多...
Manish 给出的答案非常棒。我从来没有想过使用内容描述来找到确切的 ImageButton
。 但是如果您可以使用简单的 findViewById()
找到 ImageButton
呢?
您可以这样做:
首先,我们需要唯一的 ID。如果您的项目当前没有 res/values/ids.xml
文件,请创建一个。给它添加一个新的 id:
<item type="id" name="my_custom_id" />
我上面讨论的设置将保持不变。唯一的区别在于 OverflowActionMode
样式:
<style name="OverflowActionMode" parent="@android:style/Widget.Holo.ActionButton.Overflow">
<item name="android:src">@drawable/overflow_menu_dark</item>
<item name="android:id">@id/my_custom_id</item>
</style>
当我们调用 getTheme().applyStyle(R.style.ChangeOverflowToDark, true);
时,我们上面定义的 id 将被分配给 ImageButton
/em>
我将在这里借用 Manish 的回答中的代码 fragment :
private ActionMode.Callback mCallback = new ActionMode.Callback()
{
@Override
public boolean onPrepareActionMode( ActionMode mode, Menu menu )
{
mDecorView.postDelayed(new Runnable() {
@Override
public void run() {
ImageButton btn = (ImageButton) mDecorView.findViewById(R.id.my_custom_id);
// Update the image here.
btn.setImageResource(R.drawable.custom);
}
}, 500); // 500 ms is quite generous // I would say that 50 will work just fine
return true;
}
}
两全其美?
假设我们需要 R.drawable.overflow_menu_light
用于 ActionBar
和 R.drawable.overflow_menu_dark
用于 ActionMode
.
样式:
<style name="BaseTheme" parent="android:Theme.Holo.Light">
....
....
....
<item name="android:actionOverflowButtonStyle">@style/OverflowActionMode</item>
</style>
<style name="OverflowActionMode" parent="@android:style/Widget.Holo.ActionButton.Overflow">
<item name="android:src">@drawable/overflow_menu_dark</item>
<item name="android:id">@id/my_custom_id</item>
</style>
按照我们的样式定义,ActionBar
将选择 R.drawable.overflow_menu_dark
- 但我们不需要 light 版本吗ActionBar
?是的 - 我们将在 Activity 的 onPrepareOptionsMenu(Menu)
回调中分配它:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
ImageButton ib = (ImageButton)
getWindow().getDecorView()
.findViewById(R.id.my_custom_id);
if (ib != null)
ib.setImageResource(R.drawable.overflow_menu_light);
}
}, 50L);
return super.onPrepareOptionsMenu(menu);
}
我们在这里这样做是因为在 onPrepareOptionsMenu(Menu)
之前,不会创建 ImageButton
。
现在,我们不需要处理ActionMode
- 因为它会从主题中选择dark
drawable。
对于这篇巨大的帖子,我深表歉意。我真的希望它能有所帮助。
关于android - 更改 ActionMode 溢出图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22720799/
我想在 ActionMode 中添加一个下拉菜单,它看起来像 Android 官方 Gallery 应用程序中的下拉菜单,它允许您“选择所有”或“取消选择所有”图像。如下图所示: 我发现的唯一方法是通
我有一个列表 Activity ,用户可以在其中执行打开操作模式 A和 B .用户还可以打开操作模式 A然后B在它上面。 问题是当 Action 模式A显示并且操作模式 B 显示在其顶部,A当 B 时
我正在学习教程 11. Exercise: Using the contextual action mode 但是我有这个错误: mActionMode = Display.this.startAct
我正在使用“AppCompact”并实现“ActionMode.Callback”,我看到了 2 个具有相同覆盖方法的不同“ActionMode”。 “android.view.ActionMode”
我使用 startSupportActionMode(...) 在我的应用中启动 acion 模式。但是当我点击智能手机上的后退按钮时,操作模式被取消。 我发现了这个解决方案,但它对我不起作用。第二个
我在 ListView 中使用操作模式进行多选。我遇到的问题是,在模拟器上测试时,我指定为隐藏在我的操作模式菜单中的图标永远不会隐藏在溢出菜单中,尽管在预览中它是。我在这里使用 AppCompat 主
目前,操作模式工具栏显示在工具栏上方,将整个布局向下移动,我希望它显示在我当前工具栏的顶部。我尝试了 this post 中的所有解决方案和 this one : 我尝试使用带或不带 android:
在我的 Activity 中,我使用带有微调器而不是标题(在 xml 中定义)的 Toolbar(来自 appcompat)。该 Activity 不是 ActionBarActivity,因此我不将
我正在使用新的 android 支持库 21.0.2,当我调用 ActionMode 进行文本选择时,我得到了这个。 似乎标题 TextView 背景是透明的。 重新定义 ActionMode 的 t
我有启动 Action 模式的列表 fragment 。我正在使用 actionbarsherlock。但是当方向改变时,或者当我开始新的 Activity 时,上下文操作栏就会消失。有什么方法可以恢
我们如何更改 ActionMode 的布局或背景?有方法actionMode.getCustomView();但总是返回 null 。有什么建议吗? 最佳答案 您可以通过带有此属性的 styles.x
哎呀。当我将我的应用程序升级到 L 时,我用工具栏替换了 ActionBars,现在每当我启动 ActionMode 时,它都会下推所有内容。 (我想这是因为再次显示 ActionBar 是为了显
除了传统的 android 之外,我正在尝试将 android.view.ActionMode 与新的 android.support.v7.widget.Toolbar 一起使用.app.Actio
我为 ActionMode 编写了一个自定义菜单,并将其作为文本选择中的自定义 ActionMode 传递给 TextView.setCustomSelectionActionModeCallback
我正在使用 Android 的新小部件 Toolbar,我想更改它的 ActionMode 的背景和文本颜色(第一个奇怪的事情:ActionMode 不会使用默认的原色,它应该是默认行为...)。 我
我有一个 ActionMode 的实现来显示多个在 RecyclerView 中选择项目。 我想知道什么时候点击 actionMode 中的后退按钮以相应地重置 recyclerView 但是在实现
几天来我一直在尝试寻找 ActionMode 内存泄漏的根源,但没有成功。我有一个包含多个 fragment 的 Activity ,当我离开具有 ActionMode 的 fragment (同时自
有没有办法在不更改“正常”ActionBar 图标的情况下更改 ActionMode 溢出图标? 最佳答案 I still need to figure out how to only change
我有以下 Activity 布局:
我有一项新支持工具栏和抽屉导航的 Activity 。工具栏与内容相关,例如元素 list 。可以选择多个项目 - 然后显示 ActionMode(上下文操作栏)。然而系统的ActionMode位置、
我是一名优秀的程序员,十分优秀!