安卓系统的提供的dialog往往不能满足实际项目要求,此时就需要根据需求实现自定view。通常dialog作为一种提示性对话框来使用,不需要从外界获取数据,然后展示在dialog上,就像退出时提示框又或者额是登陆时发生错误,进行简单的登录异常信息提示;而另外一种用途通常需要从外界获取数据作为dialog的view来进行展示,此时就需要自定义实现,点击某个数据项之后,触发相关操作;
自定义dialog思路解析:
1dialog的界面布局;
2外界传入的数据;(有些dialog不需要数据,就像退出提示框一样,只有,取消和确定操作,有些dialog是需要数据的,这些数据决定dialog的具体的item项)
3定义接口,添加监听,实现交互功能;
第一种简单提示框的实现(不需要从外界获取数据):
效果演示:
<strong>第一步:定义dialog的布局文件layout_moresetdialog.xml;</strong>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="200dp"
android:orientation="vertical"
android:background="@drawable/free_dialog_bg">
<TextView
android:id="@+id/set_more_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查看更多"
android:textSize="14dp"
android:textColor="@color/blue"
android:gravity="center_horizontal"
android:layout_alignParentTop="true"
android:layout_margin="10dp"
/>
<View
android:id="@+id/set_more_title_view"
android:layout_below="@+id/set_more_title"
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#e6e6e6" />
<ScrollView
android:id="@+id/scrollview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_centerInParent="true"
android:orientation="vertical"
android:layout_below="@+id/set_more_title_view">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/hand_up_btn"
android:layout_width="match_parent"
android:layout_height="35dp"
android:text="举手/放下"
android:background="@null"
android:drawableLeft="@mipmap/hand_up"
android:gravity="left|center_vertical"
android:drawablePadding="28dp"
/>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#e6e6e6" />
<Button
android:id="@+id/net_switch_btn"
android:layout_width="match_parent"
android:layout_height="35dp"
android:text="优选网络"
android:background="@null"
android:drawableLeft="@mipmap/icon_more_netswitch"
android:gravity="left|center_vertical"
android:drawablePadding="30dp"/>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#e6e6e6" />
<Button
android:id="@+id/error_report_btn"
android:layout_width="match_parent"
android:layout_height="35dp"
android:text="故障报告"
android:background="@null"
android:drawableLeft="@mipmap/icon_more_about"
android:gravity="left|center_vertical"
android:drawablePadding="30dp"/>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#e6e6e6" />
<Button
android:id="@+id/play_switch_btn"
android:layout_width="match_parent"
android:layout_height="35dp"
android:text="切换"
android:background="@null"
android:drawableLeft="@mipmap/icon_more_switch"
android:gravity="left|center_vertical"
android:drawablePadding="30dp"/>
</LinearLayout>
</ScrollView>
<LinearLayout
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/dialog_close_btn"
android:layout_below="@+id/scrollview"
android:layout_width="match_parent"
android:layout_margin="10dp"
android:layout_height="30dp"
android:text="关闭"
android:textColor="@color/black"
android:background="@drawable/close_btn_bg"
/>
</LinearLayout>
</LinearLayout>
<strong>第二步:为每个item项定义监听,供外界调用,提供相应的事件响应</strong>
/**
* 提供设置监听的方法
*/
public void setOnBtnClickListener(OnBtnClickListener listener){
this.listener=listener;
}
/**
* item项事件监听接口
*/
public interface OnBtnClickListener{
public void onHandUp();
public void onNetSwitch();
public void onErrorReport();
public void onPlaySwitch();
}
private void onClose(){
if (this.isShowing()){
dismiss();
}
}
完整代码如下:
/**
* @author: Created by lzl on 2017/6/13.
* @function:
* @description:
*/
public class MoreSetDialog extends Dialog {
private Button mHandup;//举手放下
private Button mNetSwitch;//优选网络
private Button mErrorReport;//错误报告
private Button mPlaySwitch;//视频与文档切换
private Button mCloseBtn;//关闭
private OnBtnClickListener listener;//内部监听器
public MoreSetDialog(Context context) {
super(context, R.style.MyDialog);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_moresetdialog);
//点击外部区域不可取消
setCanceledOnTouchOutside(false);
initView();
initEvent();
}
private void initEvent() {
//举手/放下事件
mHandup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener!=null){
listener.onHandUp();
}
}
});
//网络优选事件
mNetSwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener!=null){
listener.onNetSwitch();
}
}
});
//错误报告事件
mErrorReport.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener!=null){
listener.onErrorReport();
}
}
});
//视频模块与文档模块切换事件
mPlaySwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener!=null){
listener.onPlaySwitch();
}
}
});
//关闭事件
mCloseBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onClose();
}
});
}
/**
* 初始化布局文件
*/
private void initView() {
mHandup= (Button) findViewById(R.id.hand_up_btn);
mNetSwitch= (Button) findViewById(R.id.net_switch_btn);
mErrorReport= (Button) findViewById(R.id.error_report_btn);
mPlaySwitch= (Button) findViewById(R.id.play_switch_btn);
mCloseBtn= (Button) findViewById(R.id.dialog_close_btn);
}
/**
* 提供设置监听的方法
*/
public void setOnBtnClickListener(OnBtnClickListener listener){
this.listener=listener;
}
/**
* item项事件监听接口
*/
public interface OnBtnClickListener{
public void onHandUp();
public void onNetSwitch();
public void onErrorReport();
public void onPlaySwitch();
}
private void onClose(){
if (this.isShowing()){
dismiss();
}
}
}
调用如下:
private void shoDialog() {
final MoreSetDialog dialog=new MoreSetDialog(this);
dialog.setOnBtnClickListener(new MoreSetDialog.OnBtnClickListener() {
@Override
public void onHandUp() {
Toast.makeText(getApplicationContext(),"举手",Toast.LENGTH_SHORT).show();
}
@Override
public void onNetSwitch() {
dialog.dismiss();
Toast.makeText(getApplicationContext(),"优选网络",Toast.LENGTH_SHORT).show();
GsNetSwitchDialog gsNetSwitchDialog=new GsNetSwitchDialog(MoreDialogActivity.this);
gsNetSwitchDialog.show();
}
@Override
public void onErrorReport() {
Toast.makeText(getApplicationContext(),"故障报告",Toast.LENGTH_SHORT).show();
}
@Override
public void onPlaySwitch() {
Toast.makeText(getApplicationContext(),"切换",Toast.LENGTH_SHORT).show();
}
});
dialog.show();
}
引用的自定义drawable文件
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--背景色-->
<solid android:color="#ffffff" />
<!--描边-->
<stroke
android:width="0.8dp"
android:color="#ffffff" />
<!-- 圆角 -->
<corners android:radius="10dp" />
</shape>
dialog的style属性:
<!--自定义dialog背景全透明无边框theme -->
<style name="MyDialog" parent="android:style/Theme.Dialog">
<!--背景颜色及和透明程度-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--是否去除标题 -->
<item name="android:windowNoTitle">true</item>
<!--是否去除边框-->
<item name="android:windowFrame">@null</item>
<!--是否浮现在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--是否模糊-->
<item name="android:backgroundDimEnabled">false</item>
</style>
一些注意的问题:
//点击外部区域不可取消,false时表示点击外部区域不隐藏该dialog,true时点击外部区域取消该dialog
setCanceledOnTouchOutside(false);
2内部的监听接口最好定义接口,具体响应操作由外部调用者实现