有沒有辦法更改ActionMode溢出圖標而不更改「普通」ActionBar的圖標?更改ActionMode溢出圖標
回答
你應該能夠做到這一點使用樣式:
ActionBarSherlock:
<style name="MyTheme" parent="Theme.Sherlock.Light">
<item name="actionOverflowButtonStyle">@style/MyTheme.OverFlow</item>
</style>
<style name="MyTheme.OverFlow" parent="Widget.Sherlock.ActionButton.Overflow">
<item name="android:src">@drawable/YOUR_ICON_GOES_HERE</item>
</style>
ActioBar:
<style name="MyTheme" parent="@android:style/Theme.Holo">
<item name="android:actionOverflowButtonStyle">@style/MyTheme.OverFlow</item>
</style>
<style name="MyTheme.OverFlow" parent="@android:style/Widget.Holo.ActionButton.Overflow">
<item name="android:src">@drawable/YOUR_ICON_GOES_HERE</item>
</style>
確保設定的MyTheme在清單中。
ImageButton
是用於顯示菜單溢出該微件。 actionOverflowButtonStyle
用於造型ImageButton
。這種造型適用於ActionMenuPresenter。
private class OverflowMenuButton extends ImageButton implements ActionMenuChildView {
public OverflowMenuButton(Context context) {
super(context, null, com.android.internal.R.attr.actionOverflowButtonStyle);
...
}
}
ActionMenuPresenter
類是用於無論在action bar
和action modes
建設行動菜單。因此,通過覆蓋主題文件將在兩種模式下應用相同的樣式。完成的唯一方法是編程方式,因爲here爲action bar
。
下面是如何它可以爲action mode
溢出圖標來完成的代碼。您可以在ActionMode.Callback.onPrepareActionMode
方法中將drawable
分配給ImageButton
。
public class MainActivity extends Activity {
ViewGroup mDecorView;
public void onCreate(Bundle savedInstanceState) {
// Assign mDecorView to later use in action mode callback
mDecorView = (ViewGroup) getWindow().getDecorView();
}
private ActionMode.Callback mCallback = new ActionMode.Callback()
{
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu)
{
// We have to update the icon after it is displayed,
// hence this postDelayed variant.
// This is what I don't like, but it is the only way to move forward.
mDecorView.postDelayed(new Runnable() {
@Override
public void run() {
ArrayList<View> outViews = new ArrayList<View>();
// The content description of overflow button is "More options".
// If you want, you can override the style and assign custom content
// description and use it here.
mDecorView.findViewsWithText(outViews, "More Options", View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
if(!outViews.isEmpty()) {
View v = outViews.get(0);
if(v instanceof ImageButton) {
ImageButton btn = (ImageButton) v;
// Update the image here.
btn.setImageResource(R.drawable.custom);
}
}
}
}, 500);
return true;
}
}
}
我還需要弄清楚如何爲我的默認動作條是不是在ActionMode,動作條可見改變了我的溢出圖標只改變內部ActionMode-動作條的溢出圖標(不,我不想改變我的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
。
在你的活動中,定義一個方法 - 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
不受影響,因爲它已經使用舊屬性。但是,動作模式尚未創建(當我們從onCreateActionMode(...)
返回true
時將創建該動作模式)。當動作模式檢查這個屬性值時,它會得到新的屬性值。
還有更多...
通過馬尼什給出的答案是相當真棒。我本可以從未想過使用內容描述來找到確切的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>
我們上面定義的ID將被分配到當我們調用getTheme().applyStyle(R.style.ChangeOverflowToDark, true);
我在這裏借用Manish的答案代碼段的ImageButton
:
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;
}
}
兩全其美?
比方說,我們需要爲ActionMode
R.drawable.overflow_menu_light
爲ActionBar
和R.drawable.overflow_menu_dark
。
樣式:
<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
- 但不要我們需要光版爲ActionBar
?是的 - 我們將指派,在活動的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
繪製。
我對這篇巨大的文章表示歉意。我真的希望它有幫助。
這只是一個了不起的解釋!你的第一個教程工作得很好!在我看來,這是一種比處理Handlers和Runnables更美麗的方式....謝謝! :)) – Frame91
試用了樣式的第一個解決方案,適用於Android 5.0以前的版本,但不適用於Android Lollipop 5.0。對此有何更新? –
- 1. AppCompat工具欄:更改ActionMode中的溢出圖標顏色
- 2. 更改ActionMode的標題的Android
- 3. ActionBarSherlock圖標溢出
- 4. 更改操作欄中的溢出圖標
- 5. 更改代碼中的Android ActionBar溢出圖標
- 6. 如何更改Android溢出菜單圖標
- 7. 更改工具欄溢出圖標顏色
- 8. 溢出按鈕無法更改爲添加圖標
- 9. Android |更改溢出圖標(3點菜單)的顏色?
- 10. 將動作欄溢出圖標更改爲黑色版本
- 11. 如何關閉更改上的ActionMode FragmentTab
- 12. WPF TabControl與溢出圖標
- 13. Genymotion動作溢出圖標
- 14. Android ActionMode圖標顏色白色
- 15. Theme.Sherlock.Light.DarkActionBar中的隱形ActionMode項圖標
- 16. 如何更改上下文操作欄的溢出圖標而不更改其標準操作欄?
- 17. 標準UIBarButtonItem溢出菜單圖標
- 18. 溢出圖標3點不出現
- 19. Android動作視圖溢出圖標
- 20. 溢出標籤
- 21. 溢出`標籤`
- 22. 更改CSS溢出隱藏行爲
- 23. 如何更改溢出menuitem的背景
- 24. 更改字體顏色上溢出
- 25. 如何在操作欄中將溢出圖標更改爲白色?
- 26. 如何更改工具欄導航和溢出菜單圖標(appcompat v7)?
- 27. 更改圖標
- 28. 更改圖標
- 29. 圖像溢出
- 30. Eclipse傳出更改星號圖標
是的,我爲ActionBar做了這些,但我需要Holo。ActionBar的黑色圖標和ActionMode的Holo.Light圖標。 – TeKo