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

Я использую ABS версии. 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.

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

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


person Luke    schedule 05.04.2012    source источник


Ответы (6)


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

    <item name="actionModeCloseDrawable">@drawable/navigation_back</item>
    <item name="android:actionModeCloseDrawable">@drawable/navigation_back</item>
person Yichuan Wang    schedule 12.07.2012

Я отредактировал код из 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;
}
person guillaume-tgl    schedule 31.10.2012
comment
Я думаю, что мы должны изменить if (v == null) на if (v == null || buttonId == 0) в первом условии. Чтобы не было вида, id = 0. (я столкнулся с этой проблемой) ^^ - person gZerone; 19.12.2012

Прошло некоторое время, но вот немного менее хакерское решение - выложить его для потомков.

Для версий Android ‹ ICS

Поместите следующую строку в файл strings.xml вашего приложения:

<string name="abs__action_mode_done">Cancel</string>

Это переопределяет атрибут android:text TextView (определенный в ActionBarSherlock/res/layout-large/abs__action_mode_close_item.xml).

Для версий Android ICS и выше

Собственная функциональность ActionBar используется в ICS и более поздних версиях. Вам нужно найти и переопределить строку, связанную с кнопкой «Готово», используя следующий код:

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);
        }
    }
}
person PacificSky    schedule 23.10.2012
comment
Полезно знать, но вы можете рассмотреть ответ @gonglong. Между прочим, я считаю нелепым делать это, чтобы исправить ошибку юзабилити Android API. - person mdelolmo; 13.02.2013

Спасибо за ответ ПасификСкай. Это полезно для моего случая.

Здесь нужно объяснить, что findViewById(buttonId) может возвращать null в некоторых случаях, например, при вызове функции onCreateActionMode(), потому что кнопка закрытия LinearLayout для ActionMode еще не инициализирована в то время, я думаю.

Я хочу скрыть кнопку закрытия режима действий, поэтому я просто sendEmptyMessageDelayed в onCreateActionMode() и звоню в PacificSky через 200 мс. Меня устраивает.

person gonglong    schedule 01.11.2012

Вот мой подход к 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);
          }
       }
person Nguyen Minh Binh    schedule 23.07.2013

com.actionbarsherlock.view.ActionMode содержит метод:

setTitle

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

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

person Anatoliy    schedule 15.06.2012
comment
setTitle используется для установки основного заголовка ActionMode, а не текста, который отображается рядом с кнопкой «Готово» в левом углу при рендеринге большого макета. - person PacificSky; 24.10.2012