showDialog không được dùng nữa. Giải pháp thay thế là gì?


99

Có thứ gì khác nên được gọi không?

showDialog(TIME_DIALOG_ID);

Nó nằm trong hướng dẫn này nhưng nói rằng không được dùng trong Eclipse.

Câu trả lời:


90

Từ http://developer.android.com/reference/android/app/Activity.html

public final void showDialog (int id) Đã thêm vào API cấp 1

Phương thức này không được chấp nhận ở cấp API 13. Thay vào đó, hãy sử dụng lớp DialogFragment mới với FragmentManager; điều này cũng có sẵn trên các nền tảng cũ hơn thông qua gói tương thích Android.

Phiên bản đơn giản của showDialog (int, Bundle) không nhận bất kỳ đối số nào. Đơn giản chỉ cần gọi showDialog (int, Bundle) với các đối số rỗng.

Tại sao

  • Một phân mảnh hiển thị cửa sổ hộp thoại, nổi trên đầu cửa sổ hoạt động của nó. Phân mảnh này chứa một đối tượng Hộp thoại, đối tượng này sẽ hiển thị nếu thích hợp dựa trên trạng thái của phân mảnh. Việc kiểm soát hộp thoại (quyết định thời điểm hiển thị, ẩn, loại bỏ nó) nên được thực hiện thông qua API ở đây, không phải với các lệnh gọi trực tiếp trên hộp thoại.
  • Đây là một cuộc thảo luận thú vị về Android DialogFragment vs Dialog
  • Một cuộc thảo luận thú vị khác DialogFragment lợi thế hơn AlertDialog

Giải quyết thế nào?

Hơn


8

Từ Activity#showDialog(int):

Phương pháp này không được dùng nữa.
Sử dụng DialogFragmentlớp mới với FragmentManagerthay thế; điều này cũng có sẵn trên các nền tảng cũ hơn thông qua gói tương thích Android.


132
Vì vậy, thay vì gọi một hàm đơn giản, bạn phải triển khai thêm một lớp tùy chỉnh khác? thở dài
Cerin

4
Không được dùng nữa không phải là thứ đã biến mất. Nếu một chức năng không dùng nữa vẫn hoạt động và một chức năng thay thế không có sẵn trên các nền tảng cũ hơn mà tôi muốn hỗ trợ, tôi vẫn tiếp tục và sử dụng nó.
Edward Falk

@Edward Tôi nghĩ rằng có một giải pháp thay thế cho các nền tảng cũ hơn, hãy kiểm tra tại đây: developer.android.com/reference/android/support/v4/app/…
Rui Posse

6

Để hiển thị hộp thoại, bạn có thể sử dụng mã sau. Đây là để hiển thị một hộp AlertDialog đơn giản với nhiều hộp kiểm:

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

Phần mở đầu

Trong khi nếu bạn đang sử dụng hàm showDialog để hiển thị các hộp thoại khác nhau hoặc bất cứ thứ gì theo các đối số được truyền vào, bạn có thể tạo một hàm self và có thể gọi nó dưới onClickListener()hàm. Cái gì đó như:

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

và thêm mã của hộp thoại đã cho ở trên trong định nghĩa hàm.


3

Mã này làm việc cho tôi. Sửa chữa dễ dàng nhưng có lẽ không phải là cách ưa thích.

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

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

nhưng làm thế nào để triển khai LIstener trên phương thức đó? Giả sử cho hộp thoại Ngày & Giờ .... @MishaLee
gumuruh

Android làm điều đó cho bạn khi bạn xác định thuộc tính onClick trong xml.
MishaLee

1
@gumuruh Android thực hiện Listener cho bạn khi bạn xác định thuộc tính onClick trong xml như sau: android: onClick = "onClick" và sau đó là phương thức ở trên trong Java. Nếu bạn cần một Trình xử lý tùy chỉnh thì bạn phải tự xác định một Trình nghe. Thông tin chi tiết có trong liên kết
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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.