showDialog jest przestarzałe. Jaka jest alternatywa?

99

Czy jest coś jeszcze, co należy nazwać?

showDialog(TIME_DIALOG_ID);

Jest w tym samouczku, ale w Eclipse jest napisane jako przestarzałe .

Denis
źródło

Odpowiedzi:

90

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

public final void showDialog (int id) Dodano na poziomie API 1

Ta metoda była przestarzała na poziomie API 13. Zamiast tego użyj nowej klasy DialogFragment z FragmentManager; jest to również dostępne na starszych platformach za pośrednictwem pakietu zgodności z systemem Android.

Prosta wersja showDialog (int, Bundle), która nie przyjmuje żadnych argumentów. Po prostu wywołuje showDialog (int, Bundle) z pustymi argumentami.

Czemu

  • Fragment, który wyświetla okno dialogowe, unoszące się nad oknem jego aktywności. Ten fragment zawiera obiekt Dialog, który jest odpowiednio wyświetlany na podstawie stanu fragmentu. Sterowanie oknem dialogowym (decydowanie, kiedy je pokazać, ukryć, zamknąć) powinno odbywać się za pośrednictwem interfejsu API tutaj, a nie za pomocą bezpośrednich wywołań w oknie dialogowym.
  • Oto fajna dyskusja Android DialogFragment vs Dialog
  • Kolejna fajna dyskusja, zalety DialogFragment w porównaniu z AlertDialog

Jak rozwiązać?

Więcej

Md Mahbubur Rahman
źródło
8

Od Activity#showDialog(int):

Ta metoda jest przestarzała. Zamiast tego
użyj nowej DialogFragmentklasy z FragmentManager; jest to również dostępne na starszych platformach za pośrednictwem pakietu zgodności z systemem Android.

Matt Ball
źródło
132
Więc zamiast wywoływać prostą funkcję, musisz zaimplementować kolejną niestandardową klasę? westchnienie
Cerin
4
Wycofane to nie to samo, co zniknęło. Jeśli przestarzała funkcja nadal działa, a alternatywa nie jest dostępna na starszych platformach, które chcę obsługiwać, i tak używam jej.
Edward Falk
@Edward Myślę, że istnieje alternatywa dla starszych platform, sprawdź tutaj: developer.android.com/reference/android/support/v4/app/…
Rui Posse
6

Aby wyświetlić okno dialogowe, możesz użyć następującego kodu. Ma to na celu wyświetlenie prostego okna AlertDialog z wieloma polami wyboru:

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

Nagłówek

Natomiast jeśli używasz funkcji showDialog do wyświetlania innego okna dialogowego lub czegokolwiek zgodnie z przekazanymi argumentami, możesz utworzyć funkcję własną i wywołać ją w ramach onClickListener()funkcji. Coś jak:

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

i dodaj kod okna dialogowego podanego powyżej w definicji funkcji.

Khay
źródło
3

Ten kod zadziałał dla mnie. Łatwa naprawa, ale prawdopodobnie nie jest to preferowany sposób.

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

protected Dialog createdDialog(int id) {
    // Your code
}
MishaLee
źródło
ale jak zaimplementować LIstener w tej metodzie? Powiedzmy w oknie dialogowym Data i godzina .... @MishaLee
gumuruh
Android robi to za Ciebie, kiedy definiujesz atrybut onClick w xml.
MishaLee
1
@gumuruh Android robi Listener za Ciebie, kiedy zdefiniujesz atrybut onClick w xml w następujący sposób: android: onClick = "onClick", a następnie powyższą metodę w Javie. Jeśli potrzebujesz niestandardowego Listenera, musisz sam go zdefiniować. Więcej szczegółów w tym linku do
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
źródło