9

Ich versuche, den Textinhalt meines ActionBar-Navigationsdrehfelds zu umbrechen (ich verwende ActionBar Sherlock). Es scheint, dass mein Spinner die Breite der Elemente in der Dropdown-Liste nimmt.So können Sie Textinhalte in den ActionBarSherlock-Navigationsspinner einbinden

Wie kann ich den ausgewählten Artikel im Spinner entsprechend seiner Breite "wickeln"? Ein Beispiel findet sich im Aktionsleisten-Spinner von GMaps.

+0

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

+0

Hey, hast du es gelöst? Ich möchte genau dasselbe machen, aber ich kann keine Lösung finden. Sieht so aus, als wäre es Actionbar Standardverhalten (sogar Standard in Android 4.2 nicht Actionbarsherlock). – vandzi

+0

@vandzi nein, habe ich nicht und ich bestätige, dass es das "native" Verhalten von Actionbar ist, also gibt es keine Möglichkeit das zu tun. – kaffein

Antwort

1

UPDATE:

mein Beispielprojekt hier herunterladen: Spinner width test (Dropbox folder) (es beide Lösungen in dieser Antwort zur Verfügung gestellt enthält).

Da das Kerning (Zeichenabstand) des Zeichens unterschiedlich ist, je nach dem Text, die Breite des Spinners auch Breite der Antwort änderte ich früher postet (unten)

Anstatt also den Titel String, setzen nur die Breite des Textview in Pixel wie folgt aus:

textView.setWidth(200); 
  • der Text nun abgeschnitten werden wird und endend mit „..“.

  • Die Breite des Spinner bleibt gleich groß.

  • Sie können unterschiedliche Breite der Dropdown-Liste gesetzt und den Spinner

  • Sie noch einen benutzerdefinierten SpinnerAdapter benötigen, aber Sie brauchen keine benutzerdefinierte
    SpinnerItem Klasse, nur dem Adapter einen String geben [ ] Array.

spinner.setAdapter (neu TruncatedSpinnerAdapter (string)); // String []

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

Die Antwort vor Update:

Sie Sie können die Textsorte umbrechen, indem Sie einen benutzerdefinierten SpinnerAdapter erstellen, in dem Sie die Länge des Texts steuern, den Sie in der Ansicht "Spinner" und in der Dropdown-Liste "Spinner" anzeigen.

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

    } 

füllen Sie den Adapter mit einer benutzerdefinierten SpinnerItem Klasse, die und gibt einen Kurztitel für die Spinner Ansicht halten kann.

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

mit der SpinnerItem Klasse die Länge des Titels im Spinner Artikel Ansicht durch Setzen eines MAX Titellänge gezeigt steuern kann, wenn Sie die SpinnerItem Objekt erstellen.

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

dann die spinnerAdapter zum

Spinner hinzufügen
spinner.setAdapter(spinnerAdapter); 

ActionBar: Spinner in menu.xml Beispiel

 // 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

Eigentlich android wird versuchen getView() für alle Elemente zu nennen, und legen Sie die Breite des Spinner mit der breitesten Breite fest. Bitte beachte meine Lösung in einem anderen Thread. https://stackoverflow.com/a/15356679/2159849