web-dev-qa-db-fra.com

Comment limiter la hauteur de la vue déroulante Spinner dans Android

Veuillez suggérer toute approche que j'utilise pour le créer.

Requête: Je crée une vue 2-Spinner, où je dois ajouter une liste de pays/villes, donc comme si je sélectionne l'Inde, je reçois 50 articles dans la liste déroulante, le problème avec ceci est qu'il prend toute la page en hauteur.

Ce que je veux: Je veux créer une vue déroulante, où l'utilisateur ne peut voir que 10 éléments dans la vue déroulante, d'autres éléments seront affichés chaque fois que l'utilisateur faites défiler le vue déroulante.


My problem

25
Tushar Pandey

Vous pouvez utiliser la réflexion.

    Spinner spinner = (Spinner) findViewById(R.id.spinner);
    try {
        Field popup = Spinner.class.getDeclaredField("mPopup");
        popup.setAccessible(true);

        // Get private mPopup member variable and try cast to ListPopupWindow
        Android.widget.ListPopupWindow popupWindow = (Android.widget.ListPopupWindow) popup.get(spinner);

        // Set popupWindow height to 500px
        popupWindow.setHeight(500);
    }
    catch (NoClassDefFoundError | ClassCastException | NoSuchFieldException | IllegalAccessException e) {
        // silently fail...
    }
59
shlee1

Vous pouvez également affecter l'emplacement et la taille de la vue déroulante en sous-classant Spinner et en remplaçant sa getWindowVisibleDisplayFrame(Rect outRect) qui est utilisée par Android.widget.PopupWindow pour les calculs. Définissez simplement outRect pour limiter la zone dans laquelle la liste déroulante peut être affichée.

Cette approche n'est bien sûr pas adaptée à tous les scénarios, car vous souhaitez parfois placer une vue déroulante afin de ne pas masquer une autre vue ou par une autre condition connue uniquement "en dehors de l'instance".

Dans mon cas, je devais postuler FLAG_LAYOUT_NO_LIMITS drapeau à ma fenêtre d'activité, ce qui a provoqué l'énorme outRect et donc une partie de la vue déroulante s'est parfois cachée derrière la barre de navigation. Afin de restaurer le comportement d'origine, j'ai utilisé le remplacement suivant:

@Override
public void getWindowVisibleDisplayFrame(Rect outRect) {
    WindowManager wm = (WindowManager) getContext.getSystemService(Context.WINDOW_SERVICE);
    Display d = wm.getDefaultDisplay();
    d.getRectSize(outRect);
    outRect.set(outRect.left, <STATUS BAR HEIGHT>, outRect.right, outRect.bottom);
}
7
Almighty

pour cela, j'ai créé le mien, PopUpWindow comme suggéré par @theLittleNaruto, dans la section des commentaires.

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" 
    Android:orientation="vertical" 
    Android:layout_width="fill_parent" 
    Android:layout_height="wrap_content"> 

    <Button 
        Android:layout_marginTop="80dp"
        Android:id="@+id/btn"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:text="Country"
        Android:layout_gravity="center_vertical|center_horizontal"/>
</LinearLayout>

popup_example.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    Android:padding="10dip" >

    <ListView 
        Android:id="@+id/lstview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        />

</LinearLayout>

showpopup_1.Java

package com.example.spinnerworking;

import Android.app.Activity;
import Android.content.Context;
import Android.graphics.Color;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.Gravity;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.AdapterView;
import Android.widget.AdapterView.OnItemClickListener;
import Android.widget.ArrayAdapter;
import Android.widget.BaseAdapter;
import Android.widget.Button;
import Android.widget.ImageButton;
import Android.widget.ListView;
import Android.widget.PopupWindow;
import Android.widget.TextView;
import Android.widget.PopupWindow.OnDismissListener;
import Android.widget.Toast;

public class showpopup_1 extends Activity {

    boolean click = true ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        final LayoutInflater inflater = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final Button b = (Button) findViewById(R.id.btn);
        final View pview = inflater.inflate(R.layout.popup_example,
                (ViewGroup) findViewById(R.layout.main));
        final PopupWindow pw = new PopupWindow(pview);
        Log.i("hello", "hello") ;

        b.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (click) {
                    // if onclick written here, it gives null pointer exception.
                    // if onclick is written here it gives runtime exception.
                    pw.showAtLocation(v, Gravity.CENTER_HORIZONTAL, 0, 0);
                    pw.update(8, 0, 150, 200);
                    String[] array = new String[] { "tushar", "pandey",
                            "almora" };

                    ListView lst = (ListView) pview.findViewById(R.id.lstview);
                    adapterHello adapter = new adapterHello(showpopup_1.this);
                    lst.setAdapter(adapter);
                    lst.setOnItemClickListener(new OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> arg0, View arg1,
                                int arg2, long arg3) {
                            Toast.makeText(showpopup_1.this, "pandey",
                                    Toast.LENGTH_SHORT).show();
                        }

                    });
                    click = false ;
                }
                else
                {
                    pw.dismiss();
                    click = true;
                }

            }
        });
    }
}

class adapterHello extends BaseAdapter {
    String array[] = new String[] { "tushar", "pandey", "almora", "hello",
            "tushar", "pandey", "almora", "hello", "tushar", "pandey",
            "almora", "hello" };

    showpopup_1 context;

    public adapterHello(showpopup_1 context) {
        this.context = context;
    }

    public int getCount() {
        // TODO Auto-generated method stub
        return array.length;
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        TextView text = new TextView(context);
        text.setHeight(30);
        text.setPadding(10, 8, 0, 0);
        text.setTextColor(Color.BLACK);
        text.setText(array[position]);
        text.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.i("clicked", "tushar");
            }
        });
        return text;
    }

}
3
Tushar Pandey
  1. ajouter Android:popupBackground="#00000000" au Spinner
  2. dans l'adaptateur
getDropDownView();
parentParams = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, (int) Utils.convertDpToPx(350));
parentParams.gravity = Gravity.BOTTOM;
parent.setLayoutParams(parentParams);
  1. vous pouvez déplacer le popup en ajoutant Android:dropDownVerticalOffset="60dp"
0
Shimi Uhlman

Vous pouvez utiliser cette bibliothèque impressionnante MaterialSpinner qui fera tout le travail dur pour vous.

Télécharger: implementation 'com.jaredrummler:material-spinner:1.3.1'

fileName.xml :

<com.jaredrummler.materialspinner.MaterialSpinner
Android:id="@+id/spinner"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:ms_dropdown_max_height="400dp"/>

définir la hauteur à l'aide de app:ms_dropdown_max_height="400dp"

0
Mahmoud Ayman