showDialog obsolète. Quelle est l'alternative?

99

Y a-t-il autre chose qui devrait être appelé?

showDialog(TIME_DIALOG_ID);

C'est dans ce tutoriel mais dit obsolète dans Eclipse.

Denis
la source

Réponses:

90

Depuis http://developer.android.com/reference/android/app/Activity.html

public final void showDialog (int id) Ajouté au niveau d'API 1

Cette méthode était obsolète au niveau d'API 13. Utilisez plutôt la nouvelle classe DialogFragment avec FragmentManager; ceci est également disponible sur les anciennes plates-formes via le package de compatibilité Android.

Version simple de showDialog (int, Bundle) qui ne prend aucun argument. Appelle simplement showDialog (int, Bundle) avec des arguments nuls.

Pourquoi

  • Un fragment qui affiche une fenêtre de dialogue flottant au-dessus de la fenêtre de son activité. Ce fragment contient un objet Dialog, qu'il affiche le cas échéant en fonction de l'état du fragment. Le contrôle de la boîte de dialogue (décider quand l'afficher, la masquer, la fermer) doit être effectuée via l'API ici, pas avec des appels directs sur la boîte de dialogue.
  • Voici une belle discussion Android DialogFragment vs Dialog
  • Une autre discussion intéressante sur les avantages de DialogFragment par rapport à AlertDialog

Comment résoudre?

Plus

Md Mahbubur Rahman
la source
8

De Activity#showDialog(int):

Cette méthode est obsolète.
Utilisez plutôt la nouvelle DialogFragmentclasse avec FragmentManager; ceci est également disponible sur les anciennes plates-formes via le package de compatibilité Android.

Matt Ball
la source
132
Donc, au lieu d'appeler une fonction simple, vous devez implémenter une autre classe personnalisée? soupir
Cerin
4
Déconseillé n'est pas la même chose que parti. Si une fonction obsolète fonctionne toujours et qu'une alternative n'est pas disponible sur les anciennes plates-formes que je souhaite prendre en charge, je continue et je l'utilise quand même.
Edward Falk le
@Edward Je pense qu'il existe une alternative pour les anciennes plates-formes, vérifiez ici: developer.android.com/reference/android/support/v4/app/...
Rui Posse
6

Pour afficher la boîte de dialogue, vous pouvez utiliser le code suivant. Ceci permet d'afficher une simple boîte de dialogue AlertDialog avec plusieurs cases à cocher:

AlertDialog.Builder alertDialog= new AlertDialog.Builder(MainActivity.this); .
            alertDialog.setTitle("this is a dialog box ");
            alertDialog.setPositiveButton("ok", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    Toast.makeText(getBaseContext(),"ok ive wrote this 'ok' here" ,Toast.LENGTH_SHORT).show();

                }
            });
            alertDialog.setNegativeButton("cancel", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                        Toast.makeText(getBaseContext(), "cancel ' comment same as ok'", Toast.LENGTH_SHORT).show();


                }
            });
            alertDialog.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                    // TODO Auto-generated method stub
                    Toast.makeText(getBaseContext(), items[which] +(isChecked?"clicked'again i've wrrten this click'":"unchecked"),Toast.LENGTH_SHORT).show();

                }
            });
            alertDialog.show();

Titre

Alors que si vous utilisez la fonction showDialog pour afficher une boîte de dialogue différente ou quoi que ce soit selon les arguments passés, vous pouvez créer une fonction auto et l'appeler sous la onClickListener()fonction. Quelque chose comme:

 public CharSequence[] items={"google","Apple","Kaye"};
public boolean[] checkedItems=new boolean[items.length];
Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bt=(Button) findViewById(R.id.bt);
    bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            display(0);             
        }       
    });
}

et ajoutez le code de la boîte de dialogue ci-dessus dans la définition de la fonction.

Khay
la source
3

Ce code a fonctionné pour moi. Solution facile mais probablement pas un moyen préféré.

public void onClick (View v) {
    createdDialog(0).show(); // Instead of showDialog(0);
}

protected Dialog createdDialog(int id) {
    // Your code
}
MishaLee
la source
mais comment implémenter le LIstener sur cette méthode? Disons pour la boîte de dialogue Date et heure .... @MishaLee
gumuruh
Android le fait pour vous lorsque vous définissez l'attribut onClick dans xml.
MishaLee
1
@gumuruh Android fait Listener pour vous lorsque vous définissez l'attribut onClick dans xml comme ceci: android: onClick = "onClick" puis la méthode ci-dessus en Java. Si vous avez besoin d'un écouteur personnalisé, vous devez en définir un vous-même. Plus de détails sont dans ce lien de
MishaLee
1
package com.keshav.datePicker_With_Hide_Future_Past_Date;

import android.app.DatePickerDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.DatePicker;
import android.widget.EditText;

import java.util.Calendar;

public class MainActivity extends AppCompatActivity {

    EditText ed_date;
    int year;
    int month;
    int day;

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

        ed_date=(EditText) findViewById(R.id.et_date);

        ed_date.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Calendar mcurrentDate=Calendar.getInstance();
                year=mcurrentDate.get(Calendar.YEAR);
                month=mcurrentDate.get(Calendar.MONTH);
                day=mcurrentDate.get(Calendar.DAY_OF_MONTH);

                final DatePickerDialog   mDatePicker =new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener()
                {
                    @Override
                    public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday)
                    {
                              ed_date.setText(new StringBuilder().append(year).append("-").append(month+1).append("-").append(day));
                            int month_k=selectedmonth+1;

                    }
                },year, month, day);
                mDatePicker.setTitle("Please select date");
                // TODO Hide Future Date Here
                mDatePicker.getDatePicker().setMaxDate(System.currentTimeMillis());

                // TODO Hide Past Date Here
                //  mDatePicker.getDatePicker().setMinDate(System.currentTimeMillis());
                mDatePicker.show();
            }
        });
    }
}


// Its Working 
Keshav Gera
la source