AlertDialog是最常用的Dialog实现之一,提供了个各种选项
1)首先是最简单的实现
public void simple(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("这是个啥").setIcon(R.drawable.ic_launcher)
.setMessage("你猜啊,傻逼");
setPositiveButton(builder);
setNegativeButton(builder).create().show();
}
2)简单的列表对话框
public void simpleList(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("无力改变").setIcon(R.drawable.ic_launcher)
// .setMessage("你猜啊,傻逼") //不能和setItems一起使用
.setItems(items, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mTextView.setText("亲,你选的是" + items[which]);
}
});
builder.show();
// setPositiveButton(builder);
// setNegativeButton(builder).create().show();
}
3)单选对话框
public void singleChoice(View v) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("结局已定").setIcon(R.drawable.ic_launcher)
.setSingleChoiceItems(items, 0, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mTextView.setText("亲,你选的是" + items[which]);
}
});
setPositiveButton(builder);
setNegativeButton(builder).create().show();
}
4)多选对话框
public void mutiChoice(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("hi,biath")
.setIcon(R.drawable.ic_launcher)
.setMultiChoiceItems(items,
new boolean[] { false, false, false },
new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which, boolean isChecked) {
if (isChecked) {
list.add(which);
} else {
list.remove(which);
}
}
}).setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mTextView.setText("你选择的是:\n");
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
mTextView.append(items[iterator.next()] + "\n");
}
// 清空容器
list.clear();
}
});
setNegativeButton(builder).create().show();
}
5)自定义列表的对话框,通过设置adapter设置数据
public void customChoice(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("结局已定")
.setIcon(R.drawable.ic_launcher)
.setAdapter(
new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, items),
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
Toast.makeText(getApplicationContext(), "我就去了",
0).show();
}
});
setPositiveButton(builder);
setNegativeButton(builder).create().show();
}
6)自定义的对话框
public void customView(View v) {
LinearLayout layout = (LinearLayout) getLayoutInflater().inflate(
R.layout.dialog_dialogactivity, null, false);
final EditText mUsername = (EditText) layout
.findViewById(R.id.et_dialog_username);
final EditText mPassword = (EditText) layout
.findViewById(R.id.et_dialog_password);
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
.setTitle("自定义View ").setIcon(R.drawable.ic_launcher)
.setView(layout).setPositiveButton("登录", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(
getApplicationContext(),
"你的用户名为:" + mUsername.getText().toString()
+ "\n密码"
+ mPassword.getText().toString(), 0)
.show();
}
}).setNegativeButton("取消", null);
builder/* .create().show(); */
.create().show();
}
public void progressDialog(View v) {
// 最后一个参数是点击外部是否dismiss
ProgressDialog.show(this, "正在执行", "正在加载内容,请稍后...(一万年)", true, true);
}
8)有进度条的ProgressDialog
public void progressDialog2(View v) {
ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Hello");
progressDialog.setMessage("正在加载哦。。。");
// 返回键可以取消对话框
progressDialog.setCancelable(true);
progressDialog.setMax(250);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 设置是否显示进度
progressDialog.setIndeterminate(true);
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
}
有时候点击negativeButton或者PositiveButton不希望对话框dismiss,可以使用下面的方法来阻止
private void setMShowing(DialogInterface dialog, boolean mShowing) {
try {
Field field = dialog.getClass().getSuperclass()
.getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, mShowing);
} catch(Exception e) {
e.printStackTrace();
}
}
通过DialogFragment来管理和显示对话框
简单来说,DialogFragment就是包含了对话框的Fragment
DialogFragment是在Android 3.0(API level 11)中引入的,代替了已经不建议使用的Activity.onCreateDialog和Activity.onPrepareDialog
DialogFragment高效的封装和管理对话框的生命周期,让Fragment和它包含的对话框状态保持一致,在旋转屏幕时也不会出现对话框消失的情况,所以这是Google推荐的使用方式。
1)首先看看xml文件,一个自定义的对话框布局,没有什么特别的
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ec8628" >
<TextView
android:id="@+id/tv_username"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:gravity="center_vertical"
android:text="Username:" />
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_toRightOf="@id/tv_username"
android:imeOptions="actionDone"
android:inputType="text" />
<Button
android:id="@+id/bt_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/et_username"
android:layout_centerHorizontal="true"
android:text="ok" />
</RelativeLayout>
2)写一个MyDialogFragment类,继承DialogFragment,重写里面的onCreateView方法,调用 getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE)可去掉对话框的标题,setStyle(style, 0)可以设置对话框的样式,但需要在onCreateView之前调用
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 调用可去掉标题栏
// getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
// 不能再onCreate中用
getDialog().setTitle("自定义对话框");
View view = inflater.inflate(R.layout.dialogfragment, container);
return view;
}
3)重写onCreateDialog来实现,注意不能同时重写onCreateDialog和onCreateView方法,否则会报错
在这里就可以直接用AlertDialog来实现,与Activity的数据交互,采用的是一个接口来实现,代码如下:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("爱你YYYYY").setMessage("通过AlertDialog创建的对话框")
.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((DialogFragmentClick) getActivity()).positiveClick();
}
}).setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((DialogFragmentClick) getActivity()).negativeClick();
}
});
return builder.create();
}
//定义接口,用于与Activity交互
public interface DialogFragmentClick {
void negativeClick();
void positiveClick();
}
下面是Activity的程序:
package com.example.lzy_dialog;
import android.app.Activity;
import android.app.DialogFragment;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.example.lzy_dialog.MyDialogFragment.DialogFragmentClick;
public class DialogFragmentActivity extends Activity implements
DialogFragmentClick {
private MyDialogFragment fragment;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog_fragment);
context = this;
}
public void dialogfragment(View view) {
// 移除之前的
fragment = (MyDialogFragment) getFragmentManager().findFragmentByTag(
"fragment");
if (fragment != null) {
getFragmentManager().beginTransaction().remove(fragment);
}
// 显示对话框
fragment = MyDialogFragment.newInstance(DialogFragment.STYLE_NO_FRAME);
fragment.setCancelable(false);
fragment.show(getFragmentManager(), "fragment");
}
@Override
public void negativeClick() {
Toast.makeText(context, "点击了取消", 0).show();
}
@Override
public void positiveClick() {
Toast.makeText(context, "点击了确定", 0).show();
}
}
点击下载源码