9

Estoy intentando envolver el contenido de texto de mi navegador de navegación ActionBar (estoy usando ActionBar Sherlock). Parece que mi spinner toma el ancho de los elementos contenidos en la lista desplegable.Cómo envolver contenido de texto en ActionBarSherlock navigation spinner

¿Cómo puedo hacer que el elemento seleccionado en la ruleta sea "envuelto" según su ancho? Se puede encontrar un ejemplo en la barra de acciones de MGaps.

+0

usa? getSupportActionBar(). setNavigationMode (com.actionbarsherlock.app.ActionBar.NAVIGATION_MODE_LIST); – TouchBoarder

+0

Oye, ¿lo resolvió? Quiero hacer exactamente lo mismo, pero no puedo encontrar ninguna solución. Parece que es el comportamiento predeterminado de la barra de acciones (incluso por defecto en Android 4.2 no Actionbarsherlock). – vandzi

+0

@vandzi no, no lo hice y confirmo que es el comportamiento "nativo" de Actionbar, por lo que no hay forma de hacerlo. – kaffein

Respuesta

1

ACTUALIZACIÓN:

Descarga mi proyecto de ejemplo aquí: Spinner width test (Dropbox folder) (que contiene tanto las soluciones proporcionadas en esta respuesta).

Dado que el perfil fuera de línea (espaciado entre letras) de los personajes es diferente en función del texto, el ancho de la ruleta también cambió ancho de la respuesta que postet anterior (abajo)

Así que en lugar de subcadena el título, acaba de establecer el ancho de la TextView en píxeles como esto:

textView.setWidth(200); 
  • el texto tendrá ahora truncada y terminando con "..".

  • El ancho de la ruleta sigue siendo del mismo tamaño.

  • Puede establecer el ancho diferente para la lista desplegable y el spinner

  • usted todavía necesita un SpinnerAdapter costumbre, pero usted no necesita una costumbre
    SpinnerItem clase, acaba de dar el adaptador de una cadena [ ] matriz.

spinner.setAdapter (nueva TruncatedSpinnerAdapter (StringArray)); // String []

En TruncatedSpinnerAdapter:

public class TruncatedSpinnerAdapter implements SpinnerAdapter { 

    String[] spinnerItem; 

    public TruncatedSpinnerAdapter(String[] spinnerItem) { 
     this.spinnerItem = spinnerItem; 
    } 

// ...more required interface callbacks here... 

    /** 
    * Returns the View that is shown when a spinner item is selected. 
    */ 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = getLayoutInflater().inflate(
       android.R.layout.simple_spinner_item, null); 
     TextView textView = (TextView) view.findViewById(android.R.id.text1); 
     textView.setText(spinnerItem[position]); 
     //Set the width of the TextView in pixel. 
     //the text will now get truncated and ending with ".." 
     textView.setWidth(200); 
     return textView; 
    } 

La respuesta antes de la actualización:

Usted puede envolver el texto creando un SpinnerAdapter personalizado en el que controle la longitud del texto que muestra en la vista giratoria y en la vista desplegable del control deslizante.

/** 
    * A SpinnerItemAdapter to handle SpinnerItem Objects, 
    * displays the ArrayList of SpinnerItem Objects. 
    */ 
    public class SpinnerItemAdapter implements SpinnerAdapter{ 

     /** 
     * The internal data, ArrayList of SpinnerItem Objects. 
     */ 
     SparseArray<SpinnerItem> spinnerItem; 

     public SpinnerItemAdapter(SparseArray<SpinnerItem> spinnerItem){ 
      this.spinnerItem = spinnerItem; 
     } 

     /** 
     * Returns the Size 
     */ 
     @Override 
     public int getCount() { 
      return spinnerItem.size(); 
     } 
     /** 
     * Returns a SpinnerItem Object at the specified position. 
     */ 
     @Override 
     public Object getItem(int position) { 
      return spinnerItem.valueAt(position); 
     } 


// ...more required interface callbacks here... 


     /** 
     * Views displayed when the Spinner is clicked, the drop 
     * down list of spinner items. 
     */ 
     @Override 
     public View getDropDownView(int position, View convertView, 
       ViewGroup parent) { 
      View view=getLayoutInflater().inflate(android.R.layout.simple_spinner_dropdown_item, null); 
      TextView v=(TextView)view.findViewById(android.R.id.text1); 
      v.setText(spinnerItem.valueAt(position).getDropDownTitle());  
      return v; 
     } 
     /** 
     * Returns the View that is shown when a spinner item is selected. 
     */ 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View view=getLayoutInflater().inflate(android.R.layout.simple_spinner_item, null); 
      TextView v=(TextView)view.findViewById(android.R.id.text1); 
      v.setText(spinnerItem.valueAt(position).getShortTitle()); 
      return v; 
     } 

    } 

pueblan el adaptador con una costumbre SpinnerItem clase que puede contener y devolver un título abreviado para la vista spinner.

class SpinnerItem { 

    // SpinnerItem fields, including variable of type SpinnerItem 
    public String title = ""; 
    // sets the width of the spinnerItem 
    public int titleLength = 10;//default value 
    public int titleDropDownLength = 20; 

    public long id; 

    // SpinnerItem methods() 

    /** 
    * Title with max characters displayed, set by titleLength; 
    * 
    * @return title of the spinnerItem. 
    */ 
    public CharSequence getShortTitle() { 
     if (title.length() == 0) 
      return "?";// 
     else if (title.length() > 0 && title.length() <= titleLength) { 
      return title; 
     } else { 
      String shortTile = title.substring(0, titleLength).trim() + ".."; 
      return shortTile; 
     } 
    } 

    public CharSequence getDropDownTitle() { 
     if (title.length() == 0) 
      return "?";// 
     else if (title.length() > 0 && title.length() <= titleDropDownLength) { 
      return title; 
     } else { 
      String shortTile = title.substring(0, titleDropDownLength).trim() + ".."; 
      return shortTile; 
     } 
    } 
} 

con la clase SpinnerItem se puede controlar la longitud del título se muestra en la vista del elemento giratorio mediante el establecimiento de una longitud título MAX cuando se crea el objeto SpinnerItem.

//Create an ArrayList for the Adapter with SpinnerItems 
     SparseArray<SpinnerItem> spinnerItems = new SparseArray<SpinnerItem>(); 

     //Some dummy Cheese titles for the spinner items 
     String[] sCheeseStrings = { 
       "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi", 
       "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale"}; 

     for (int i = 0; i < sCheeseStrings.length; i++) { 
      SpinnerItem spinnerItem= new SpinnerItem(); 
      spinnerItem.title=sCheeseStrings[i]; 
      spinnerItem.id=i; 
      spinnerItem.titleLength=MAX_TITLE_LENGTH; 
      spinnerItem.titleDropDownLength=MAX_DROP_DOWN_TITLE_LENGTH; 
      spinnerItems.append(i, spinnerItem); 
     } 
     spinnerAdapter = new SpinnerItemAdapter(spinnerItems); 

continuación, agregue el spinnerAdapter a la Spinner

spinner.setAdapter(spinnerAdapter); 

Barra de acciones: Spinner en el Ejemplo menu.xml

 // For API below 11 use ActionBar Sherlock with Android Support Library 
//  getSupportMenuInflater().inflate(R.menu.activity_menu, menu); 
     // For API above 11 
     getMenuInflater().inflate(R.menu.activity_menu, menu); 
     spinner_menu = (Spinner) menu.findItem(R.id.menu_spinner).getActionView(); 
     spinner_menu.setAdapter(spinnerAdapter); 
1

En realidad androide, intentará llamar a getView() para todos los elementos, y establece el ancho de la ruleta con el ancho más ancho. Por favor, consulte mi solución en otro hilo. https://stackoverflow.com/a/15356679/2159849

Cuestiones relacionadas