2012-04-05 9 views
12

Sto usando ABS vers. 4 e ho bisogno di cambiare semplicemente il testo predefinito "Fatto" che viene visualizzato accanto all'icona di chiusura della modalità di azione, ma non riesco davvero a capire come farlo.ActionBarSherlock (ABS): come personalizzare il testo della modalità di azione close item?

Credo che il testo deve essere personalizzabile per almeno due buoni motivi:

  • "fatto" non è appropriato per tutti i contesti (ad esempio "Annulla" potrebbe essere più appropriato, e ho visto alcune applicazioni, come ad esempio l'applicazione "My Files" su Galaxy Tab, lo usano)

  • "Fatto" ha bisogno di essere localizzato in base alla lingua dell'utente

E 'possibile fare personalizzare quel testo? Se è così, qualcuno può dirmi come si fa?

Grazie in anticipo.

EDIT

ho trovato una soluzione temporanea, che ho posto il seguente:

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

Questo è il metodo che mi è venuta. Si prega di NOTA che fa molto affidamento sulla struttura del abs__action_mode_close_item.xml di ABS 4.0.

Questo funziona per il mio scenario, ma, come potete vedere, non può essere considerato sufficientemente soddisfacente per promuoverlo in una "risposta" reale, ecco perché ho modificato solo il mio post precedente.

Speranza che aiuti qualcun altro, ma spero anche che qualcuno possa condividere una soluzione migliore e più pulita.

risposta

-1

com.actionbarsherlock.view.ActionMode contiene metodo:

setTitle 

Viene utilizzato per modificare il testo nei pressi Chiudi icona nella ActionBar. ActionMode è disponibile nei metodi di implementazione dell'interfaccia com.actionbarsherlock.view.ActionMode.Callback, come onCreateActionMode.

Cosa puoi fare - è salvare il riferimento ActionMode in entrata e usarlo in seguito per cambiare titolo come ti piace. Oppure, se non è dinamico, puoi configurarlo con la tua costante in onCreateActionMode.

+1

Il setTitle viene utilizzato per impostare il titolo di "principale" del ActionMode, non il testo che viene visualizzato accanto al pulsante "fatto" in basso a sinistra quando viene eseguito il rendering di un layout di grandi dimensioni. – PacificSky

10

È possibile utilizzare un tema per ignorare l'icona di default:

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

Grazie amico. Funziona bene. –

6

E 'stato un po', ma qui è una soluzione un po 'meno hacky - mettendo fuori là per i posteri.

Per le versioni di Android < ICS

Mettere la seguente riga nel strings.xml dell'applicazione:

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

Ciò ignora del TextView (definito in ActionBarSherlock/res/layout di grandi dimensioni/abs__action_mode_close_item.xml) android: attributo di testo.

Per versioni Android ICS e soprattutto

La funzionalità ActionBar nativo viene utilizzato su ICS e fino. Hai bisogno di trovare e sostituire la stringa associata con il tasto fatto, utilizzando il seguente codice:

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

Buono a sapersi, ma potresti prendere in considerazione la risposta di @ gonglong. A proposito, trovo ridicolo doverlo fare per correggere l'errore di usabilità dell'API di Android. – mdelolmo

7

ho modificato il codice PacificSky per essere in grado di personalizzare il formato di colore e il font del pulsante di chiusura, sia in fase di pre ICS e> ICS.

ho creato un metodo denominato 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); 
     } 
    } 

ed io lo chiamo solo dopo aver chiamato startActionMode()

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

Penso che dovremmo cambiare "if (v == null)" in "if (v == null || buttonId == 0)" nella condizione pugno. Per evitare che ci sia una vista ha id = 0. (Ho affrontato questo problema) ^^ – gZerone

3

Grazie per la risposta di PacificSky. È utile per il mio caso.

Qualcosa deve essere spiegato qui è che findViewById(buttonId) potrebbe tornare null in alcuni casi, come ad esempio chiamata nella funzione o nCreateActionMode(), perché il LinearLayout per ActionMode pulsante di chiusura non ancora inizializzato in quel momento immagino.

Voglio nascondere il pulsante di chiusura della modalità di azione, quindi ho solo sendEmptyMessageDelayed in onCreateActionMode() e chiamare 200ms di PacificSky più tardi. Per me funziona.

0

Ecco il mio approccio con il codice 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); 
      } 
     } 
Problemi correlati