简单的对话框,相信android SDK提供的差不多可以满足了,但有时候我们还是难以避免要自己定义,例如说,文件管理对话框、打开文件对话框、甚至输入法之类比较复杂的,在前面的学习中,我自己就做了一个打开文件的对话框,功能很简单,就是扫描目录下的文件,然后遍历输出到对话框的listview上,加上些事件监听,就OK了,具体功能就不讲了,主要用到的类,就是java.io.File还有listview,重点还是放在对话框的定义上,源码还是有参考网上的。

首先,对话框的XML布局文件。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:orientation="vertical"
    android:background="#F0F0F0">
    
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingTop="5dip"
        android:paddingBottom="5dip"
        android:background="@drawable/titlebar_bg"
        >
        <Button 
            android:id="@+id/btn_back"
            android:layout_width="60dip"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:gravity="center"
            android:text="返回"
            android:textSize="12dip"
            android:textColor="#FFFFFF"
            android:background="@drawable/button_bg"/>
        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center_vertical"
            android:text="选择文件"
            android:textSize="12dip"
            android:textColor="#FFFFFF"
            />
        <Button 
            android:id="@+id/btn_ok"
            android:layout_width="60dip"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:gravity="center"
            android:text="确定"
            android:textSize="12dip"
            android:textColor="#FFFFFF"
            android:background="@drawable/button_bg"/>
    </RelativeLayout>
    <TextView 
        android:id="@+id/current_path"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="5dip"
        android:gravity="center_vertical"
        android:text=""
        android:textColor="#282828"
        android:textSize="12dip"/>
    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:orientation="vertical">
        <ListView 
           android:id="@+id/path_list"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:scrollbars="vertical"
           >
           </ListView>
    </LinearLayout>

</LinearLayout>

下来是代码实现,继承Dialog类,主要还是放在构造函数这里,前3个构造函数是eclipse帮我们生成的,继承的基类构造函数,重点在后两个,第四个构造函数,实现了默认对话框大小(因为我是做打开文件对话框,自然希望打开之后能覆盖掉之前activity页面,因此默认对话框大小基本上就是实现了全覆盖),第五个构造函数,用的自定义大小,其他主要看代码注释 

public CustomFileDialog(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	public CustomFileDialog(Context context, int theme) {
		super(context, theme);
		// TODO Auto-generated constructor stub
	}

	public CustomFileDialog(Context context, boolean cancelable,
			OnCancelListener cancelListener) {
		super(context, cancelable, cancelListener);
		// TODO Auto-generated constructor stub
	}
         /**自定义大小的构造函数
         * @param theme Dialog主题样式
         * @param layout dialog布局样式
         * @param filter 筛选文件类型,这个是我自己项目需要的东西
         * @param callback 回调接口,主要是用来实现数据返回,后面有说明
         */
	public CustomFileDialog(Context context,int theme
			,int layout,String filter,CallBackData callback){
		super(context,theme);
		setContentView(layout);
		this.callback = callback;//类成员CallBackData实现回调接口
		this.fileFilter = filter;
		// 以下设置对话大小
		Window window = this.getWindow();
		DisplayMetrics dm = context.getResources().getDisplayMetrics();
		WindowManager.LayoutParams wdlp = window.getAttributes();
		wdlp.width = dm.widthPixels;
		wdlp.height = (int)(dm.heightPixels*0.95);//此处如果不*0.95的话,实际运行会发现对话框稍微高了点,底部被遮住了,主要是程序标题栏的关系,我懒,直接缩小点,就差不多了,也不会影响UI
		wdlp.gravity = Gravity.CENTER;
		window.setAttributes(wdlp);
		makeShowList();
		

	}
         /**
         *  这个函数跟上头都差不多,接受的尺寸单位是dip,毕竟我们多数时候还是使用dip做单位的
         *  在方法内部,做了一下dip和px的转换,因为WindowManager.LayoutParams类接受的单位是像素
         *  其他的看代码
         *
         */
	public CustomFileDialog(Context context,int width,int height,
			int theme,int layout,String filter,CallBackData callback){
		super(context,theme);
		setContentView(layout);
		this.callback = callback;
		this.fileFilter = filter;
		// set window params
		Window window = this.getWindow();
		float density = context.getResources().getDisplayMetrics().density;
		WindowManager.LayoutParams wdlp = window.getAttributes();
		wdlp.width = (int)(width*density);
		wdlp.height = (int)(height*density);
		wdlp.gravity = Gravity.CENTER;
		window.setAttributes(wdlp);
		makeShowList();
	}

 这里顺带说一下我用的对话框样式,在values/styles.xml中定义:

<style name="DialogTheme" parent="@android:Theme.Dialog">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
    </style>

 下来再说下回调接口和调用:

回调接口:

package com.example.*;

public interface CallBackData {
	abstract void callBack(String name,String path);
}

在对话框需要做数据返回的地方,添加监听事件,然后下来是调用回调方法:

public void onClick(DialogInterface dialog, int which) {
	// TODO Auto-generated method stub
	callback.callBack(fileName, fileNameFull);//fileName是返回的文件名,fileNameFull是文件路径+文件名
	CustomFileDialog.this.dismiss();//数据返回,对话框隐藏
}

 主类调用:

CustomFileDialog dialog = new CustomFileDialog(MainActivity.this,
	                		R.style.DialogTheme
	                		,R.layout.file_dialog
	                		,".db"
	                		,new CallBackData(){
	                			public void callBack(String name,String path){
	                			   //在这里添加返回数据的处理
	                				}});
	         dialog.show();

 至此,自定义对话框主要用到的部分都说明完毕了,末尾附上一张我实现的文件对话框的截图

android 对话框ui框架 android构造对话框_layout