最近写到一个小项目,需要用到Dialog,一看发现android提供的Dialog不是我想要的那种样式,只好自己写一个。菜鸟嘛,得记录一下,方便自己以后能查。
不说多了,直接上代码:
首先,看一下Dialog的布局文件(res_wrong_dialog.xml):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="230dip"
android:layout_height="wrap_content"
android:layout_gravity="center" >
<ImageView
android:layout_width="20dip"
android:layout_height="20dip"
android:id="@+id/wrong_icon"
android:layout_marginRight="3dip"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:src="@drawable/res_wrong_doc"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="40dip"
android:id="@+id/wrong_title"
android:layout_marginLeft="5dip"
android:layout_toRightOf="@+id/wrong_icon"
android:gravity="center"
android:text="传输出错!"
android:textSize="16sp"
android:textColor="#28bee3"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/wrong_divider"
android:layout_below="@+id/wrong_title"
android:src="@drawable/divider"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/wrong_message"
android:layout_below="@+id/wrong_divider"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip"
android:textSize="18sp"
android:gravity="center_vertical"
android:text="请检查填写信息是否完整!"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/wrong_divider1"
android:layout_below="@+id/wrong_message"
android:src="@drawable/divider"/>
<Button
android:layout_width="80dip"
android:layout_height="35dip"
android:id="@+id/wrong_btn"
android:layout_below="@+id/wrong_divider1"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip"
android:text="确定"
android:gravity="center"
android:background="#38bee3"
android:layout_centerInParent="true"/>
</RelativeLayout>
布局中布局了提示的图标、标题、内容和一个确定按钮。
因为需要一个透明的Dialog,所以在style文件中定义自己想要的样式(styles.xml):
<style name="Translucent_NoTitle" parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item><!-- 没有标题 -->
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowBackground">@drawable/res_dialog_frame</item><!-- 自己想要的背景 -->
<item name="android:background">@android:color/transparent</item><!-- 透明背景 -->
<item name="android:windowFrame">@null</item><!-- 没边框 -->
<item name="android:backgroundDimAmount">0.8</item> <!-- 灰度 -->
</style>
好了,下面看一下Java文件,(Res_WrongDialog.java):
public class Res_WrongDialog extends Dialog {
private String wrongTitle ;
private String wrongMessage;
private TextView wrong_title, wrong_message;
private Button wrong_btn;
Context context;
public Res_WrongDialog(Context context, String wrongTitle, String wrongMessage) {
super(context, R.style.Translucent_NoTitle);
this.context = context;
this.wrongTitle = wrongTitle;
this.wrongMessage = wrongMessage;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.res_wrong_dialog);
wrong_title = (TextView) findViewById(R.id.wrong_title);
wrong_message = (TextView) findViewById(R.id.wrong_message);
wrong_btn = (Button) findViewById(R.id.wrong_btn);
wrong_title.setText(wrongTitle);
wrong_message.setText(wrongMessage);
wrong_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(context, RegActivity.class);
context.startActivity(intent);
((Activity) context).finish();
// 设置切换动画
((Activity) context).overridePendingTransition(R.anim.slide_up_in, R.anim.slide_down_out);
Res_WrongDialog.this.dismiss();
}
});
}
}
上面的是继承了Dialog,使用了自定义的样式后,Dialog就没有了标题,边框和背景都被改变。但是在自定义的Dialog中一定要实现onCreate()方法才能渲染。按钮实现的功能就是Dialog消失。
在MainActivity中使用自定义的Dialog:
Res_WrongDialog wrongDialog = new Res_WrongDialog(context, "网络传输出错!", " 请检查你的信息是否填写完整或有误,网络配置是否有误。同时联系工作人员检查网络是否开通!");
if(!isFinishing()){
wrongDialog.show();
}
wrongDialog.setCancelable(false);<pre name="code" class="java">
if判断语句是确定所在的Activity是否还是运行,因为Dialog只能添加到一个运行的Activity中,如果添加的Dialog所在的Activity已经不存在的话,会抛出异常。
在对话框中,触摸对话框以外的都会使对话框消失,有时候我们只限制点击对话框中的按钮才让对话框消失,其实要让限制对话框有两种方法:
第一种方法就像我上面的最后一条语句那样:
wrongDialog.setCancelable(false);
setCanceleanble(false)这个方法,可以限制按对话框以外的地方不起作用,按返回键也不起作用。
第二种方法就是使用setCanceledOnTouchOutside(false)这个方法,这个方法的限制性没有第一种那个大,按对话框以外的地方不起作用,但是按返回键还是其作用的。
效果如下:
这是一个没有与Activity进行信息交互的自定义Dialog,下面写一个所在Activity能获取Dialog中数据的。
同样,先看一下布局文件(res_list_dialog.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@drawable/divider"
android:id="@+id/list_dialog">
</ListView>
</LinearLayout>
布局文件很简单,只有一个ListView。
下面是自定义的Dialog的Java文件(Res_ListDialog):
public class Res_ListDialog extends Dialog {
public interface OnResListDialogListener {
public void back(String majorName);
}
private ListView major_listView;
private String[] majordata;
OnResListDialogListener dialoglistener;
public Res_ListDialog(Context context, String[] majordata,
OnResListDialogListener dialoglistener) {
super(context, R.style.Translucent_NoTitle);
this.majordata = majordata;
this.dialoglistener = dialoglistener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.res_list_dialog);
major_listView = (ListView) findViewById(R.id.list_dialog);
SimpleAdapter adapter = new SimpleAdapter(getContext(),
getData(majordata), R.layout.res_list_dialog_item,
new String[] { "className" }, new int[] { R.id.list_dialog_item });
major_listView.setAdapter(adapter);
ClickListener listener = new ClickListener();
major_listView.setOnItemClickListener(listener);
}
private List<HashMap<String, Object>> getData(String[] datas) {
List<HashMap<String, Object>> dataList = new ArrayList<HashMap<String, Object>>();
for (String data : datas) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("className", data);
dataList.add(map);
}
return dataList;
}
public class ClickListener implements OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
dialoglistener.back(majordata[arg2]);
Res_ListDialog.this.dismiss();
}
}
}
先解释一下上面的代码,上面的代码中定义了一个接口,这是一个回调接口,通过在Activity中实现回调接口中的方法,就可以实现数据间是传递和交互了,Dialog中的构造方法也很重要,因为通过构造方法传一个回调接口的回来,而这个回调接口已经在Activity中实现了的。现在还不能看得出交互,下面看一下MainActivity中的代码就可以知道了:
Res_ListDialog dialog = new Res_ListDialog(context,majordata,new Res_ListDialog.OnResListDialogListener() {
//实现对话框中回调接口
@Override
public void back(String majorName) {
res_major_class.setText(majorName);
}
});
dialog.show();
其中上面的res_major_class是一个TextView,这样通过回调接口的方法就可以获取到Dialog中的数据了;效果如下:
在点击其中一个item以后,就可以获取其中的值了。
好了,写完了。。。。
还有很多东西要学,希望能多学点,大神们多多指教。。。。