今天心血来潮,想尝试弄一下自己的对话框,于是上网百度了一下,以下是原文出处
感谢作者,本文有所删改
先上效果图1
首先,是自定义的对话框布局文件activity_dialog.xml
注意第三个LinearLayout处的android:id="@+id/contentView"
这里添加id 的原因是为了方便后面对于中间内容的移除,添加其他布局,例如:列表(ListView)、单选(RadioButton)、复选(CheckButton)等,因为我们一开始默认是TextView;
此外,还有一个地方需要注意:
第一个LinearLayout的android:minWidth="280dp"
是用来设置最小宽度的,避免宽度过小
其次是自定义的MyDialog类:
package com.example.mydialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MyDialog extends Dialog{
public MyDialog(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyDialog(Context context,int theme) {
super(context,theme);
// TODO Auto-generated constructor stub
}
public static class Builder
{
private String title;
private String Msg;
private String positiveText,negativeText;
private View contentView;
private Context context;
//设置contentView的高度,否则如果是ListView会满屏
private int height=0;
private DialogInterface.OnClickListener pClickListener,nClickListener;
public Builder(Context context)
{
this.context=context;
}
public Builder setTitle(String title)
{
this.title=title;
return this;
}
public Builder setMessage(String message)
{
this.Msg=message;
return this;
}
public Builder setTitle(int title)
{
this.title=(String) context.getText(title);
return this;
}
public Builder setMessage(int message)
{
this.title=(String) context.getText(message);
return this;
}
public Builder setView(View view)
{
contentView=view;
return this;
}
public Builder setPositiveButton(String text,DialogInterface.OnClickListener listener)
{
positiveText=text;
pClickListener=listener;
return this;
}
public Builder setNegativeButton(String text,DialogInterface.OnClickListener listener)
{
negativeText=text;
nClickListener=listener;
return this;
}
public Builder setHeight(int height)
{
this.height=height;
return this;
}
public MyDialog create()
{
LayoutInflater inflater=(LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
final MyDialog dialog=new MyDialog(context, R.style.Dialog);
View layoutView=inflater.inflate(R.layout.activity_dialog, null);
dialog.addContentView(layoutView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
((TextView)layoutView.findViewById(R.id.activity_dialog_title)).setText(title);
if(positiveText!=null)
{
((Button)layoutView.findViewById(R.id.activity_dialog_positive_button)).setText(positiveText);
if(pClickListener!=null)
{
((Button)layoutView.findViewById(R.id.activity_dialog_positive_button))
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
pClickListener.onClick(dialog,DialogInterface.BUTTON_POSITIVE);
}
});
}
}
else {
layoutView.findViewById(R.id.activity_dialog_positive_button).setVisibility(View.GONE);
}
if(negativeText!=null)
{
((Button)layoutView.findViewById(R.id.activity_dialog_negative_button)).setText(negativeText);
if(nClickListener!=null)
{
((Button)layoutView.findViewById(R.id.activity_dialog_negative_button))
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
nClickListener.onClick(dialog,DialogInterface.BUTTON_NEGATIVE);
}
});
}
}
else {
layoutView.findViewById(R.id.activity_dialog_negative_button).setVisibility(View.GONE);
}
if(Msg!=null)
{
((TextView)layoutView.findViewById(R.id.activity_dialog_content)).setText(Msg);
}
else if(contentView!=null)
{
((LinearLayout)layoutView.findViewById(R.id.contentView)).removeAllViews();
if(height==0)
{
((LinearLayout)layoutView.findViewById(R.id.contentView))
.addView(contentView,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
else {
((LinearLayout)layoutView.findViewById(R.id.contentView))
.addView(contentView,new LayoutParams(LayoutParams.WRAP_CONTENT, height));
}
}
dialog.setContentView(layoutView);
//dialog.show();
return dialog;
}
}
}
其中final MyDialog dialog=new MyDialog(context, R.style.Dialog);是下面的style样式:
这里就是重写各种方法,理解起来应该也不是很难,虽然一大串,
接着是调用文件,大致如下:
new MyDialog.Builder(MainActivity.this).setTitle("我的表头")
.setMessage("messagefdlsjvlofjisdvipjhaifvophjiaopvhjiposahvjipashvipsahvio")
.setPositiveButton("confirm", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "positive", Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("cancle", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "negative", Toast.LENGTH_SHORT).show();
}
}).create().show();
new MyDialog.Builder(MainActivity.this).setTitle("我的表头")
红色部分切忌不能写成 getApplicationContext()
否则会报一下错误:
unable to add window
接着上效果图2
此处我们把中间的原本的TextView替换成了ListView
调用文件修改如下:
public class MainActivity extends Activity {
private String string[]=new String[]{"1","2","3","4","5","6","7","8","9","10"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View view=getLayoutInflater().inflate(R.layout.activity_listview, null,true);
final ListView l=(ListView) view.findViewById(R.id.listView);
ArrayAdapter
adapter=new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,string);
l.setAdapter(adapter);
((Button)findViewById(R.id.button)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new MyDialog.Builder(MainActivity.this).setTitle("我的表头")
.setView(l)
.setHeight(300)
.setPositiveButton("confirm", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "positive", Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("cancle", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "negative", Toast.LENGTH_SHORT).show();
}
}).create().show();
}
});
}
}
而且,这里的ListView不能有父组件,否则报以下错误:
the specified child already has a parent y
最后,可以在MyDialog类中设置各种组件的可见性,增加多样性,此处不予演示