2012-04-05 11 views
12

Używam ABS vers. 4 i muszę po prostu zmienić domyślny tekst "Gotowe", który jest wyświetlany obok ikony zamknięcia trybu akcji, ale naprawdę nie mogę wymyślić, jak to zrobić.ActionBarSherlock (ABS): jak dostosować tekst pozycji zamknięcia trybu działania?

myślę, że tekst musi być konfigurowalny przez co najmniej dwóch powodów:

  • „Gotowe” nie jest odpowiednie dla wszystkich kontekstach (np „Anuluj” może być bardziej odpowiednie, i widziałem Niektóre aplikacje, takie jak „My Files” aplikacji na Galaxy Tab, użyj go)

  • „Gotowe” musi być zlokalizowane w zależności od języka użytkownika

Czy to możliwe, aby zrobić dostosować ten tekst? Jeśli tak, to czy ktoś może mi powiedzieć, jak to zrobić?

Z góry dziękuję.

EDIT

Znalazłem tymczasowe obejście, że mam pisać w następujących przypadkach:

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; 
} 

To metoda wymyśliłem. Proszę UWAGA, że to w dużym stopniu polegać na strukturze abs__action_mode_close_item.xml z ABS 4.0.

To działa w moim scenariuszu, ale, jak widać, nie można uznać za wystarczająco satysfakcjonujące promowanie go do prawdziwej "odpowiedzi", dlatego edytowałem tylko mój poprzedni post.

Nadzieję, że pomaga komuś innemu, ale mam także nadzieję, że ktoś może udostępnić lepsze i czystsze rozwiązanie.

Odpowiedz

-1

com.actionbarsherlock.view.ActionMode zawiera metoda:

setTitle 

Służy do zmiany tekstu pobliżu ikonę Zamknij w ActionBar. Tryb działania jest dostępny w metodach implementacji interfejsu com.actionbarsherlock.view.ActionMode.Callback, takich jak onCreateActionMode.

Co można zrobić, to zapisać przychodzące odwołanie do ActionMode i użyć go później, aby zmienić tytuł jako podobny. Lub, jeśli nie jest dynamiczny - możesz ustawić przy stałej w onCreateActionMode.

+1

setTitle służy do ustawienia „main” tytuł ActionMode, a nie tekst, który jest wyświetlany obok przycisku „Gotowe” w lewym rogu kiedy renderowany jest duży układ. – PacificSky

10

Można użyć motywu, aby zastąpić domyślną ikonę:

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

Dzięki człowieku. Działa dobrze. –

6

Minęło trochę czasu, ale tutaj jest nieco mniej hacky rozwiązanie - wprowadzenie go tam dla potomności.

Dla wersji Androida < ICS

umieścić następującą linię w strings.xml danej aplikacji:

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

ta nadpisuje TextView (zdefiniowane w ActionBarSherlock/res/layout-large/abs__action_mode_close_item.xml) android: atrybut tekstowy.

wersje dla Androida ICS i powyżej

Funkcjonalność ActionBar rodzimy jest używany na ICS i do góry. Trzeba znaleźć i zastąpić ciąg powiązanych z przycisku Gotowe, stosując następujący kod:

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); 
     } 
    } 
} 
+0

Dobrze wiedzieć, ale warto rozważyć odpowiedź @ gonglonga. Przy okazji, uważam, że to niedorzeczne, aby naprawić błąd użyteczności API Androida. – mdelolmo

7

edytowany kod z PacificSky aby móc dostosować kolor i czcionka rozmiar przycisku zamykania, zarówno w pre ICS i> ICS.

I stworzył metodę o nazwie 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); 
     } 
    } 

i wzywam go tylko po wywołaniu startActionMode()

public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
    actionMode = getActivity().startActionMode(this); 
    customizeActionModeCloseButton(); 
    return true; 
} 
+0

Myślę, że powinniśmy zmienić "if (v == null)" na "if (v == null || buttonId == 0)" w stanie pięści. Aby tego uniknąć, widok ma id = 0. (stawiałem czoła temu problemowi) ^^ – gZerone

3

Dzięki za odpowiedź PacificSky użytkownika. Przydaje się w moim przypadku.

Coś musi być wyjaśnione tutaj jest to, że może powrócić nullfindViewById(buttonId) w niektórych przypadkach, takich jak nazywa się o nCreateActionMode() funkcji, ponieważ LinearLayout dla ActionMode zamykacz jeszcze nie zainicjowany w tym czasie chyba.

Chcę ukryć przycisk zamykania trybu działania, więc po prostu sendEmptyMessageDelayed w onCreateActionMode() i zadzwonię później 200S PacificSky. Mi to pasuje.

0

Oto moje podejście z kodu 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); 
      } 
     } 
Powiązane problemy