7
votes

Définir la largeur de spinner sur la largeur de l'article actuel

Par défaut, la largeur de la spinner est définie pour s'adapter à l'élément le plus important de la liste déroulante, mais je veux qu'elle soit la même largeur que l'élément sélectionné.

<android.widget.Spinner
    android:id="@+id/tab_spinner"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:entries="@array/countries" />


0 commentaires

3 Réponses :


-4
votes

Réglage des fileurs XML sur:

android:layout_width="wrap_content"


1 commentaires

Désolé j'ai oublié de poster mon code, mais c'était déjà comme ça et n'a rien changé pour moi ...



18
votes

Par défaut, spinner code> essaiera de mesurer certaines de vos vues déroulantes et d'utiliser la largeur maximale trouvée. Cela se produit dans Spinner # MeseutrecontentWidth () Code>, un Protected code> méthode de Spinner code> appelé in Spinner # OnMeasure () Code>.

Un moyen de résoudre le problème consiste à vous assurer que votre spinneradapter # greview () code> méthode utilise toujours Spinner # GetSelectedItemposition () code> pour son Position code > Argument. P>

Je peux penser à deux solutions possibles: p>

  1. Création d'une fileuse personnalisée avec un adaptateur d'enveloppe (je préfère cette solution) li>
  2. ou adapter votre adaptateur personnalisé LI> ol>


    1. Création d'une spinner personnalisée avec un adaptateur d'enveloppe forte> p>

    Assurez-vous d'utiliser ceci dans votre présentation code> XML code>, au lieu d'un normal code> code> . p>

    Soyez prudent que dynamicwidthspinner # getAdapter () code> retournera un wrapperspinneradapter code>; Utilisez son getbaseadapter () code> pour accéder à votre adaptateur. p> xxx pré>


    2. Adapter votre adaptateur personnalisé strong> p>

    Soyez prudent que parent code> in greview () code> pourrait ne pas toujours être un Spinner code> . P>

    private class SimpleSpinnerAdapter extends BaseAdapter {
    
        private LayoutInflater mInflater;
        private int mResource;
    
    
        public SimpleSpinnerAdapter(Context context, int resource) {
            mInflater = LayoutInflater.from(context);
            mResource = resource;
        }
    
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return createViewFromResource(
                    mInflater,
                    ((Spinner) parent).getSelectedItemPosition(),
                    convertView,
                    parent,
                    mResource);
        }
    
        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
            return createViewFromResource(
                    mInflater,
                    position,
                    convertView,
                    parent,
                    mResource);
        }
    
        protected View createViewFromResource(LayoutInflater inflater, int position, 
                                              View convertView, ViewGroup parent,
                                              int resource) {
            View view;
            if (convertView == null) {
                view = inflater.inflate(resource, parent, false);
            } else {
                view = convertView;
            }
    
            bindView(position, view);
    
            return view;
        }
    
        protected void bindView(int position, View view) {
            // Bind your view.
        }
    
        // getCount(), getItem(), and getItemId() methods.
    }
    


3 commentaires

La première option est la plus flexible


La première option ne fonctionne pas pour moi. Lorsque je l'implémente (et je devais le modifier pour Kotlin et le code manquant dans la fonction greveView ) Le spinner ne répond pas aux événements de TAP et la flèche déroulante a disparu. Je vais mettre mon code actuel dans une réponse ci-dessous. J'utilise un TextView personnalisé comme élément de spinner


@jpmcosta j'ai mis mon code dans une nouvelle question ici: Stackoverflow.com/questions/56998198/...



-1
votes
  ViewGroup.LayoutParams spinnerLayoutParams = spinner.getLayoutParams();
    spinnerLayoutParams.width -= 1;
   spinner.setLayoutParams(spinnerLayoutParams);
Do this is on item selected

1 commentaires

La valeur "-1" est match_parent. Pourquoi cela pourrait-il aider?