学习笔记5: 仿ios Dialog

先来看下Dialog的样子:


实现过程:

1.准备好布局文件:

res\values\styles.xml 中加入创建dialog的style

<resources>

    <style name="AppBaseTheme" parent="android:Theme.Light"></style>

    <style name="AppTheme" parent="AppBaseTheme"></style>

    <style name="Dialog" parent="android:style/Theme.Dialog">
        <item name="android:background">#00000000</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
    </style>
</resources>
res\layout\layout_custom_dialog.xml 为dialog的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/shape_dialog"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_margin="8dp"
        android:text="@string/hello_world"
        android:textSize="16sp" />

    <FrameLayout
        android:id="@+id/content_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_title"
        android:layout_margin="8dp"
        android:minHeight="60dp"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/tv_message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="@string/hello_world"
            android:textSize="16sp" />
    </FrameLayout>

    <utils.GroupButton
        android:id="@+id/btn_group"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/content_view" >
    </utils.GroupButton>
</RelativeLayout>
src\main\java\utils\GroupButton  自定义的 确认 取消按钮

package utils;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;

import com.example.administrator.test.R;

public class GroupButton extends FrameLayout {
   
   private TextView btnNegative;
   private TextView btnPositive;
   
   public interface OnClickListener {
      void onNegativeButtonClicked();
      void onPositiveButtonClicked();
   }
   
   private OnClickListener onClickListener;
   
   public void setOnClickListener(OnClickListener onClickListener) {
      this.onClickListener = onClickListener;
   }
   
   Paint p = new Paint(); 
   {
      p.setStrokeWidth(1);
      p.setColor(Color.GRAY);
   }
   
   public GroupButton(Context context) {
      super(context);
   }

   public GroupButton(Context context, AttributeSet attrs) {
      super(context, attrs);
      setWillNotDraw(false);
      View.inflate(getContext(), R.layout.group_button, this);
      btnNegative = (TextView) findViewById(R.id.btn_negative);
      btnNegative.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View arg0) {
            if (onClickListener != null) {
               onClickListener.onNegativeButtonClicked();
            }
         }
      });
      btnPositive = (TextView) findViewById(R.id.btn_positive);
      btnPositive.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View arg0) {
            if (onClickListener != null) {
               onClickListener.onPositiveButtonClicked();
            }
         }
      });
   }
   
   public void toggleNegativeButton(boolean toggle) {
      btnNegative.setVisibility(toggle ? View.GONE : View.VISIBLE);
      invalidate();
   }
   
   public void togglePositiveButton(boolean toggle) {
      btnPositive.setVisibility(toggle ? View.GONE : View.VISIBLE);
      invalidate();
   }
   
   @Override
   protected void onDraw(Canvas canvas) { //画中间的黑线
      super.onDraw(canvas);
      if (btnNegative.isShown() && btnPositive.isShown()) {
         canvas.drawLine(0, 0, getWidth(), 0, p);
         canvas.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight(), p);
      }
   }

}

2.创建自定义dialog类

package utils;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.TextView;

import com.example.administrator.test.R;

public class CustomDialog extends Dialog {
   
   public CustomDialog(Context context) {
      super(context);
   }
   
   public CustomDialog(Context context, int theme) {
      super(context, theme);
   }
   
   public static class Builder{
      private Context mContext;
      private View contentView;
      private String title;
      private String message;
      private String positiveButtonText;
      private String negativeButtonText;
      private OnClickListener positiveButtonClickListener;
      private OnClickListener negativeButtonClickListener;
      private boolean cancelable = true;
      
      public Builder(Context context) {
         this.mContext = context;
      }
      
      public Builder(Context context, String title) {
         this.mContext = context;
         this.title = title;
      }
      
      public Builder(Context context, String title, String message) {
         this.mContext = context;
         this.title = title;
         this.message = message;
      }
      
      public Builder setTitle(String title) {
         this.title = title;
         return this;
      }
      
      public Builder setMessage(String message) {
         this.message = message;
         return this;
      }
      
      public Builder setPositiveButton(String positiveButtonText, OnClickListener positiveButtonClickListener) {
         this.positiveButtonText = positiveButtonText;
         this.positiveButtonClickListener = positiveButtonClickListener == null ? new OnClickListener() {
            @Override
            public void onClick(DialogInterface arg0, int arg1) {
               arg0.dismiss();
            }
         } : positiveButtonClickListener;
         return this;
      }
      
      public Builder setNegativeButton(String negativeButtonText, OnClickListener negativeButtonClickListener) {
         this.negativeButtonText = negativeButtonText;
         this.negativeButtonClickListener = negativeButtonClickListener == null ? new OnClickListener() {
            @Override
            public void onClick(DialogInterface arg0, int arg1) {
               arg0.dismiss();
            }
         } : negativeButtonClickListener;
         return this;
      }
      
      public Builder setCancelable(boolean cancelable) {
         this.cancelable = cancelable;
         return this;
      }
      
      public Builder setContentView(View contentView) {
         this.contentView = contentView;
         return this;
      }
      
      public Builder setContentView(int layoutResId) {
         this.contentView = View.inflate(mContext, layoutResId, null);
         return this;
      }
      
      public CustomDialog create() {
         final CustomDialog dialog = new CustomDialog(mContext, R.style.Dialog);
         
         View layout = View.inflate(mContext, R.layout.layout_custom_dialog, null);
         dialog.addContentView(layout, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
         
         if (title != null) {
            TextView tvTitle = (TextView) layout.findViewById(R.id.tv_title);
            tvTitle.setText(title);
         }
         
         if (message != null) {
            TextView tvMessage = (TextView) layout.findViewById(R.id.tv_message);
            tvMessage.setText(message);
         }
         
         final GroupButton btnGroup = (GroupButton) layout.findViewById(R.id.btn_group);
         {
            btnGroup.toggleNegativeButton(negativeButtonText == null);
            btnGroup.togglePositiveButton(positiveButtonText == null);
            btnGroup.setOnClickListener(new GroupButton.OnClickListener() {
               @Override
               public void onPositiveButtonClicked() {
                  positiveButtonClickListener.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
               }
               
               @Override
               public void onNegativeButtonClicked() {
                  negativeButtonClickListener.onClick(dialog, DialogInterface.BUTTON_NEGATIVE);
               }
            });
         }
         
         if (contentView != null) {
            FrameLayout contentViewParent = (FrameLayout) layout.findViewById(R.id.content_view);
            contentViewParent.removeAllViews();
            contentViewParent.addView(this.contentView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
         }  
         
         dialog.setContentView(layout);
         dialog.setCancelable(cancelable);
         
         DisplayMetrics dm = new DisplayMetrics();
         ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dm);
         final Window dialogWindow = dialog.getWindow();
         final WindowManager.LayoutParams params = dialogWindow.getAttributes();
         params.width = (int) (dm.widthPixels * 0.8);
         params.height = WindowManager.LayoutParams.WRAP_CONTENT;
         dialogWindow.setAttributes(params);
         return dialog;
      }
   }
   
}

3.显示dialog

protected void showDialog() {
        new CustomDialog.Builder(this)
                .setTitle("自定义标题")
                .setMessage("自定义消息(可更换布局部分)") // 可被setContentView方法设置的View替换掉
                .setNegativeButton("取消", null) // 第一个参数为空表示不显示这个按钮, 第二个参数为自定义按钮点击事件
                .setPositiveButton("确定", null) // 第一个参数为空表示不显示这个按钮, 第二个参数为自定义按钮点击事件
//    .setContentView(View.inflate(this, R.layout.activity_login, null)) // 用来更换的内容布局
                .setCancelable(false) // 可触摸窗口外部关闭窗口
                .create().show();
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值