2012-04-05 13 views
12

Estoy usando ABS vers. 4 y simplemente tengo que cambiar el texto predeterminado "Hecho" que se muestra además del ícono de cerrar el modo de acción, pero realmente no puedo entender cómo hacerlo.ActionBarSherlock (ABS): cómo personalizar el texto del modo de acción cerrar el elemento?

Creo que el texto tiene que ser personalizable por lo menos dos buenas razones:

  • "hecho" no es apropiado para todos los contextos (por ejemplo, "Cancelar" podría ser más apropiado, y he visto algunas aplicaciones, tales como la aplicación "Mis archivos" en la Galaxy Tab, lo utilizan)

  • "Hecho" necesita ser localizada de acuerdo al idioma

del usuario es posible hacer personalizar ese texto? Si es así, ¿alguien puede decirme cómo hacerlo?

Gracias de antemano.

EDITAR

he encontrado una solución temporal, que publico en el siguiente:

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

Ese es el método que se me ocurrió. Por favor, NOTA que depende en gran medida de la estructura del abs__action_mode_close_item.xml de ABS 4.0.

Esto funciona para mi caso, pero, como puede ver, no puede considerarse suficientemente satisfactorio para promoverlo a una "respuesta" real, es por eso que solo edité mi publicación anterior.

Espero que ayude a alguien más, pero también espero que alguien pueda compartir una solución mejor y más limpia.

Respuesta

-1

com.actionbarsherlock.view.ActionMode contiene método:

setTitle 

Se utiliza para cambiar el texto cerca Cerrar icono en la Barra de acciones. ActionMode está disponible en sus métodos de implementación de la interfaz com.actionbarsherlock.view.ActionMode.Callback, como onCreateActionMode.

Lo que puede hacer es guardar la referencia de ActionMode entrante y usarla más tarde para cambiar el título a su gusto. O, si no es dinámico, puede configurar con su constante en onCreateActionMode.

+1

El setTitle se utiliza para establecer el título "principal" de la ActionMode, no el texto que se muestra al lado del botón "hecho" en la esquina izquierda cuando se renderiza un diseño grande – PacificSky

10

Puede utilizar un tema para anular el icono predeterminado:

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

Gracias hombre. Funciona bien –

6

Ha sido un tiempo, pero he aquí una solución ligeramente menos hacky - ponerlo por ahí para la posteridad.

Para las versiones de Android < ICS

ponga la siguiente línea en strings.xml de su aplicación:

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

Esto anula (definido en ActionBarSherlock/res/layout-grande/abs__action_mode_close_item del TextView.xml) android: atributo de texto.

En las versiones Android ICS y por encima de

La funcionalidad nativa Barra de acciones se utiliza en el ICS y hacia arriba. Es necesario encontrar y reemplazar la cadena asociada con el botón hecho, usando el siguiente código:

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

Es bueno saberlo, pero es posible que desee considerar la respuesta de @gonglong. Por cierto, me parece ridículo tener que hacer esto para corregir un error de usabilidad API de Android. – mdelolmo

7

he editado el código de PacificSky para poder personalizar el tamaño de fuente y color del botón de cierre, tanto en pre ICS y> ICS.

he creado un método denominado 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); 
     } 
    } 

y yo lo llamo justo después de llamar startActionMode()

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

Creo que deberíamos cambiar "if (v == null)" a "if (v == null || buttonId == 0)" en la primera condición. Para evitar que haya una vista tiene id = 0. (Enfrenté este problema) ^^ – gZerone

3

Gracias por la respuesta de PacificSky. Es útil para mi caso.

Algo necesita ser explicado aquí es que findViewById(buttonId) podría volver null en algunos casos, como se llama en la función o nCreateActionMode(), debido a que el LinearLayout para ActionMode botón de cierre aún no se ha inicializado en ese momento supongo.

Quiero ocultar el botón de cerrar del modo de acción, por lo que acabo de sendEmptyMessageDelayed en onCreateActionMode() y llamo a PacificSky 200ms más tarde. Esto funciona para mi.

0

Aquí es mi enfoque con código 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); 
      } 
     } 
Cuestiones relacionadas