ActionBarSherlock (ABS): как настроить текст действия в режиме закрытия объекта?

Я использую ABS vers. 4, и мне нужно просто изменить текст «Готово» по умолчанию, который отображается, кроме значка закрытия режима действия, но я действительно не могу понять, как это сделать.

Я думаю, что текст должен быть настроен по крайней мере по двум причинам:

Можно ли настроить этот текст? Если это может кто-нибудь сказать мне, как это сделать?

Заранее спасибо.

РЕДАКТИРОВАТЬ

Я нашел временное обходное решение, которое я публикую в следующем:

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.

Это работает для моего сценария, но, как вы можете видеть, его нельзя считать достаточно удовлетворительным, чтобы продвинуть его к реальному «ответу», поэтому я только редактировал свой предыдущий пост.

Надеюсь, что это помогает кому-то другому, но я также надеюсь, что кто-то может поделиться лучшим и более чистым решением.

Solutions Collecting From Web of "ActionBarSherlock (ABS): как настроить текст действия в режиме закрытия объекта?"

Вы можете использовать тему, чтобы переопределить значок по умолчанию:

  <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 в некоторых случаях, например, вызванное nCreateActionMode() 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 

Он используется для изменения текста возле значка «Закрыть» в ActionBar. ActionMode доступен в ваших методах реализации интерфейса com.actionbarsherlock.view.ActionMode.Callback, например onCreateActionMode.

Что вы можете сделать – это сохранить входящую ссылку ActionMode и использовать ее позже, чтобы изменить название по своему усмотрению. Или, если он не динамический, вы можете настроить его с помощью константы в onCreateActionMode.