package com.****.main.dialogPack;
import android.app.Dialog;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import com.rtk.app.R;
import com.rtk.app.tool.PublicCallBack;
import com.rtk.app.tool.PublicClass;
import com.rtk.app.tool.StaticValue;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseDiaolg extends Dialog implements View.OnClickListener {
private Window window;
private Context context;
private Handler handlerBase=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
try {
switch (msg.what){//这么做的原因是因为部分dialog是在子线程里控制显示或者关闭的,必须用handle eg:qq绑定
case 0:
BaseDiaolg.super.show();
break;
case 1:
BaseDiaolg.super.dismiss();
break;
}
}catch (Exception e){}
}
};
public BaseDiaolg(Context context) {
super(context);
this.context=context;
}
public void initView(int layoutId,int location) {
setContentView(layoutId);
windowDeploy(0, 0,location);
//设置触摸对话框意外的地方取消对话框
setCanceledOnTouchOutside(true);
getWindow().setBackgroundDrawableResource(android.R.color.transparent);
//ButterKnife.bind(this, getWindow().getDecorView());//在子类调用InitView后添加这个,可以直接绑定View 不用简历holder了
}
//设置窗口显示
private void windowDeploy(float x, float y,int position) {
window = getWindow(); //得到对话框
//window.setWindowAnimations(R.style.dialog_anim_style2); //设置窗口弹出动画
//window.setBackgroundDrawableResource(R.color.halfTransparency); //设置对话框背景为透明
WindowManager.LayoutParams wl = window.getAttributes();
//根据x,y坐标设置窗口需要显示的位置
wl.x = (int) x; //x小于0左移,大于0右移
wl.y = (int) y; //y小于0上移,大于0下移
//wl.alpha = 0.6f; //设置透明度
wl.gravity = position; //设置重力
wl.width = ViewGroup.LayoutParams.MATCH_PARENT;//设置宽度
wl.height = ViewGroup.LayoutParams.WRAP_CONTENT;
window.setAttributes(wl);
}
public abstract void initEvent();
private ViewGroup groundFloorView;//父类View
private View loadView;//加载视图
private List<Integer> listLoadGoneId = new ArrayList<>();//用于保存设置加载空视图的时隐藏控件的Id
private ViewGroup noInterNet;//暂无网络
private PublicCallBack loadDataCallBack;//刚打开加载的getData回调
private ViewGroup srcDissmiss;//资源丢失
private boolean isLoad = false;//如果加载过则为true
/**
* 设置加载视图
*
* @param parenView 主要容器视图
* @param noDissMissView 不想隐藏的View若没有直接传null
*/
public void setLoadView(View parenView, View noDissMissView) {
removeLoadView();
groundFloorView = (ViewGroup) parenView;
for (int i = 0; i < groundFloorView.getChildCount(); i++) {
if (groundFloorView.getChildAt(i).getId() != noDissMissView.getId()) {
if (groundFloorView.getChildAt(i).getVisibility() == View.VISIBLE) {//
groundFloorView.getChildAt(i).setVisibility(View.GONE);
listLoadGoneId.add(groundFloorView.getChildAt(i).getId());
}
}
}
if(loadView==null)loadView = LayoutInflater.from(context).inflate(R.layout.auto_max_footview_load_layout, null);
loadView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
if(noInterNet==null)noInterNet = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.auto_no_interner_layout, null);
noInterNet.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
if(srcDissmiss==null)srcDissmiss = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.auto_src_dissmiss_layout, null);
srcDissmiss.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
groundFloorView.addView(loadView);
}
//设置加载完毕之后 显示的之前隐藏的View
public void setLoadDone() {
for (int i = 0; i < groundFloorView.getChildCount(); i++) {
if (listLoadGoneId.contains(groundFloorView.getChildAt(i).getId())) {
listLoadGoneId.remove((Object) groundFloorView.getChildAt(i).getId());
groundFloorView.getChildAt(i).setVisibility(View.VISIBLE);
}
}
removeLoadView();
isLoad=true;
}
//设置无网络视图 mark为失败的接口
private void setNoData(PublicCallBack getDataCallBack) {
try {
if(!isLoad) {
this.loadDataCallBack = getDataCallBack;
removeLoadView();
groundFloorView.addView(noInterNet);
noInterNet.getChildAt(2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (loadDataCallBack != null) {
loadDataCallBack.callBack();
}
removeLoadView();
groundFloorView.addView(loadView);
}
});
}}catch (Exception e){}
}
//资源获取失败
public void setSrcDissmiss(String failReason,PublicCallBack getDataCallBack){
if(failReason.equals(StaticValue.NoInterNetString)){//如果是网络问题
setNoData(getDataCallBack);
}else
try {
if (!isLoad) {
this.loadDataCallBack = getDataCallBack;
removeLoadView();
groundFloorView.addView(srcDissmiss);
((TextView)srcDissmiss.getChildAt(1)).setText(PublicClass.setRequestFailString(failReason));
srcDissmiss.getChildAt(2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (loadDataCallBack != null) loadDataCallBack.callBack();
removeLoadView();
groundFloorView.addView(loadView);
}
});
}
}catch (Exception e){}
}
//移除插入的加载和断网视图
private void removeLoadView(){
if(noInterNet!=null)groundFloorView.removeView(noInterNet);
if(loadView!=null)groundFloorView.removeView(loadView);
if(srcDissmiss!=null)groundFloorView.removeView(srcDissmiss);
}
@Override
public void show() {
//super.show();
handlerBase.sendEmptyMessage(0);
}
@Override
public void dismiss() {
///super.dismiss();
handlerBase.sendEmptyMessage(1);
}
}
不用管我怎么实现,直接继承即可。调用方法如下
package com.***.main.dialogPack;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import com.rtk.app.R;
import com.rtk.app.base.BaseActivity;
import com.rtk.app.tool.PublicCallBack;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* 可以回调的tipDialog
*/
public class DialogTipsForCallBack extends BaseDiaolg {
@BindView(R.id.dialog_tip_for_callback_layout)
TextView dialogTipForCallbackLayout;
@BindView(R.id.dialog_tip_for_callback_tip)
TextView dialogTipForCallbackTip;
@BindView(R.id.dialog_tip_for_callback_ok)
TextView dialogTipForCallbackOk;
@BindView(R.id.dialog_tip_for_callback_cancle)
TextView dialogTipForCallbackCancle;
private BaseActivity activity;
private String tips;
private PublicCallBack publicCallBack;
public DialogTipsForCallBack(BaseActivity activity, String tips, PublicCallBack publicCallBack) {
super(activity);
this.activity = activity;
this.tips = tips;
this.publicCallBack = publicCallBack;
initView(R.layout.dialog_tip_for_callback, Gravity.CENTER);
ButterKnife.bind(this, getWindow().getDecorView());
dialogTipForCallbackTip.setText(tips);
setCanceledOnTouchOutside(false);
initEvent();
}
@Override
public void initEvent() {
dialogTipForCallbackOk.setOnClickListener(this);
dialogTipForCallbackCancle.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.dialog_tip_for_callback_ok:
publicCallBack.callBack("true");
break;
case R.id.dialog_tip_for_callback_cancle:
publicCallBack.callBack("false");
break;
}
dismiss();
}
}
package com.****;
public interface PublicCallBack {
void callBack(String... str);
}
PublicCallBack 就是自定义回调,你可以不用,为了方便理解,放了上去
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:background="@drawable/shape_corner_white_2dp"
>
<TextView
android:id="@+id/dialog_tip_for_callback_layout"
android:layout_width="match_parent"
android:layout_height="45dip"
android:background="@color/theme1"
android:gravity="center|left"
android:paddingLeft="10dip"
android:text="提示"
android:textColor="@color/white"
android:textSize="17dip" />
<TextView
android:id="@+id/dialog_tip_for_callback_tip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dip"
android:layout_marginTop="10dip"
android:gravity="center|left"
android:paddingLeft="5dip"
android:paddingRight="5dip"
android:lineSpacingMultiplier="1.5"
android:text="更新内容"
android:textColor="@color/drak444"
android:textSize="15dip" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="45dip"
android:layout_marginBottom="10dip"
android:orientation="horizontal" >
<TextView
android:id="@+id/dialog_tip_for_callback_ok"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_marginLeft="10dip"
android:layout_weight="1"
android:background="@drawable/shape_corner_theme1_2dp"
android:gravity="center"
android:text="确定"
android:textColor="@color/white"
android:textSize="15dip" />
<TextView
android:id="@+id/dialog_tip_for_callback_cancle"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_marginLeft="20dip"
android:layout_marginRight="10dip"
android:layout_weight="1"
android:background="@drawable/shape_corner_wideline_5dp"
android:gravity="center"
android:text="取消"
android:textColor="@color/drak444"
android:textSize="15dip" />
</LinearLayout>
</LinearLayout>
|