Làm thế nào để triển khai xác nhận (có / không) DialogPreference?


Câu trả lời:


292

Đó là một hộp thoại cảnh báo đơn giản , Federico đã cung cấp cho bạn một trang web để bạn có thể tra cứu mọi thứ.

Dưới đây là một ví dụ ngắn về cách có thể tạo hộp thoại cảnh báo.

new AlertDialog.Builder(this)
.setTitle("Title")
.setMessage("Do you really want to whatever?")
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int whichButton) {
        Toast.makeText(MainActivity.this, "Yaay", Toast.LENGTH_SHORT).show();
    }})
 .setNegativeButton(android.R.string.no, null).show();

3
Tôi biết cách xây dựng một Hộp thoại, nhưng câu hỏi của tôi về sở thích.
sh1ng

1
Câu hỏi của bạn là về sở thích? Được chứ. Hãy xem tại đây: kaloer.com/android-preferences
Maaalte

1
Tôi đã đọc nguồn này. Tôi có thể tạo Sở thích tùy chỉnh đã đăng ký với OnClick và xử lý nó, nhưng đó có phải là cách dễ nhất không?
sh1ng

Tôi nghĩ vậy, ít nhất tôi không biết cách nào khác dễ dàng hơn.
Maaalte

1
sử dụng nhập android.support.v7.app.AlertDialog; để có giao diện đẹp hơn mà không có chủ đề
majurageerthan

9

Android đi kèm với lớp YesNoPreference được tích hợp sẵn để thực hiện chính xác những gì bạn muốn (hộp thoại xác nhận với các tùy chọn có và không). Xem mã nguồn chính thức tại đây .

Thật không may, nó nằm trong com.android.internal.preference gói, có nghĩa là nó là một phần của các API riêng tư của Android và bạn không thể truy cập nó từ ứng dụng của mình (các lớp API riêng có thể thay đổi mà không cần thông báo, do đó là lý do tại sao Google không cho phép bạn truy cập chúng).

Giải pháp: chỉ cần tạo lại lớp trong gói ứng dụng của bạn bằng cách sao chép / dán mã nguồn chính thức từ liên kết tôi đã cung cấp. Tôi đã thử điều này và nó hoạt động tốt (không có lý do gì tại sao nó không nên).

Sau đó, bạn có thể thêm nó vào preferences.xmlnhư bất kỳ Sở thích nào khác. Thí dụ:

<com.example.myapp.YesNoPreference
    android:dialogMessage="Are you sure you want to revert all settings to their default values?"
    android:key="com.example.myapp.pref_reset_settings_key"
    android:summary="Revert all settings to their default values."
    android:title="Reset Settings" />

Trông như thế này:

ảnh chụp màn hình


1
Giải pháp tuyệt vời! Nhưng có một vấn đề với một trong những hàm tạo của lớp này! Nó tham chiếu đến một tập tin tài nguyên (com.android.internal.R.attr.yesNoPreferenceStyle)! Mà không thể giải quyết được. Giải pháp thay thế là gì? Tôi có phải tạo một cái trong dự án của riêng mình không ?!
reubenjohn

3

Sử dụng Tùy chọn ý định nếu bạn đang sử dụng màn hình xml tùy chọn hoặc bạn nếu bạn đang sử dụng màn hình tùy chỉnh thì mã sẽ giống như bên dưới

intentClearCookies = getPreferenceManager().createPreferenceScreen(this);
    Intent clearcookies = new Intent(PopupPostPref.this, ClearCookies.class);

    intentClearCookies.setIntent(clearcookies);
    intentClearCookies.setTitle(R.string.ClearCookies);
    intentClearCookies.setEnabled(true);
    launchPrefCat.addPreference(intentClearCookies);

Và sau đó Tạo lớp hoạt động giống như bên dưới, Là những người khác nhau với cách tiếp cận khác nhau, bạn có thể sử dụng bất kỳ cách tiếp cận nào bạn thích, đây chỉ là một ví dụ.

public class ClearCookies extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    showDialog();
}

/**
 * @throws NotFoundException
 */
private void showDialog() throws NotFoundException {
    new AlertDialog.Builder(this)
            .setTitle(getResources().getString(R.string.ClearCookies))
            .setMessage(
                    getResources().getString(R.string.ClearCookieQuestion))
            .setIcon(
                    getResources().getDrawable(
                            android.R.drawable.ic_dialog_alert))
            .setPositiveButton(
                    getResources().getString(R.string.PostiveYesButton),
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            //Do Something Here

                        }
                    })
            .setNegativeButton(
                    getResources().getString(R.string.NegativeNoButton),
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            //Do Something Here
                        }
                    }).show();
}}

Như đã nói trước đây, có một số cách làm điều này. Đây là một trong những cách bạn có thể thực hiện nhiệm vụ của mình, hãy chấp nhận câu trả lời nếu bạn cảm thấy rằng bạn đã đạt được điều bạn muốn.


Cảm ơn! Đây gần như là chính xác những gì tôi cần cho ứng dụng của mình vì tôi đang kích hoạt hộp thoại từ một dịch vụ và trong trường hợp của tôi, tôi cần một hoạt động để lưu trữ hộp thoại.
Ralph Ritoch

Yêu nó. IMHO dài dòng, nhưng được chấp thuận và đúng cách
John
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.