我的学习之旅:android自定义Dialog

来源:互联网 发布:好弹幕软件下载 编辑:程序博客网 时间:2024/05/17 08:48

最近写到一个小项目,需要用到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>


在样式文件中,只要写的windowBackgroup设置为@null或自己想要的背景距可以去掉系统的边框和背景。

好了,下面看一下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;}@Overrideprotected 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() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubIntent 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;}@Overrideprotected 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{@Overridepublic 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() {//实现对话框中回调接口@Overridepublic void back(String majorName) {res_major_class.setText(majorName);}});dialog.show();

其中上面的res_major_class是一个TextView,这样通过回调接口的方法就可以获取到Dialog中的数据了;效果如下:



在点击其中一个item以后,就可以获取其中的值了。


好了,写完了。。。。

还有很多东西要学,希望能多学点,大神们多多指教。。。。

0 0
原创粉丝点击