web-dev-qa-db-ja.com

「二度と聞かないでください」ダイアログのポップアップボックスを作成するにはどうすればよいですか? Android

携帯電話で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!");
18
Zukky

[〜#〜]編集[〜#〜]:注意してください!先のコード重複。私はAndroid向けに開発していないため、以下のコードをリファクタリングすることはできません。

Android Preferencesに値を設定し、ダイアログが表示されるかどうかを確認します。

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

As you can see, I did "copy and paste" too. Changed only the message strings. It works beautifully.

45
Cengiz Can

カスタムダイアログを作成する必要があります。たとえば、カスタムコンテンツビューを設定するAlertDialogsetView() を使用)。そのカスタムレイアウトは、TextView(情報を表示するため)+ CheckBoxDo not ask me again)。ダイアログのボタンに設定されたOnClickListenerで、そのCheckBoxの状態を取得し、ユーザーがそれをチェックした場合は、設定にフラグを設定します(たとえば、ブール値true)。

次回ユーザーがアプリを使用するときは、設定からブール値を確認します。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>
8
Luksprog

コードの少ないソリューションがあります。説明は使用できず、ダイアログのタイトルとして渡すことができるのは情報のみであるため、完全ではありません。 MultiChoiceItemはチェックボックスに使用されます。

res/values/strings.xml内:

<string-array name="do_not_show_again_array">
    <item>Do not show again.</item>
</string-array>

次に、私のコードは次のようになります。

DialogInterface.OnClickListener dialogClickListener = new OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        // Do something here
    }
};
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
AlertDialog alertDialog = builder.setTitle("Title/Description")
        .setMultiChoiceItems(R.array.do_not_show_again_array, null, new OnMultiChoiceClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                appPrefs.setLocationOnStart(!isChecked);
            }
        })
        .setPositiveButton("Ja", dialogClickListener)
        .setNegativeButton("Nein", dialogClickListener).show();
}
3
Malachiasz

こんにちは私は チュートリアル をフォローしましたそして私はこのコードを見つけました
以下のコードを使用できます:

  AlertDialog.Builder adb= new

 AlertDialog.Builder(this);
  LayoutInflater adbInflater = 

 LayoutInflater.from(this);
  View eulaLayout = adbInflater.inflate

 (R.layout.activity_main, null);
  check = (CheckBox)

 eulaLayout.findViewById(R.id.skip);
  adb.setView(eulaLayout);
  adb.setTitle("Example:");
  adb.setMessage(Html.fromHtml("Type your 

  text here: "));
  adb.setPositiveButton("Ok", new

  DialogInterface.OnClickListener() {
        public void onClick(DialogInterface 

 dialog, int which) {
            String checkBoxResult = "NOT 

 checked";
            if (check.isChecked())  

 checkBoxResult = "checked";
              SharedPreferences settings = 

 getSharedPreferences(PREFS_NAME, 0);
              SharedPreferences.Editor 

 editor = settings.edit();
              editor.putString("noshow", 

 checkBoxResult);
              // Commit the edits!

            //  sunnovalthesis();

              editor.commit();
            return;
        } });

       adb.setNegativeButton("Cancel", new

    DialogInterface.OnClickListener() {
    public void onClick(DialogInterface 

     dialog, int which) {
        String checkBoxResult = "NOT 

    checked";
        if (check.isChecked())  

       checkBoxResult = "checked";
        SharedPreferences settings = 

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

        settings.edit();
          editor.putString("noshow", 

    checkBoxResult);
          // Commit the edits!

        //  sunnovalthesis();

          editor.commit();
            return;
    } });
     SharedPreferences settings = 

    getSharedPreferences(PREFS_NAME, 0);
  String noshow = settings.getString

     ("noshow", "NOT checked");
      if (noshow != "checked" ) adb.show();
1
dondondon

私はこの質問に対して明確で正しいアプローチを持っています

package com.example.user.testing;

import Android.content.DialogInterface;
import Android.content.SharedPreferences;
import Android.support.v7.app.AlertDialog;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.widget.CheckBox;

public class MainActivity extends AppCompatActivity {
CheckBox dontShowAgain;
public static final String PREFS_NAME = "MyPrefsFile1";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final AlertDialog.Builder adb = new             AlertDialog.Builder(MainActivity.this);
    LayoutInflater adbInflater = LayoutInflater.from(MainActivity.this);
    View eulaLayout = adbInflater.inflate(R.layout.checkbox, null);

    dontShowAgain = (CheckBox) eulaLayout.findViewById(R.id.skip);
    adb.setView(eulaLayout);
    adb.setTitle("Attention");
    adb.setMessage("Your message here");
    adb.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {


            SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
            SharedPreferences.Editor editor = settings.edit();
            editor.putBoolean("skipMessage", dontShowAgain.isChecked());
            editor.commit();
            dialog.cancel();
        }
    });

    adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    Boolean skipMessage = settings.getBoolean("skipMessage", false);
    if (skipMessage.equals(false)) {
        adb.show();
    }

}

} ``

1
Rohit Sai