自定义 AlertDialog 的实现代码,能满足大部分dialog的需求,在使用的时候只需传入你自己的布局即可得到你想要的布局样式。
先上图:
要传入的dialog布局:
dialog.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/gray" >
<RelativeLayout
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/white" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:text="性别"
android:textSize="18sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/sex_m"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_below="@id/title"
android:background="@color/white" >
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="15dp"
android:gravity="center_vertical"
android:text="男"
android:textSize="15sp" />
<TextView
android:id="@+id/choose_m"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:gravity="center_vertical"
android:text="√"
android:textColor="@color/light_blue"
android:textSize="20sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/sex_f"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_below="@id/sex_m"
android:layout_marginTop="1dp"
android:background="@color/white" >
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="15dp"
android:gravity="center_vertical"
android:text="女"
android:textSize="15sp" />
<TextView
android:id="@+id/choose_f"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:gravity="center_vertical"
android:visibility="gone"
android:text="√"
android:textColor="@color/light_blue"
android:textSize="20sp" />
</RelativeLayout>
</RelativeLayout>
自定义的AlertDialog类:
CustomAlertDialogUtil.java
import android.app.Activity;
import android.app.AlertDialog;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager.LayoutParams;
/**
* 自定义 AlertDialog 的实现代码,能满足大部分dialog的需求
*
*/
public class CustomAlertDialogUtil {
AlertDialog dialog;
public void showDialog(Activity activity, View view){
//创建一个AlertDialog对象
dialog = new AlertDialog.Builder(activity).create();
//把自定义的布局设置到dialog中,注意,布局设置一定要在show之前。从第二个
//参数分别填充内容与边框之间左、右、上、下的像素
dialog.setView(view, 0, 0, 0, 0);
//(java.lang.IllegalStateException: The specified child
//already has a parent. You must call removeView() on the child's parent first)
//的解决方法
ViewGroup parent = (ViewGroup) view.getParent();
if(parent != null){
parent.removeAllViews();
}
dialog.show();//一定要先show出来再设置dialog的参数,不然就不会改变dialog的大小了
//得到当前显示设备的宽度,单位是像素
int width = activity.getWindowManager().getDefaultDisplay().getWidth();
//得到这个dialog界面的参数对象
LayoutParams params = dialog.getWindow().getAttributes();
params.width = width - (width / 6);//设置dialog的界面宽度
params.height = LayoutParams.WRAP_CONTENT;//设置dialog高度为包裹内容
params.gravity = Gravity.CENTER;//设置dialog的重心
dialog.getWindow().setAttributes(params);//最后把这个参数对象设置进去,即与dialog绑定
}
/**
* 关闭对话框
*/
public void dismiss(){
dialog.dismiss();
}
}
在Activity中的使用:
MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView choose_sex;
private View view;
private RelativeLayout sex_m;
private RelativeLayout sex_f;
private TextView choose_m;
private TextView choose_f;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
choose_sex = (TextView) findViewById(R.id.choose_sex);
view = getLayoutInflater().inflate(R.layout.dialog, null);
sex_m = (RelativeLayout) view.findViewById(R.id.sex_m);
sex_f = (RelativeLayout) view.findViewById(R.id.sex_f);
choose_m = (TextView) view.findViewById(R.id.choose_m);
choose_f = (TextView) view.findViewById(R.id.choose_f);
choose_sex.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
final CustomAlertDialogUtil dialog = new CustomAlertDialogUtil();
dialog.showDialog(MainActivity.this, view);
//男点击事件
sex_m.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
choose_m.setVisibility(View.VISIBLE);//男的显示
choose_f.setVisibility(View.GONE);//女的隐藏
dialog.dismiss();
}
});
//女点击事件
sex_f.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
choose_m.setVisibility(View.GONE);//男的隐藏
choose_f.setVisibility(View.VISIBLE);//女的显示
dialog.dismiss();
}
});
}
});
}
}