王学岗自定义的dialog

dialog设置为透明样式

```

<style name="rebinddialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:background">@android:color/transparent</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:backgroundDimAmount">0.6</item>
</style>

```

 

第一个类

package com.example.xin;

 


import android.app.Dialog;
import android.content.Context;
import android.opengl.Visibility;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


/**
 * 自定义的dialog,实现builder设计模式,自定义的builder设计
 * builder设计模式特点:1,所有的set方法必须返回当前的设计对象;2,连续调用(连续赋值)
 * 这样设计的优点:1,节约资源、方便多次设置数据、方便组合不同的对象、不需要创建引用就可以set数据。 -orm对象映射型数据库/查-
 */
public class MyCustomerDialog extends Dialog {
// 设置为protected,我们不希望外界创建,只能通过builder创建
protected MyCustomerDialog(Context context, boolean cancelable,
OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
// TODO Auto-generated constructor stub


}


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


protected MyCustomerDialog(Context context) {
super(context);
// TODO Auto-generated constructor stub
}


// 属性的集合
private static class Params {
public Context context;
// 标题
public String myTitle;
// 提示消息
public String myMessage;
// 确定和取消按钮显示文本
public String confirmText;
public String cancelText;
// 取消按钮监听
// 使用View.OnClickListener(控件的点击事件)而不是OnClickListener,使用起来会方便很多
public View.OnClickListener myOnCanceClicklListener;
// 确定按钮监听
public View.OnClickListener myOnConfirmClickListener;
}


public static class Builder {


private Params params;


public Builder(Context context) {
// params不提供外部使用
params = new Params();
params.context = context;
}


public Builder setTitle(String myTitle) {
params.myTitle = myTitle;
return this;
}


public Builder setMessage(String myMessage) {
params.myMessage = myMessage;
return this;
}


public Builder setConfirmText(String confirmText) {
params.confirmText = confirmText;
return this;
}


public Builder setCancelText(String cancelText) {
params.cancelText = cancelText;
return this;
}


public Builder setOnCancelClickListener(
View.OnClickListener myOnCancelClickListener) {
params.myOnCanceClicklListener = myOnCancelClickListener;
return this;
}


public Builder setOnConfirmClickListener(
View.OnClickListener myOnConfirmClicklListener) {
params.myOnConfirmClickListener = myOnConfirmClicklListener;
return this;
}


public MyCustomerDialog create() {
//style使用自己在资源文件中定义的,这里设置为透明样式
MyCustomerDialog myCustomerDialog = new MyCustomerDialog(
params.context,R.style.rebinddialog);
// 设置监听
View view = LayoutInflater.from(params.context).inflate(
R.layout.my_customer_dialog, null);
// 设置标题myTitle
TextView title_TextView = (TextView) view
.findViewById(R.id.tv_title);
if (!TextUtils.isEmpty(params.myTitle)) {
title_TextView.setText(params.myTitle);
title_TextView.setVisibility(View.VISIBLE);
} else {
title_TextView.setVisibility(View.GONE);
}
// 设置内容
TextView message_TextView = (TextView) view
.findViewById(R.id.tv_message);
if (!TextUtils.isEmpty(params.myMessage)) {
title_TextView.setText(params.myMessage);
title_TextView.setVisibility(View.VISIBLE);
} else {
title_TextView.setVisibility(View.GONE);
}
// 初始化确定按钮
Button bt_confirm = (Button) view.findViewById(R.id.bt_confirm);
if (params.myOnConfirmClickListener != null) {
bt_confirm.setVisibility(View.VISIBLE);
bt_confirm.setOnClickListener(params.myOnConfirmClickListener);
bt_confirm.setText(params.confirmText);
} else {
bt_confirm.setVisibility(View.GONE);
}
// 初始化取消按钮
Button bt_cancel = (Button) view.findViewById(R.id.bt_cancle);
if (params.myOnConfirmClickListener != null) {
bt_cancel.setVisibility(View.VISIBLE);
bt_cancel.setText(params.cancelText);
bt_cancel.setOnClickListener(params.myOnCanceClicklListener);
} else {
bt_cancel.setVisibility(View.GONE);
}
// 绑定视图到dialog
myCustomerDialog.setContentView(view);
return myCustomerDialog;
}
}

 

 

}

 

 

 

第二个类

package com.example.xin;


import java.util.Calendar;


import com.example.xin.MyTimeDialog.CallBack;


import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.Toast;


public class MainActivity extends Activity {
private Button bt_system_dialog, bt_system_progress_dialog,bt_System_time_dialog;
private MyTimeDialog myTimeDialog;
private Button bt_system_data_dialog;
private MyCustomerDialog myCustomerDialog;


// 1.使用系统的默认的dialog
// 2.使用系统默认的进度条dialog
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}


private void initView() {
bt_system_dialog = (Button) findViewById(R.id.bt_system_dialog);
bt_system_progress_dialog = (Button) findViewById(R.id.bt_system_progress_dialog);
Button bt_customer_dialog=(Button) findViewById(R.id.bta_customer_dialog);
bt_System_time_dialog=(Button) findViewById(R.id.bt_System_time_dialog);
bt_system_data_dialog = (Button) findViewById(R.id.bta_system_data_dialog);
MyClick mc = new MyClick();
bt_customer_dialog.setOnClickListener(mc);
bt_system_dialog.setOnClickListener(mc);
bt_system_data_dialog.setOnClickListener(mc);
bt_system_progress_dialog.setOnClickListener(mc);
bt_System_time_dialog.setOnClickListener(mc);
}


private class MyClick implements OnClickListener {


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.bt_system_dialog:
showSystemDialog();
break;
case R.id.bt_system_progress_dialog:
showSystemProgressDialog();
break;
case R.id.bt_System_time_dialog:
showSystemTimeDialog();
break;
case R.id.bta_system_data_dialog:
showSystemDateDialog();
break;
case R.id.bta_customer_dialog:
showCustomerDialog();
break;
default:
break;
}
}


};


// 显示系统默认的dialog
public void showSystemDialog() {
// TODO Auto-generated method stub
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(android.R.drawable.arrow_down_float).setTitle("温馨提示")
.setMessage("确定要退出吗")
// 注意这里是new AlertDialog.OnClickListener()而不是OnClickListener()
.setPositiveButton("确定", new AlertDialog.OnClickListener() {


@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub


}
}).setNegativeButton("取消", new AlertDialog.OnClickListener() {


@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub


}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
/**
* 自己定义的dialog,应用builder 
*/
public void showCustomerDialog() {
MyCustomerDialog.Builder builder=new MyCustomerDialog.Builder(this);
builder.setTitle("提示")
.setCancelText("取消")
.setConfirmText("确定")
.setMessage("你喜欢王岗吗?")
.setOnCancelClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
myCustomerDialog.dismiss();
}
}).setOnConfirmClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
myCustomerDialog.dismiss();
}
});
myCustomerDialog = builder.create();
myCustomerDialog.show();
}


/**
* 日期选择dialog
*/
public void showSystemDateDialog() {
// TODO Auto-generated method stub
Calendar calendar=Calendar.getInstance();
//设置当前的毫秒
calendar.setTimeInMillis(System.currentTimeMillis());
int year=calendar.get(Calendar.YEAR);
int monthOfYear=calendar.get(Calendar.MONTH);
int dayOfMonth=calendar.get(Calendar.DAY_OF_MONTH);
//这里多用匿名内部类
OnDateSetListener callBack=new OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, year+"年"+monthOfYear+"月"+dayOfMonth+"日", 3000).show();
}
};
DatePickerDialog datePickerDialog=new DatePickerDialog(this, callBack, year, monthOfYear, dayOfMonth);
datePickerDialog.show();
}
//系统默认的时间dialog,使用系统的空间要封装起来,这样写就可以作为一个工具类了
public void showSystemTimeDialog() {
myTimeDialog = new MyTimeDialog();
myTimeDialog.show(this, new CallBack() {

@Override
public void onTime(int hourOfDay, int minute) {
// TODO Auto-generated method stub
myTimeDialog.dismiss();
/**
使用第三方的框架,比如地图,一定要想着,用别人的东西,不一定靠谱!比如百度地图总是更新版本,因为他有bug;
如果我们现在使用百度地图,现在要改成高德地图,怎么办?这些东西不能避免!要面向接口编程!
面向接口编程,对这些地图进行封装,定义自己的接口,接口下面有几个实现类,定义几个枚举,用枚举切换百度地图!
如果哪天要切换地图,只改下枚举就行了!*/
Toast.makeText(MainActivity.this, hourOfDay+"时"+minute+"分", 3000).show();
}
});
}


// 使用系统默认的进度条dialog
public void showSystemProgressDialog() {
// TODO Auto-generated method stub
AsyncTask<String, Integer, Boolean> asyncTask = new AsyncTask<String, Integer, Boolean>() {
private ProgressDialog progressDialog;


// 子线程中要做的,更新进度
@Override
protected Boolean doInBackground(String... params) {
// TODO Auto-generated method stub
int progress = 0;
try {
// doInBackground里可以执行我们的网络请求,在这里模拟请求
while (true) {
progress += 50;
Thread.sleep(100);
// 通知主程序
publishProgress(progress);
if (progress >= progressDialog.getMax()) {
break;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 下载图片,文件返回true表示成功
return true;
}
// 更新我们的UI线程
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);
}
// 异步线程执行完了要执行的代码
@Override
protected void onPostExecute(Boolean result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
// 关掉dialog
progressDialog.dismiss();
}


// 在主线程中执行的
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage("正在玩命加载中……");
progressDialog.setMax(1000);
progressDialog
.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.show();
}


};
asyncTask.execute("");
}


}

第三个类

package com.example.xin;


import java.util.Calendar;
import java.util.TimeZone;


import android.animation.TimeAnimator;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.Context;
import android.widget.TimePicker;
//直接继承object类
public class MyTimeDialog {
private TimePickerDialog timePickerDialog;
public MyTimeDialog() {


}
//显示时间dialog,用callback把小时分钟返回出去
//设置成final ,不能改变才能调用,改变了就无法调用了
//使用onTimeSetListenner也可以,无非就是个回调接听!但这样不好,达不到完全封装的效果,以后可以写成一个夹包,我不希望别人知道我的控件是怎么写得。别人只知道时间就可以了
public void show(Context context,final CallBack callBack){
//如果是空就创建
if(timePickerDialog==null){
Calendar canlendar=Calendar.getInstance(TimeZone.getDefault());
int hourOfDay=canlendar.get(Calendar.HOUR_OF_DAY);
int minute=canlendar.get(Calendar.MINUTE);
timePickerDialog = new TimePickerDialog(context, new OnTimeSetListener() {

@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
// TODO Auto-generated method stub
if(callBack!=null){
callBack.onTime(hourOfDay, minute);
}
}
}, hourOfDay, minute, true);
}
timePickerDialog.show();
}
//关闭dialog
public void dismiss(){
if(timePickerDialog!=null){
timePickerDialog.dismiss();
}
}
//设置回调事件,之所以要定义CallBack是=》完全把我们系统的控件与我们自己的的程序代码完全隔离开,使我们自己的程序代码与系统的代码分开
public interface CallBack{
//提供给外部使用
public void onTime(int hourOfDay,int minute);
}
}

 

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:background="@android:color/white">
    <TextView 
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textSize="20sp"/>
    <TextView 
        android:id="@+id/tv_message"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:textSize="18sp"/>
    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:orientation="horizontal"
        android:paddingLeft="10dip"
        android:paddingRight="10dip"
        android:gravity="center_horizontal">
        <Button 
            android:id="@+id/bt_confirm"
            android:layout_width="0dp"
            android:layout_height="45dp"
            android:layout_weight="1"
            />
         <Button 
             android:layout_marginLeft="10dp"
            android:id="@+id/bt_cancle"
            android:layout_width="0dp"
            android:layout_height="45dp"
            android:layout_weight="1"
            />
    </LinearLayout>


</LinearLayout>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值