showDialog застарілий. Яка альтернатива?


Відповіді:


90

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

публічне остаточне недійсне шоуDialog (int id) додано в API рівня 1

Цей метод був застарілий на рівні 13 API. Використовуйте новий клас DialogFragment з FragmentManager замість цього; це також доступно на старих платформах через пакет сумісності Android.

Проста версія showDialog (int, Bundle), яка не бере аргументів. Просто викликає showDialog (int, Bundle) з нульовими аргументами.

Чому?

  • Фрагмент, який відображає діалогове вікно, що плаває вгорі вікна його діяльності. Цей фрагмент містить об'єкт "Діалог", який він відображає у відповідних випадках залежно від стану фрагмента. Контроль діалогового вікна (вирішення, коли його показати, приховати, відхилити) повинен здійснюватися через API тут, а не при прямих дзвінках у діалоговому вікні.
  • Ось приємна дискусія Android DialogFragment проти Dialog
  • Ще одна приємна дискусія щодо переваг DialogFragment перед AlertDialog

Як вирішити?

Більше


8

Від Activity#showDialog(int):

Цей метод застарілий.
Використовуйте новий DialogFragmentклас за допомогою FragmentManager; це також доступно на старих платформах через пакет сумісності Android.


132
Отже, замість виклику простої функції, вам доведеться реалізувати ще один спеціальний клас? зітхання
Серін

4
Застарілий - це не те саме, що пішло. Якщо застаріла функція все ще працює, а альтернатива недоступна на старих платформах, які я хочу підтримувати, я продовжую її використовувати і все одно.
Едвард Фолк

@Edward Я думаю, що існує альтернатива для старих платформ, перевірте тут: developer.android.com/reference/android/support/v4/app/…
Rui Posse

6

Для відображення діалогового вікна ви можете використовувати наступний код. Це відображення простого вікна AlertDialog з кількома прапорцями:

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

Заголовок

Якщо ви використовуєте функцію showDialog для відображення іншого діалогового вікна або будь-якого іншого, що відповідає наведеним аргументам, ви можете створити функцію самоврядування та може викликати її під onClickListener()функцією. Щось на зразок:

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

і додайте код діалогового вікна, наведений вище, у визначенні функції.


3

Цей код працював на мене. Легке виправлення, але, ймовірно, не бажаний спосіб.

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

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

але як реалізувати LIstener за цим методом? Скажімо, для діалогу "Дата і час" .... @MishaLee
gumuruh

Android робить це для вас, коли ви визначаєте атрибут onClick у xml.
MishaLee

1
@gumuruh Android робить для вас слухачем, коли ви визначаєте атрибут onClick в xml, як це: android: onClick = "onClick", а потім метод вище в Java. Якщо вам потрібен користувальницький слухач, то його потрібно визначити самостійно. Більш детально ви знайдете це посилання
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 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.