64 votes

Comment créer une fenêtre contextuelle (PopupWindow) dans Android

Pour créer une simple PopupWindow fonctionnelle, nous devons faire ce qui suit :

popup_example.xml :

Code Java

LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

PopupWindow pw = new PopupWindow(inflater.inflate(R.layout.popup_example, null, false),100,100, true);

pw.showAtLocation(this.findViewById(R.id.main), Gravity.CENTER, 0, 0);

Ma exigence est que j'ai besoin d'un

et d'un

dans mon popup_example.xml. Comment puis-je gérer ces deux composants dans mon code Java ?

screenshot

121voto

Suragch Points 197

Comment créer une simple fenêtre contextuelle Android

Ceci est un exemple complet. C'est une réponse supplémentaire qui traite de la création d'une fenêtre contextuelle en général et non pas nécessairement des détails spécifiques du problème de l'OP. (L'OP demande un bouton d'annulation, mais ce n'est pas nécessaire car l'utilisateur peut cliquer n'importe où sur l'écran pour l'annuler.) Cela ressemblera à l'image suivante.

entrer la description de l'image ici

Créer une mise en page pour la fenêtre contextuelle

Ajoutez un fichier de mise en page à res/layout qui définit à quoi ressemblera la fenêtre contextuelle.

popup_window.xml

Insuffler et afficher la fenêtre contextuelle

Voici le code pour l'activité principale de notre exemple. Chaque fois que le bouton est cliqué, la fenêtre contextuelle est insufflée et affichée au-dessus de l'activité. Le fait de toucher n'importe où sur l'écran permet de fermer la fenêtre contextuelle.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onButtonShowPopupWindowClick(View view) {

        // insuffler la mise en page de la fenêtre contextuelle
        LayoutInflater inflater = (LayoutInflater)
                getSystemService(LAYOUT_INFLATER_SERVICE);
        View popupView = inflater.inflate(R.layout.popup_window, null);

        // créer la fenêtre contextuelle
        int width = LinearLayout.LayoutParams.WRAP_CONTENT;
        int height = LinearLayout.LayoutParams.WRAP_CONTENT;
        boolean focusable = true; // les tapes en dehors de la fenêtre permettent également de la fermer
        final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);

        // afficher la fenêtre contextuelle
        // peu importe quelle vue vous passez, elle est uniquement utilisée pour le jeton de fenêtre
        popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);

        // fermer la fenêtre contextuelle lorsqu'on touche
        popupView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                popupWindow.dismiss();
                return true;
            }
        });
    }
}

C'est tout. Vous avez terminé.

Suivant

Consultez comment les valeurs de gravité affectent PopupWindow.

Fenêtre contextuelle avec gravité basse et décalages

Vous pouvez également ajouter une ombre.

Fenêtre contextuelle avec ombre

Étude supplémentaire

Les ressources suivantes ont également été utiles pour apprendre à créer une fenêtre contextuelle :

75voto

Dinesh Sharma Points 7098

Ici, je vous donne un exemple de démo. Regardez ceci et personnalisez-le selon vos besoins.

public class ShowPopUp extends Activity {
    PopupWindow popUp;
    boolean click = true;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        popUp = new PopupWindow(this);
        LinearLayout layout = new LinearLayout(this);
        LinearLayout mainLayout = new LinearLayout(this);
        TextView tv = new TextView(this);
        Button but = new Button(this);
        but.setText("Cliquez ici");
        but.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (click) {
                     popUp.showAtLocation(layout, Gravity.BOTTOM, 10, 10);
                     popUp.update(50, 50, 300, 80);
                     click = false;
                } else {
                     popUp.dismiss();
                     click = true;
                }
            }
        });

        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT);
        layout.setOrientation(LinearLayout.VERTICAL);
        tv.setText("Bonjour, ceci est un exemple de texte pour une fenêtre contextuelle");
        layout.addView(tv, params);
        popUp.setContentView(layout);
        // popUp.showAtLocation(layout, Gravity.BOTTOM, 10, 10);
        mainLayout.addView(but, params);
        setContentView(mainLayout);
   }
}

J'espère que cela résoudra votre problème.

9voto

Rejinderi Points 3584

Avez-vous terminé l'inflation de la mise en page? peut-être que vous pouvez essayer ceci!!

View myPoppyView = pw.getContentView();
Button myBelovedButton = (Button)myPoppyView.findViewById(R.id.my_beloved_button);
//faites quelque chose avec mon bouton bien-aimé? :p

5voto

Chris Sullivan Points 21

Je construis ma propre classe, puis l'appelle depuis mon activité, en remplaçant de petites méthodes comme showAtLocation. J'ai trouvé que c'était plus facile lorsque j'ai 4 à 5 popups dans mon activité de le faire ainsi.

public class ToggleValues implements OnClickListener{

    private View pView;
    private LayoutInflater inflater;
    private PopupWindow pop;
    private Button one, two, three, four, five, six, seven, eight, nine, blank;
    private ImageButton eraser;
    private int selected = 1;
    private Animation appear;

    public ToggleValues(int id, Context c, int screenHeight){
        inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        pop = new PopupWindow(inflater.inflate(id, null, false), 265, (int)(screenHeight * 0.45), true);
        pop.setBackgroundDrawable(c.getResources().getDrawable(R.drawable.alpha_0));
        pView = pop.getContentView();

        appear = AnimationUtils.loadAnimation(c, R.anim.appear);

        one = (Button) pView.findViewById(R.id.one);
        one.setOnClickListener(this);
        two = (Button) pView.findViewById(R.id.two);
        two.setOnClickListener(this);
        three = (Button) pView.findViewById(R.id.three);
        three.setOnClickListener(this);
        four = (Button) pView.findViewById(R.id.four);
        four.setOnClickListener(this);
        five = (Button) pView.findViewById(R.id.five);
        five.setOnClickListener(this);
        six = (Button) pView.findViewById(R.id.six);
        six.setOnClickListener(this);
        seven = (Button) pView.findViewById(R.id.seven);
        seven.setOnClickListener(this);
        eight = (Button) pView.findViewById(R.id.eight);
        eight.setOnClickListener(this);
        nine = (Button) pView.findViewById(R.id.nine);
        nine.setOnClickListener(this);
        blank = (Button) pView.findViewById(R.id.blank_Selection);
        blank.setOnClickListener(this);
        eraser = (ImageButton) pView.findViewById(R.id.eraser);
        eraser.setOnClickListener(this);
    }

    public void showAtLocation(View v) {
        pop.showAtLocation(v, Gravity.BOTTOM | Gravity.LEFT, 40, 40);
        pView.startAnimation(appear);
    }

    public void dismiss(){ 
        pop.dismiss();
    }

    public boolean isShowing() {
        if(pop.isShowing()){
            return true;
        }else{
            return false;
        }
    }

    public int getSelected(){
        return selected;
    }

    public void onClick(View arg0) {
        if(arg0 == one){
            Sudo.setToggleNum(1);
        }else if(arg0 == two){
            Sudo.setToggleNum(2);
        }else if(arg0 == three){
            Sudo.setToggleNum(3);
        }else if(arg0 == four){
            Sudo.setToggleNum(4);
        }else if(arg0 == five){
            Sudo.setToggleNum(5);
        }else if(arg0 == six){
            Sudo.setToggleNum(6);
        }else if(arg0 == seven){
            Sudo.setToggleNum(7);
        }else if(arg0 == eight){
            Sudo.setToggleNum(8);
        }else if(arg0 == nine){
            Sudo.setToggleNum(9);
        }else if(arg0 == blank){
            Sudo.setToggleNum(0);
        }else if(arg0 == eraser){
            Sudo.setToggleNum(-1);
        }
        this.dismiss();
    }

}

5voto

SharpCx Points 1
LayoutInflater inflater = (LayoutInflater) SettingActivity.this.getSystemService(SettingActivity.LAYOUT_INFLATER_SERVICE); 
PopupWindow pw = new PopupWindow(inflater.inflate(R.layout.gd_quick_action_slide_fontsize, null),LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT, true);
pw.showAtLocation(SettingActivity.this.findViewById(R.id.setting_fontsize), Gravity.CENTER, 0, 0);
View v= pw.getContentView();
TextView tv=v.findViewById(R.id.....);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X