我正在尝试创建一个“提示”对话框,通知用户在手机上启用GPS会降低电池寿命。我希望它弹出,但有一个复选框,上面写着:“别再问我了”。
如何在Android中创建此功能?
谢谢,
Zukky。
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!");
答案 0 :(得分:44)
编辑:小心!代码重复提前。由于我不再为Android开发,我无法重构下面的代码。
它在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();
}
}
答案 1 :(得分:8)
您必须制作自定义对话框,例如AlertDialog
,您可以在其中设置自定义内容视图(使用setView()
)。该自定义布局可以是TextView
(用于显示信息)+ CheckBox
(带Do 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>
答案 2 :(得分:3)
我有更少的代码解决方案。它并不完美,因为不能使用描述,只能将信息作为对话框的标题传递。 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 :(得分:1)
嗨我跟着tutorial,我找到了这段代码 您可以使用以下代码:
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();
答案 4 :(得分:1)
我对这个问题有一个明确和正确的方法
string output= Regex.Replace(input, "^([\\d.]+)", "\\t");
}``