本文主要介绍一种简单的自定义Dialog样式的方法。
从实际开发的需求来说,当应用需要添加一些简单的信息的时候我们并不想单独再为这个功能开发一个独立的activity,大多数情况是使用对话框或者PopWindow的形式弹出浮窗供用户操作。
接下来介绍具体的实现过程,首先是自定义的一个布局文件用于替换Dialog窗体的主要内容
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/edt_name"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:paddingLeft="5dp"
android:gravity="center_vertical"
android:hint="please input appname"
android:textSize="16dp"
/>
<EditText
android:id="@+id/edt_count"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:paddingLeft="5dp"
android:gravity="center_vertical"
android:hint="please input appcount"
android:textSize="16dp"
/>
<EditText
android:id="@+id/edt_password"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:paddingLeft="5dp"
android:gravity="center_vertical"
android:hint="please input apppassword"
android:textSize="16dp"
/>
</LinearLayout>
在相应的activity中需要通过LayoutInflater来获取自定义布局文件的视图对象
//获取自定义Dialog view的视图以及组件的实例
mInflater = LayoutInflater.from(this);
layoutView = (LinearLayout) mInflater.inflate(R.layout.view_dialog, null);
edtName = (EditText) layoutView.findViewById(R.id.edt_name);
edtCount = (EditText) layoutView.findViewById(R.id.edt_count);
edtPassword = (EditText) layoutView.findViewById(R.id.edt_password);
然后将获取到的layoutView设置给Dialog
if (alertDialog == null) {
alertDialog = new AlertDialog.Builder(MainActivity.this).
setView(layoutView).setTitle("Add new appinfo").setPositiveButton("Add", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
User user = userDao.getUserById(uid);
AppInfo appInfo = new AppInfo(edtName.getText().toString(),
edtCount.getText().toString(), edtPassword.getText().toString(), user);
appInfoDao.add(appInfo);
myAdapter.addItem(appInfo);
myAdapter.refresh();
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create();
} else {
edtName.setText("");
edtCount.setText("");
edtPassword.setText("");
edtName.setHint("Please input appname");
edtCount.setHint("Please input appcount");
edtPassword.setHint("Please input apppassword");
}
alertDialog.show();
注意上面的代码中对alertDialog是否为空进行了判断,如果不判断的话每次都会创建新的Dialog,并给新的Dialog设置自定义的view,那么在Dialog dismiss之前或者当前的activity finish之前都必须手动去移除给Dialog设置的view,不然应用会报错。
因为只是为了实验和满足最原始的需求,并没有对UI样式优化,下图是最终实现的效果