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

本文介绍了如何在Android中创建自定义Dialog,包括设置透明背景、自定义布局和样式。通过示例代码展示了如何在Java中实现和使用这些自定义Dialog,并讨论了限制对话框消失的两种方法。此外,还提到了一个能与Activity交互的数据获取示例。
摘要由CSDN通过智能技术生成

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


	@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以后,就可以获取其中的值了。


好了,写完了。。。。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值