ActionBarSherlock (ABS): come personalizzare il testo della modalità di azione close item?

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.

Penso che il testo debba essere personalizzabile per almeno due buoni motivi:

  • “Fatto” non è appropriato per tutti i contesti (ad es. “Annulla” potrebbe essere più appropriato, e ho visto alcune app, come l’app “I miei file” su Galaxy Tab, usarla)

  • “Fatto” deve essere localizzato in base alla lingua dell’utente

È ansible personalizzare quel testo? Se è così, qualcuno può dirmi come si fa?

Grazie in anticipo.

MODIFICARE

Ho trovato una soluzione temporanea, che inserisco nel 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 ho trovato. Si prega di abs__action_mode_close_item.xml 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 puoi vedere, non può essere considerato sufficientemente soddisfacente da promuoverlo in una vera “risposta”, ecco perché ho modificato solo il mio post precedente.

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

Puoi utilizzare un tema per sovrascrivere l’icona predefinita:

  @drawable/navigation_back @drawable/navigation_back 

Ho modificato il codice da PacificSky per poter personalizzare il colore e la dimensione del carattere del pulsante di chiusura, sia in pre ICS che in> 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); } } 

e lo chiamo subito dopo aver chiamato startActionMode()

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

È passato un po ‘di tempo, ma qui c’è una soluzione un po’ meno hacky, messa in scena per i posteri.

Per versioni Android

Inserisci la seguente riga nel file strings.xml dell’applicazione:

 Cancel 

Questo sovrascrive il TextView (definito in ActionBarSherlock / res / layout-large / abs__action_mode_close_item.xml) android: attributo di testo.

Per le versioni di Android ICS e versioni successive

La funzionalità nativa di ActionBar viene utilizzata su ICS e versioni successive. Devi trovare e sovrascrivere la stringa associata al pulsante Fine, usando 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); } } } 

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

Qualcosa deve essere spiegato qui è che findViewById(buttonId) potrebbe restituire null in alcuni casi, come chiamato in o nCreateActionMode() , perché il pulsante di chiusura LinearLayout per ActionMode non ancora inizializzato in quel momento credo.

Voglio hide il pulsante di chiusura della modalità di azione, quindi sendEmptyMessageDelayed in onCreateActionMode() e richiama 200ms di PacificSky in seguito. Per me funziona.

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

com.actionbarsherlock.view.ActionMode contiene il metodo:

 setTitle 

È usato per cambiare il testo vicino a Close Icon in ActionBar. ActionMode è disponibile nei metodi di implementazione dell’interfaccia com.actionbarsherlock.view.ActionMode.Callback, come onCreateActionMode.

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