2013-02-05 30 views
11

Per impostazione predefinita nella barra di navigazione la larghezza di navigazione dell'elemento selezionato è ampia quanto l'elemento più largo. Vorrei "wrap_content" nell'elemento selezionato poiché è in google +, gmail, mappe app Android.Barra di navigazione lista larghezza di navigazione - contenuto a capo

Qualcuno sa che è caldo farlo?

Ho provato a sovrascrivere getView dell'adattatore di navigazione ma non funziona. Sembra che questa vista sia avvolta con un'altra vista che ha la larghezza dell'elemento più largo. Ho anche provato actionbar.setVisualizzazione personalizzata con spinner ma lo stesso comportamento di spinner. Usa la larghezza dell'oggetto più ampia.

Grazie per tutti i suggerimenti, collegamenti e aiuto.

Current state

Required state

risposta

13

Ho incontrato lo stesso problema. Sembra che Android chiamerà il metodo getView() per tutti gli elementi e infine la larghezza alla larghezza dell'elemento più largo.

Quindi, ecco la mia soluzione:

  1. Store (. Sezione per esempio nel tuo esempio) la sezione corrente selezionata, dire selectedSection, nel codice. In realtà devi farlo nel metodo onNavigationItemSelected() di NavigationListener.

  2. Ignora il metodo getView() di SpinnerAdapter, imposta sempre il contenuto su selectedSection.

  3. Nel metodo onNavigationItemSelected() di NavigationListener, provare a chiamare il metodo notifyDataSetChanged() del proprio spinnerAdapter dopo aver impostato la modalità corrente su SelectedSection.

Ecco il codice di esempio:

final int selectedSection = 0; 
final String sectionLabels[] = {"short sec", "long section", "looooonger section"}; 

final ArrayAdapter<String> arrayAdapter = 
    new arrayAdapter<String>(this, simple_list_item_1) { 
    @Override 
    public int getCount() { 
     // You need to implement here. 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.you_entry, null); 
     } 
     TextView textView = (TextView) convertView.findViewById(R.id.you_text); 
     // Set the text to the current section. 
     textView.setText(sectionLabels[selectedSection]); 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     // You need to implement here. 
    } 

    } 

actionBar.setListNavigationCallbacks(navigationAdpater, 
    new ActionBar.OnNavigationListener() { 

    @Override 
    public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
     // Store the current section. 
     selectedSection = itemPosition; 
     navigationAdpater.notifyDataSetChanged(); 
     return true; 
    } 
    }); 
+1

Ottima risposta !!! Grazie. Puoi anche sostituire textView.setText (sectionLabels [selectedSection]); con textView.setText (sectionLabels [actionBar.getSelectedNavigationIndex()]); quindi non è necessario selezionare Section – vandzi

+0

Ah sì! non abbiamo bisogno del selectedSection ;-) @vandzi –

+2

C'è un modo ancora più semplice. Nella chiamata getView() ((AdapterView) parent) .getSelectedItemPosition() per ottenere la posizione corrente. –

0

Creare un filatore e aggiungere textviews a quello. Sulla trottola, imposta il campo maxWidth sul valore che vuoi e questo dovrebbe gestirlo. Un'altra opzione potrebbe essere quella di impostare la

android:layout_width="0" 
android_layout_weight="0.3" 

Questo vorrebbe dire che la filatrice occuperebbe solo 1/3 ° della larghezza scrren.

Sulla TextView è necessario impostare:

android:singleLine="false" 
android:ellipsize="end" 
+0

Grazie. Sfortunatamente non funziona. So come impostare una larghezza fissa. Ma voglio impostare la larghezza dello spinner sulla larghezza dell'elemento selezionato. – vandzi

+0

È quindi possibile eseguire un OnGlobalLayoutChangeListener e impostare la larghezza dello spider sulla larghezza della larghezza selezionata. – lokoko

3

È necessario eseguire l'override del metodo GetView() nella scheda e impostare i params di layout nel TextView per avvolgere il contenuto. Lo spinner verrà ridimensionato automaticamente per l'elemento selezionato.

Ho creato un adattatore personalizzato estende da ArrayAdapter:

public class CustomAdapter extends ArrayAdapter<String> { 

Dopo di che ho l'override del metodo GetView() cambiando le LayoutParams della vista corrente:

@Override 
public View getView(final int position, final View convertView, final ViewGroup parent) { 
      View view = convertView; 
      if (null == view) { 
       view = LayoutInflater.from(this.getContext()) 
         .inflate(android.R.layout.simple_list_item1, null); 
       ((TextView) view).setText(getItem(position)); 
      } 
      final LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, 
               LayoutParams.WRAP_CONTENT); 
      view.setLayoutParams(params); 
      return view; 
} 

Nella vostra attività, creare adattatore esempio e impostare Spinner con esso:

List<String> stringList = new ArrayList<String>(); 
stringList.add("test1"); 
stringList.add("test12"); 
stringList.add("test123"); 
stringList.add("test1234"); 

final SpinnerAdapter adapter = new CustomAdapter(this.getContext(), 
               android.R.layout.simple_list_item1, 
               android.R.id.text1, 
               stringList); 
mySpinner.setAdapter(adapter); 

Quando si sceglie som nella lista, lo spinner ricrea la vista, riordina l'oggetto selezionato nella prima posizione e ridimensiona la dimensione del contenuto.

+0

Non funziona per me – Roman

0

Questo ha funzionato per me. La parte importante è questa. Inserisci il codice sopra riportato come adattatore e usa SelectedItemPosition per selezionare il testo dall'array di oggetti.

int selectedItemPosition = position; 
    if (parent instanceof AdapterView) { 
     selectedItemPosition = ((AdapterView) parent) 
       .getSelectedItemPosition(); 
    } 

L'esempio è riportato di seguito.

public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = getLayoutInflater(); 
    final View spinnerCell; 
    if (convertView == null) { 
     // if it's not recycled, inflate it from layout 
     spinnerCell = inflater.inflate(R.layout.layout_spinner_cell, parent, false); 
    } else { 
     spinnerCell = convertView; 
    } 
    int selectedItemPosition = position; 
    if (parent instanceof AdapterView) { 
     selectedItemPosition = ((AdapterView) parent) 
       .getSelectedItemPosition(); 
    } 

    TextView title = (TextView) spinnerCell.findViewById(R.id.spinnerTitle); 
    title.setText(titles[selectedItemPosition]); 
    return spinnerCell; 
} 

Se avete bisogno di una spiegazione segui questo link: http://coding-thoughts.blogspot.in/2013/11/help-my-spinner-is-too-wide.html

Problemi correlati