我的学习之旅: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>
好了,下面看一下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
- 我的学习之旅:android自定义Dialog
- android学习之-自定义Dialog
- android学习之自定义dialog
- 我的Android成长之路(13)----自定义dialog
- android之自定义dialog
- Android之自定义dialog
- Android之自定义dialog
- Android之自定义Dialog
- Android 之 自定义Dialog
- android自定义之Dialog
- Android之自定义activity的Dialog
- android之Dialog自定义引发的血案
- android Dialog的自定义
- 自定义Android的Dialog
- Android 自定义的Dialog
- android 自定义的dialog
- 学习笔记之自定义Dialog
- 【Android学习笔记】自定义Dialog
- just do it!
- hdu 4864 Task(贪心)
- Windows下C++服务端和客户端Socket通信简单代码
- hadoop学习笔记1.使用shell和JAVA API操作HDFS
- Android_LogCat错误汇总
- 我的学习之旅:android自定义Dialog
- 杭电1021递归太严重,过不了
- 并查集
- 四种操作xml的方式: SAX, DOM, JDOM , DOM4J的比较
- Rating - HDU 4870 期望dp
- 杭电1021大神教的
- Android的webview加载本地html、本apk内html和远程URL
- Q13.2
- OpenGL ES Programming Guide for iOS 使用OpenGL ES和GLKit绘图