Android 安卓自定义Dialog工具类封装与使用

文章目录

    • Android 安卓Dialog工具类封装与使用
      • 效果图
      • 配置
      • Java
      • Kotlin
    • 使用方法
      • Java
      • Kotlin


Android 安卓Dialog工具类封装与使用

安卓自定义Dialog,分别用了Kotlin和Java两种语言列出!布局可以自定义!


效果图

布局是自定义的

Android 安卓自定义Dialog工具类封装与使用_第1张图片


配置

style.xml中配置

<style name="BoxDialog" parent="@android:style/Theme.Holo.Dialog">
    
    "android:windowFrame">@null
    
    "android:windowIsFloating">true
    
    "android:windowNoTitle">true
    
    "android:windowIsTranslucent">true
    
    "android:windowBackground">@android:color/transparent
    
style>

Java

/**
 * @author ThirdGoddess
 * @email [email protected]
 * @Github https://github.com/ThirdGoddess
 * @date :2019-12-29 01:24
 */
public class BoxDialog extends Dialog {

    //控制点击dialog外部是否dismiss
    private boolean isCancelable = true;

    //返回键是否dismiss
    private boolean isCanceledOnTouchOutside = true;

    //Dialog View
    private View view;

    //Dialog弹出位置
    private LocationView locationView = LocationView.CENTER;

    /**
     * @param context 上下文
     * @param view    Dialog View
     */
    public BoxDialog(Context context, View view) {
        super(context, R.style.BoxDialog);
        this.view = view;
    }

    /**
     * @param context      上下文
     * @param view         Dialog View
     * @param locationView Dialog弹出位置
     */
    public BoxDialog(Context context, View view, LocationView locationView) {
        super(context, R.style.BoxDialog);
        this.view = view;
        this.locationView = locationView;
    }


    /**
     * 设置是否可以点击 Dialog View 外部关闭 Dialog
     *
     * @param isCancelable true可关闭,false不可关闭
     */
    public void setCancelable(boolean isCancelable) {
        this.isCancelable = isCancelable;
    }

    /**
     * 设置是否可以按返回键关闭 Dialog
     *
     * @param isCanceledOnTouchOutside true可关闭,false不可关闭
     */
    public void setCanceledOnTouchOutside(boolean isCanceledOnTouchOutside) {
        this.isCanceledOnTouchOutside = isCanceledOnTouchOutside;
    }

    @SuppressLint("RtlHardcoded")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (null != view) {
            setContentView(view);
            setCancelable(isCancelable);//点击外部是否可以关闭Dialog
            setCanceledOnTouchOutside(isCanceledOnTouchOutside);//返回键是否可以关闭Dialog
            Window window = this.getWindow();
            assert window != null;
            switch (locationView) {
                case TOP:
                    window.setGravity(Gravity.TOP);
                    break;
                case BOTTOM:
                    window.setGravity(Gravity.BOTTOM);
                    break;
                case CENTER:
                    window.setGravity(Gravity.CENTER);
                    break;
            }
            WindowManager.LayoutParams params = window.getAttributes();
            params.width = WindowManager.LayoutParams.MATCH_PARENT;
            params.height = WindowManager.LayoutParams.WRAP_CONTENT;
            window.setAttributes(params);
        }
    }

    public enum LocationView {
        CENTER, TOP, BOTTOM
    }
}


Kotlin

/**
 * @author ThirdGoddess
 * @email [email protected]
 * @Github https://github.com/ThirdGoddess
 * @date :2019-12-29 01:24
 */
class BoxDialog : Dialog {
    //控制点击dialog外部是否dismiss
    private var isCancelable = true

    //返回键是否dismiss
    private var isCanceledOnTouchOutside = true

    //Dialog View
    private var view: View?

    //Dialog弹出位置
    private var locationView = LocationView.CENTER

    /**
     * @param context 上下文
     * @param view    Dialog View
     */
    constructor(context: Context?, view: View?) : super(context!!, R.style.MyDialog) {
        this.view = view
    }

    /**
     * @param context      上下文
     * @param view         Dialog View
     * @param locationView Dialog弹出位置
     */
    constructor(context: Context?, view: View?, locationView: LocationView) : super(context!!, R.style.MyDialog) {
        this.view = view
        this.locationView = locationView
    }

    /**
     * 设置是否可以点击 Dialog View 外部关闭 Dialog
     *
     * @param isCancelable true可关闭,false不可关闭
     */
    override fun setCancelable(isCancelable: Boolean) {
        this.isCancelable = isCancelable
    }

    /**
     * 设置是否可以按返回键关闭 Dialog
     *
     * @param isCanceledOnTouchOutside true可关闭,false不可关闭
     */
    override fun setCanceledOnTouchOutside(isCanceledOnTouchOutside: Boolean) {
        this.isCanceledOnTouchOutside = isCanceledOnTouchOutside
    }

    @SuppressLint("RtlHardcoded")
    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        if (null != view) {
            setContentView(view!!)
            setCancelable(isCancelable) //点击外部是否可以关闭Dialog
            setCanceledOnTouchOutside(isCanceledOnTouchOutside) //返回键是否可以关闭Dialog
            val window = this.window!!
            when (locationView) {
                LocationView.TOP -> window.setGravity(Gravity.TOP)
                LocationView.BOTTOM -> window.setGravity(Gravity.BOTTOM)
                LocationView.CENTER -> window.setGravity(Gravity.CENTER)
            }
            val params = window.attributes
            params.width = WindowManager.LayoutParams.MATCH_PARENT
            params.height = WindowManager.LayoutParams.WRAP_CONTENT
            window.attributes = params
        }
    }

    enum class LocationView {
        CENTER, TOP, BOTTOM
    }
}

使用方法

Java 和 Kotlin 的方法


Java

public class MainActivity extends AppCompatActivity {
    
    private BoxDialog boxDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        Button dialogButton = findViewById(R.id.dialog);
        dialogButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                View inflate = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_view2, null, false);
                //在这里可以给布局中的按钮加事件,boxDialog.dismiss()可以关闭dialog

                boxDialog = new BoxDialog(MainActivity.this, inflate, BoxDialog.LocationView.CENTER);
                boxDialog.setCancelable(false);//是否可以点击DialogView外关闭Dialog
                boxDialog.setCanceledOnTouchOutside(false);//是否可以按返回按钮关闭Dialog
                boxDialog.show();
            }
        });
    }

}


Kotlin

class MainActivity : AppCompatActivity() {
    private var boxDialog: BoxDialog? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initView()
    }

    private fun initView() {
        val dialogButton = findViewById<Button>(R.id.dialog)
        dialogButton.setOnClickListener {
            val inflate = LayoutInflater.from(this).inflate(R.layout.dialog_view2, null, false)
            //可以给布局中的按钮加事件,boxDialog.dismiss();关闭dialog
            
            boxDialog = BoxDialog(this, inflate, BoxDialog.LocationView.CENTER)
            boxDialog!!.setCancelable(false) //是否可以点击DialogView外关闭Dialog
            boxDialog!!.setCanceledOnTouchOutside(false) //是否可以按返回按钮关闭Dialog
            boxDialog!!.show()
        }
    }
}

你可能感兴趣的:(Android更上一层楼,安卓)