如何制作“不要再问我”对话框弹出框?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (34)

我正尝试创建一个“提示”对话框,通知用户关于在手机上启用GPS会降低电池寿命。我希望它弹出,但有一个复选框,上面写着:“不要再问我了”。

我如何着手在Android中创建它?

AlertDialog.Builder prompt = new AlertDialog.Builder(this); 
prompt.setCancelable(false); 
prompt.setTitle("Warning"); 
prompt.setMessage ("HINT: Otherwise, it will use network to find" + 
                   "your location. It's inaccurate but saves on " + 
                   "battery! Switch GPS on for better accuracy " + 
                   "but remember it uses more battery!");
提问于
用户回答回答于

它在Android首选项中设置一个值,并检查它是否会显示对话框。

资源/布局中的checkbox.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_root"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:padding="10dp" >
    <CheckBox
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/skip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Ok please do not show again." >
    </CheckBox>
</LinearLayout>

Activity.java:

public class MyActivity extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile1";
    public CheckBox dontShowAgain;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    protected void onResume() {
        AlertDialog.Builder adb = new AlertDialog.Builder(this);
        LayoutInflater adbInflater = LayoutInflater.from(this);
        View eulaLayout = adbInflater.inflate(R.layout.checkbox, null);
        SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
        String skipMessage = settings.getString("skipMessage", "NOT checked");

        dontShowAgain = (CheckBox) eulaLayout.findViewById(R.id.skip);
        adb.setView(eulaLayout);
        adb.setTitle("Attention");
        adb.setMessage(Html.fromHtml("Zukky, how can I see this then?"));

        adb.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                String checkBoxResult = "NOT checked";

                if (dontShowAgain.isChecked()) {
                    checkBoxResult = "checked";
                }

                SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
                SharedPreferences.Editor editor = settings.edit();

                editor.putString("skipMessage", checkBoxResult);
                editor.commit();

                // Do what you want to do on "OK" action

                return;
            }
        });

        adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                String checkBoxResult = "NOT checked";

                if (dontShowAgain.isChecked()) {
                    checkBoxResult = "checked";
                }

                SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
                SharedPreferences.Editor editor = settings.edit();

                editor.putString("skipMessage", checkBoxResult);                    
                editor.commit();

                // Do what you want to do on "CANCEL" action

                return;
            }
        });

        if (!skipMessage.equals("checked")) {
            adb.show();
        }

        super.onResume();
    }
}

用户回答回答于

你将从首选项中检查布尔值,如果它设置为true,则不显示对话框,否则用户未检查CheckBox该对话框,以便再次向他显示对话框:

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;

public class DoNotShowDialog extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button action = new Button(this);
        action.setText("Start the dialog if the user didn't checked the "
                + "checkbox or if is the first run of the app.");
        setContentView(action);
        action.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                SharedPreferences prefs = PreferenceManager
                        .getDefaultSharedPreferences(DoNotShowDialog.this);
                boolean dialog_status = prefs
                        .getBoolean("dialog_status", false);//get the status of the dialog from preferences, if false you ,ust show the dialog
                if (!dialog_status) {
                    View content = getLayoutInflater().inflate(
                            R.layout.dialog_content, null); // inflate the content of the dialog
                    final CheckBox userCheck = (CheckBox) content //the checkbox from that view
                            .findViewById(R.id.check_box1);
                    //build the dialog
                    new AlertDialog.Builder(DoNotShowDialog.this) 
                            .setTitle("Warning")
                            .setView(content)
                            .setPositiveButton("Ok",
                                    new DialogInterface.OnClickListener() {

                                        public void onClick(
                                                DialogInterface dialog,
                                                int which) {
                                            //find our if the user checked the checkbox and put true in the preferences so we don't show the dialog again 
                                            SharedPreferences prefs = PreferenceManager
                                                    .getDefaultSharedPreferences(DoNotShowDialog.this);
                                            SharedPreferences.Editor editor = prefs
                                                    .edit();
                                            editor.putBoolean("dialog_status",
                                                    userCheck.isChecked());
                                            editor.commit();
                                            dialog.dismiss(); //end the dialog.
                                        }
                                    })
                            .setNegativeButton("Cancel",
                                    new DialogInterface.OnClickListener() {

                                        public void onClick(
                                                DialogInterface dialog,
                                                int which) {
                                            //find our if the user checked the checkbox and put true in the preferences so we don't show the dialog again
                                            SharedPreferences prefs = PreferenceManager
                                                    .getDefaultSharedPreferences(DoNotShowDialog.this);
                                            SharedPreferences.Editor editor = prefs
                                                    .edit();
                                            editor.putBoolean("dialog_status",
                                                    userCheck.isChecked());
                                            editor.commit();
                                            dialog.dismiss();

                                        }
                                    }).show();
                } else {
                    //the preferences value is true so the user did checked the checkbox, so no dialog
                    Toast.makeText(
                            DoNotShowDialog.this,
                            "The user checked the checkbox so we don't show the dialog any more!",
                            Toast.LENGTH_LONG).show();
                }
            }
        });
    }
}

以及对话框(R.layout.dialog_content)的内容布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Enabling GPS on your phone will decrease battery life!" />

    <CheckBox
        android:id="@+id/check_box1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Do not ask me again!" />

</LinearLayout>

扫码关注云+社区