2013-02-05 5 views
11

Par défaut, dans la barre d'action, la largeur de navigation de l'élément sélectionné est aussi large que l'élément le plus large. Je voudrais "wrap_content" dans l'élément sélectionné comme dans google +, gmail, maps android apps.Largeur de la navigation dans la barre d'action - contenu d'habillage

Quelqu'un sait-il chaud pour le faire?

J'ai essayé de surcharger getView de l'adaptateur de navigation, mais cela ne fonctionne pas. Il semble que cette vue est enveloppée avec une autre vue qui a la largeur de l'élément le plus large. J'ai également essayé la vue d'actionbar.setCustom avec le mouvement de spinner mais de spinner est même. Il utilise la plus grande largeur d'élément.

Merci pour toutes les suggestions, les liens et l'aide.

Current state

Required state

Répondre

13

J'ai rencontré le même problème. Il semble qu'Android appelle la méthode getView() pour tous les éléments, et définisse finalement la largeur à la largeur de l'élément le plus large.

Alors, voici ma solution:

  1. magasin la section sélectionnée en cours (. Dans votre section par exemple par exemple), par exemple selectedSection, dans votre code. En fait, vous devez le faire dans la méthode onNavigationItemSelected() de NavigationListener. Remplacer la méthode getView() de votre SpinnerAdapter, toujours définir son contenu à selectedSection.

  2. Dans la méthode onNavigationItemSelected() de NavigationListener, essayez d'appeler la méthode notifyDataSetChanged() de votre spinnerAdapter après avoir défini le mode en cours sur selectedSection.

est ici l'exemple de code:

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

Grande réponse !!! Je vous remercie. Vous pouvez également remplacer textView.setText (sectionLabels [selectedSection]); avec textView.setText (sectionLabels [actionBar.getSelectedNavigationIndex()]); donc vous n'avez pas besoin selectedSection – vandzi

+0

Ah oui! nous n'avons pas besoin de la section sélectionnée ;-) @vandzi –

+2

Il y a un moyen encore plus simple. Dans getView() appel (parent (AdapterView)) .getSelectedItemPosition() pour obtenir la position actuelle. –

0

Créer une fileuse et ajouter textviews à cela. Sur le spinner, définissez le champ maxWidth à la valeur que vous voulez et qui gérera ceci. Une autre option serait de mettre la

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

Cela signifierait que la fileuse occuperait seulement 1/3 de la largeur de scrren.

Sur le textview vous fixerait:

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

Merci. Malheureusement, cela ne fonctionne pas. Je sais comment définir la largeur fixe. Mais je veux définir la largeur de spinner à la largeur de l'élément sélectionné. – vandzi

+0

Vous pouvez ensuite faire un OnGlobalLayoutChangeListener et définir la largeur du spinner à la largeur selecteditem. – lokoko

3

Vous devez remplacer la méthode getView() dans l'adaptateur et définir la mise en page params dans la textview pour envelopper le contenu. Le spinner sera redimensionné automatiquement pour l'élément sélectionné.

J'ai créé un adaptateur personnalisé va de ArrayAdapter:

public class CustomAdapter extends ArrayAdapter<String> { 

Après que je substituez la méthode getView() changer les LayoutParams de la vue actuelle:

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

Dans votre activité, créer adaptateur instance et vous définir spinner avec elle:

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

Lorsque vous choisissez som Dans la liste, le spinner va recréer la vue, réorganiser l'élément sélectionné à la première position, et redimensionner lui-même à la taille du contenu.

+0

Ne fonctionne pas pour moi – Roman

0

Cela a fonctionné pour moi. Une partie importante est la suivante. Mettez le code ci-dessous est votre adaptateur et utilisez selectedItemPosition pour sélectionner le texte du tableau des objets.

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

Un exemple est donné ci-dessous.

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

Si vous avez besoin d'une explication sur ce lien: http://coding-thoughts.blogspot.in/2013/11/help-my-spinner-is-too-wide.html

Questions connexes