Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

    <item name="actionModeCloseDrawable">@drawable/navigation_back</item>
    <item name="android:actionModeCloseDrawable">@drawable/navigation_back</item>

Ответ 2

Я редактировал код из 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;
}

Ответ 3

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

Для 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);
        }
    }
}

Ответ 4

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

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

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

Ответ 5

Вот мой подход с 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);
          }
       }

Ответ 6

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

setTitle

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

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