【Android】Dialog弹出软键盘时把布局顶起来的实现

【Android】Dialog弹出软键盘时把布局顶起来的实现

demo效果如下:
在这里插入图片描述

代码实现

class AICodeDialog(val activity: BaseActivity) : Dialog(activity),View.OnClickListener, AIRedPkgView {

    private lateinit var mBgView: View
    private lateinit var mClose: View
    private lateinit var mUse: View
    private lateinit var mEditText: McdEditTextView
    private var mCode: String? = null

    private var mPresenter: AIRedPkgPresenter? = null

    override fun show() {
        if (context is Activity && ((context as Activity).isFinishing || (context as Activity).isDestroyed)) {
            return
        }
        mCode?.let {
            mEditText.setText(it.toCharArray(), 0, it.length)
            mEditText.setSelection(it.length)
            mCode = null
        }
        super.show()
    }

    fun setCode(code: String?) {
        mCode = code
    }

    override fun hide() {
        ExtendUtil.hideSoftInput(context, mEditText)
        mCode = null
        mEditText.setText("")
        super.hide()
    }

    init {
        initView()
    }

    private fun initView() {
        val view = LayoutInflater.from(context).inflate(R.layout.reward_ai_code_dialog, null)
        setContentView(view)

        mClose = findViewById(R.id.iv_close)
        mEditText = findViewById(R.id.et_code)
        mBgView = findViewById(R.id.fl_demo)
        mUse = findViewById(R.id.iv_use)
        mClose.setOnClickListener(this)
        mBgView.setOnClickListener(this)
        mUse.setOnClickListener(this)
        setOnShowListener { showKeyboard() }
        setCanceledOnTouchOutside(true)
        val params = window?.attributes
        params?.width = AppConfigLib.sScreenWidth
        params?.height = WindowManager.LayoutParams.MATCH_PARENT
        params?.gravity = android.view.Gravity.BOTTOM
        window?.attributes = params
        window?.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        window?.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
        window?.setBackgroundDrawableResource(R.color.lib_transparent)
    }

    private fun showKeyboard() {
        mEditText.requestFocus()
        mEditText.postDelayed({
            if (isShowing) {
                ExtendUtil.toggleSoftInput(context)
            }
        }, 200)
    }

    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.iv_use -> {
                TrackUtil.trackPopupClick(
                    AppTrackPage.AIPhoto,
                    "提示弹窗",
                    "活动协议",
                    "使用"
                )
                if (!AppConfigLib.isLogin()) {
                    RouterUtil.resolve(
                        context, GlobalPageRouterConfig.COMPONENT_NAME.USER,
                        GlobalPageRouterConfig.ACTION_NAME.ACTION_LOGIN
                    )
                    return
                }
                useClick()
            }
            R.id.iv_close,R.id.fl_demo -> {
                TrackUtil.trackPopupClick(
                    AppTrackPage.AIPhoto,
                    "提示弹窗",
                    "活动协议",
                    "不同意"
                )
                closeDialog()
            }
        }
    }

    private fun closeDialog() {
        ExtendUtil.hideSoftInput(context, mEditText)
        dismiss()
    }

    private fun useClick() {
        if (ExtendUtil.isFastDoubleClick()) return //防止快速点击
        val code = mEditText.text.toString().trim()
        if (code.isEmpty()) {
            DialogUtil.showShortPromptToast(context, "请输入红包码")
            return
        }
        if (mPresenter == null) {
            mPresenter = AIRedPkgPresenter(context, this)
        }
        mPresenter?.requestAICode(code)
    }

    override fun showLoadingDialog(message: String?) {
        activity.showProgressDialog("")
    }

    override fun hideLoadingDialog() {
        activity.dismissProgressDialog()
    }

    override fun showErrorMsg(msg: String?) {
        DialogUtil.showShortPromptToast(context, msg ?: "红包码识别失败")
    }

    override fun onAICoverSuccess() {
        closeDialog()
    }
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="bottom"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/fl_demo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/iv_demo"
            android:layout_width="194dp"
            android:layout_height="259dp"
            android:layout_gravity="center"
            android:scaleType="centerCrop"
            android:src="@drawable/reward_ai_code_bg" />

    </FrameLayout>

    <RelativeLayout
        android:id="@+id/rv_content"
        android:layout_marginTop="@dimen/margin_20dp"
        android:layout_width="match_parent"
        android:layout_height="@dimen/margin_118dp">


        <ImageView
            android:id="@+id/iv_input_bg"
            android:layout_width="match_parent"
            android:layout_height="118dp"
            android:scaleType="fitXY"
            android:src="@drawable/reward_ai_code_input_bg" />

        <ImageView
            android:id="@+id/iv_edit_bg"
            android:layout_width="242dp"
            android:layout_height="45dp"
            android:layout_marginStart="@dimen/margin_20dp"
            android:layout_marginTop="@dimen/margin_60dp"
            android:scaleType="centerCrop"
            android:src="@drawable/reward_ai_code_edit_bg" />

        <ImageView
            android:id="@+id/iv_use"
            android:layout_width="78dp"
            android:layout_height="45dp"
            android:layout_alignBottom="@+id/iv_edit_bg"
            android:layout_marginStart="@dimen/margin_15dp"
            android:layout_toRightOf="@+id/iv_edit_bg"
            android:scaleType="centerCrop"
            android:src="@drawable/reward_ai_code_use" />

        <com.mcd.library.ui.view.McdEditTextView
            android:id="@+id/et_code"
            android:layout_width="242dp"
            android:layout_height="45dp"
            android:layout_alignStart="@+id/iv_edit_bg"
            android:layout_alignParentBottom="true"
            android:background="@null"
            android:digits="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:gravity="left|center_vertical"
            android:imeOptions="actionNext"
            android:includeFontPadding="false"
            android:paddingBottom="@dimen/margin_24dp"
            android:maxLength="13"
            android:paddingStart="15dp"
            android:textColor="#F2E28C"
            android:textColorHint="#F2E28C"
            android:textSize="20sp"
            android:textStyle="bold" />

        <ImageView
            android:id="@+id/iv_close"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:scaleType="centerCrop"
            android:layout_alignParentRight="true"
            android:layout_marginEnd="10dp"
            android:layout_marginTop="10dp"
            android:src="@drawable/reward_ai_code_exit" />

    </RelativeLayout>

</LinearLayout>

软键盘和EditText保持一定间距的实现思路,可以设置EditText 的 paddingBottom

AndroidDialog中关闭软键盘需要以下步骤: 1. 首先,获取Dialog的Window对象。可以通过`dialog.getWindow()`方法来实现。 2. 接下来,调用Window的`setSoftInputMode()`方法,将其参数设置为`WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN`。这将使得软键盘始终不自动弹出。 3. 最后,调用Window的`setContentView()`方法加载布局文件或者视图对象。 代码示例: ```java Dialog dialog = new Dialog(context); Window window = dialog.getWindow(); window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); window.setContentView(R.layout.dialog_layout); ``` 在AndroidDialog中控制软键盘的显示与隐藏,可以通过以下方式实现: 1. 如果Dialog中有EditText控件需要获取焦点,可以使用`InputMethodManager`类来显示软键盘。可以在控件获得焦点,调用`InputMethodManager`的`showSoftInput()`方法来显示软键盘。 代码示例: ```java EditText editText = dialog.findViewById(R.id.edit_text); editText.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); ``` 2. 如果需要在特定情况下隐藏软键盘,可以使用`InputMethodManager`类的`hideSoftInputFromWindow()`方法。 例如,当失去焦点或者点击Dialog外部区域,可以调用`hideSoftInputFromWindow()`方法来隐藏软键盘。 代码示例: ```java View rootView = dialog.findViewById(R.id.root_view); rootView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } return false; } }); ``` 通过以上步骤,可以在AndroidDialog中关闭软键盘以及控制软键盘的显示与隐藏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值