Ответ 1
Вы можете использовать тему, чтобы переопределить значок по умолчанию:
<item name="actionModeCloseDrawable">@drawable/navigation_back</item>
<item name="android:actionModeCloseDrawable">@drawable/navigation_back</item>
Я использую ABS vers. 4, и мне нужно просто изменить текст "Готово" по умолчанию, который отображается, кроме значка закрытия режима действия, но я действительно не могу понять, как это сделать.
Я думаю, что текст должен быть настроен по крайней мере по двум причинам:
"Готово" не подходит для всех контекстов (например, "Отмена" может быть более уместной, и я видел некоторые приложения, такие как приложение "Мои файлы" на вкладке Galaxy, используйте его)
"Готово" необходимо локализовать в соответствии с языком пользователя
Можно ли настроить этот текст? Если это может кто-нибудь сказать мне, как это сделать?
Спасибо заранее.
ИЗМЕНИТЬ
Я нашел временное обходное решение, которое я размещаю в следующем:
private TextView getActionModeCloseTextView() {
// ABS 4.0 defines action mode close button text only for "large" layouts
if ((getResources().getConfiguration().screenLayout &
Configuration.SCREENLAYOUT_SIZE_MASK) ==
Configuration.SCREENLAYOUT_SIZE_LARGE)
{
// retrieves the LinearLayout containing the action mode close button text
LinearLayout action_mode_close_button =
(LinearLayout) getActivity().findViewById(R.id.abs__action_mode_close_button);
// if found, returns its last child
// (in ABS 4.0 there is no other way to refer to it,
// since it doesn't have an id nor a tag)
if (action_mode_close_button != null) return (TextView)
action_mode_close_button.getChildAt(action_mode_close_button.getChildCount() - 1);
}
return null;
}
Это метод, с которым я столкнулся. Пожалуйста, ПРИМЕЧАНИЕ, что он в значительной степени полагается на структуру abs__action_mode_close_item.xml
для ABS 4.0.
Это работает для моего сценария, но, как вы можете видеть, он не может считаться достаточно удовлетворительным, чтобы продвинуть его к реальному "ответу", поэтому я только редактировал свой предыдущий пост.
Надеюсь, что это поможет кому-то другому, но я также надеюсь, что кто-то может поделиться лучшим и чистым решением.
Вы можете использовать тему, чтобы переопределить значок по умолчанию:
<item name="actionModeCloseDrawable">@drawable/navigation_back</item>
<item name="android:actionModeCloseDrawable">@drawable/navigation_back</item>
Я редактировал код из PacificSky, чтобы иметь возможность настраивать цвет и размер шрифта кнопки закрытия, как в pre ICS, так и в ICS.
Я создал метод с именем customizeActionModeCloseButton
private void customizeActionModeCloseButton() {
int buttonId = Resources.getSystem().getIdentifier("action_mode_close_button", "id", "android");
View v = getGSActivity().findViewById(buttonId);
if (v == null) {
buttonId = R.id.abs__action_mode_close_button;
v = getGSActivity().findViewById(buttonId);
}
if (v == null)
return;
LinearLayout ll = (LinearLayout) v;
if (ll.getChildCount() > 1 && ll.getChildAt(1) != null) {
TextView tv = (TextView) ll.getChildAt(1);
tv.setText(R.string.close_action_mode);
tv.setTextColor(getResources().getColor(R.color.white));
tv.setTextSize(18);
}
}
и я вызываю его сразу после вызова startActionMode()
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
actionMode = getActivity().startActionMode(this);
customizeActionModeCloseButton();
return true;
}
Это было какое-то время, но здесь было немного менее хакерское решение - поместив его там для потомков.
Для Android-версий < ICS
Поместите следующую строку в ваше приложение strings.xml:
<string name="abs__action_mode_done">Cancel</string>
Это переопределяет TextView (определенный в ActionBarSherlock/res/layout-large/abs__action_mode_close_item.xml) атрибут android: text.
Для Android версий ICS и выше
Собственная функциональность ActionBar используется в ICS и выше. Вам нужно найти и переопределить строку, связанную с кнопкой done, используя следующий код:
int buttonId = Resources.getSystem().getIdentifier("action_mode_close_button", "id", "android");
if (buttonId != 0)
{
View v = findViewById(buttonId);
if (v != null)
{
LinearLayout ll = (LinearLayout)v;
View child = ll.getChildAt(1);
if (child != null)
{
TextView tv = (TextView)child;
tv.setText(R.string.cancel);
}
}
}
Спасибо за ответ PacificSky. Это полезно для моего случая.
Что-то нужно объяснить здесь, что findViewById(buttonId)
может возвращать null
в некоторых случаях, например, вызванную в функции o nCreateActionMode()
, потому что кнопка закрытия LinearLayout
для ActionMode еще не инициализирована в то время, я думаю.
Я хочу скрыть кнопку закрытия режима действия, так что я просто sendEmptyMessageDelayed
в onCreateActionMode()
и позвонил PacificSky 200 мс позже. Это работает для меня.
Вот мой подход с Java-кодом:
private void customizeActionModeCloseButton(String title, int iconID) {
int buttonId = Resources.getSystem().getIdentifier("action_mode_close_button", "id", "android");
View v = findViewById(buttonId);
if (v == null) {
buttonId = R.id.abs__action_mode_close_button;
v = findViewById(buttonId);
}
if (v == null)
return;
LinearLayout ll = (LinearLayout) v;
if (ll.getChildCount() > 1 && ll.getChildAt(1) != null) {
//custom icon
ImageView img = (ImageView) ll.getChildAt(0);
img.setImageResource(iconID);
//custom text
TextView tv = (TextView) ll.getChildAt(1);
tv.setText(title);
tv.setTextColor(Color.WHITE);
}
}
com.actionbarsherlock.view.ActionMode содержит метод:
setTitle
Используется для изменения текста возле значка Close в ActionBar. ActionMode доступен в ваших методах реализации интерфейса com.actionbarsherlock.view.ActionMode.Callback, например onCreateActionMode.
Что вы можете сделать - это сохранить входящую ссылку ActionMode и использовать ее позже, чтобы изменить название по своему усмотрению. Или, если он не является динамическим, вы можете настроить его с константой в onCreateActionMode.