9

Próbuję zawinąć zawartość tekstową mojego pokrętła nawigacyjnego ActionBar (używam ActionBar Sherlock). Wygląda na to, że mój spinner przyjmuje szerokość elementów zawartych na liście rozwijanej.Jak zawijać zawartość tekstową w spinningu ActionBarSherlock

Jak ustawić wybrany przedmiot w przędzarce na "owinięty" zgodnie z jego szerokością? Przykład można znaleźć w spinneru akcji GMaps.

+0

używasz? getSupportActionBar(). setNavigationMode (com.actionbarsherlock.app.ActionBar.NAVIGATION_MODE_LIST); – TouchBoarder

+0

Hej, rozwiązałeś to? Chcę zrobić dokładnie to samo, ale nie mogę znaleźć żadnego rozwiązania. Wygląda na to, że jest to zachowanie domyślne Actionbar (nawet domyślne w Androidzie 4.2, a nie Actionbarsherlock). – vandzi

+0

@vandzi nie, nie zrobiłem tego i potwierdzam, że jest to "natywne" zachowanie Actionbar, więc nie ma sposobu, aby to zrobić. – kaffein

Odpowiedz

1

UPDATE:

Pobierz moim przykładzie projektu tutaj: Spinner width test (Dropbox folder) (zawiera zarówno rozwiązania przewidziane w niniejszym odpowiedź).

Ponieważ kerning (letter-spacing) z bohaterów jest inny w zależności od tekstu, szerokość turbinki zmienił również szerokość Odpowiedź postet wcześniej (poniżej)

Więc zamiast podciąg tytuł, wystarczy ustawić szerokość TextView w pikselu tak:

textView.setWidth(200); 
  • tekst będzie teraz uzyskać obcinane, a kończąc na „..”.

  • Szerokość przędzarki pozostaje tej samej wielkości.

  • Można ustawić różne szerokości do listy rozwijanej i turbinki

  • trzeba jeszcze własnego SpinnerAdapter, ale nie trzeba zwyczaj
    SpinnerItem klasa, po prostu dać adaptera String [ ] tablica.

spinner.setAdapter (nowa TruncatedSpinnerAdapter (stringArray)); // String []

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

The Answer przed aktualizacją:

You można owijać tekst, tworząc niestandardowy SpinnerAdapter, w którym kontrolujesz długość tekstu wyświetlanego w widoku przędzarki oraz w widoku rozwijanym pokrętła.

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

    } 

wypełnić kartę z niestandardowych SpinnerItem klasa, która może pomieścić i powrotu skrócony tytuł widoku wirowania.

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

z klasą SpinnerItem można regulować długość tytule pokazanego w widoku elementu tarczy przez ustawienie Maksymalna długość napisów podczas tworzenia obiektu 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); 

Następnie dodać spinnerAdapter do Spinner

spinner.setAdapter(spinnerAdapter); 

ActionBar: Spinner w menu.xml przykładu

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

Właściwie android spróbuje zadzwonić getView() dla wszystkich elementów, i ustaw szerokość przędzarki na najszerszą szerokość. Proszę odwołać się do mojego rozwiązania w innym wątku. https://stackoverflow.com/a/15356679/2159849

Powiązane problemy