showDialog obsoleto. Qual è l'alternativa?


99

C'è qualcos'altro che dovrebbe essere chiamato?

showDialog(TIME_DIALOG_ID);

È in questo tutorial ma dice deprecato in Eclipse.

Risposte:


90

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

public final void showDialog (int id) Aggiunto nel livello API 1

Questo metodo è stato deprecato nel livello API 13. Utilizzare invece la nuova classe DialogFragment con FragmentManager; questo è disponibile anche su piattaforme precedenti tramite il pacchetto di compatibilità Android.

Versione semplice di showDialog (int, Bundle) che non accetta argomenti. Chiama semplicemente showDialog (int, Bundle) con argomenti nulli.

Perché

  • Un frammento che mostra una finestra di dialogo, fluttuante nella parte superiore della finestra della sua attività. Questo frammento contiene un oggetto Dialog, che viene visualizzato come appropriato in base allo stato del frammento. Il controllo della finestra di dialogo (decidere quando mostrarla, nasconderla, ignorarla) dovrebbe essere eseguita tramite l'API qui, non con chiamate dirette nella finestra di dialogo.
  • Ecco una bella discussione Android DialogFragment vs Dialog
  • Un'altra bella discussione sui vantaggi di DialogFragment rispetto a AlertDialog

Come risolvere?

Di Più


8

Da Activity#showDialog(int):

Questo metodo è deprecato.
Usa invece la nuova DialogFragmentclasse con FragmentManager; questo è disponibile anche su piattaforme precedenti tramite il pacchetto di compatibilità Android.


132
Quindi, invece di chiamare una semplice funzione, devi implementare ancora un'altra classe personalizzata? sigh
Cerin

4
Deprecato non è la stessa cosa di andato. Se una funzione deprecata funziona ancora e un'alternativa non è disponibile sulle piattaforme precedenti che voglio supportare, vado avanti e la uso comunque.
Edward Falk

@Edward Penso che ci sia un'alternativa per le piattaforme più vecchie, controlla qui: developer.android.com/reference/android/support/v4/app/…
Rui Posse

6

Per visualizzare la finestra di dialogo, è possibile utilizzare il codice seguente. Questo per visualizzare una semplice finestra di dialogo AlertDialog con più caselle di controllo:

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

Intestazione

Considerando che se stai usando la funzione showDialog per visualizzare una finestra di dialogo diversa o qualsiasi altra cosa secondo gli argomenti passati, puoi creare una funzione self e chiamarla sotto la onClickListener()funzione. Qualcosa di simile a:

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

e aggiungere il codice della finestra di dialogo indicato sopra nella definizione della funzione.


3

Questo codice ha funzionato per me. Soluzione facile ma probabilmente non è un modo preferito.

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

protected Dialog createdDialog(int id) {
    // Your code
}

ma come implementare il LIstener su quel metodo? Diciamo per la finestra di dialogo Data e ora .... @MishaLee
gumuruh

Android lo fa per te quando definisci l'attributo onClick in xml.
MishaLee

1
@gumuruh Android esegue Listener per te quando definisci l'attributo onClick in xml in questo modo: android: onClick = "onClick" e quindi il metodo sopra in Java. Se hai bisogno di un Listener personalizzato, devi definirne uno tu stesso. Maggiori dettagli sono in questo link alla
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 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.