简单的对话框,相信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();
至此,自定义对话框主要用到的部分都说明完毕了,末尾附上一张我实现的文件对话框的截图