欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Android使用Dialog实现贴键盘输入框(类似微博评论)

程序员文章站 2022-03-10 22:36:27
效果图实现输入框跟随键盘移动需要在清单文件中给activity设置一个属性android:windowSoftInputMode="stateAlwaysHidden|adjustPan"创建类继承Dialog输入布局文件自己定义即可public class InputDialogUtils extends Dialog { private Context mContext;//上下文对象 private EditText editText;//输入框对象...

效果图

Android使用Dialog实现贴键盘输入框(类似微博评论)

实现输入框跟随键盘移动需要在清单文件中给activity设置一个属性

	android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

创建类继承Dialog
输入布局文件自己定义即可

	public class InputDialogUtils extends Dialog {

    private Context mContext;//上下文对象

    private EditText editText;//输入框对象

    private InputDialogListener listener;//监听回调

    public InputDialogUtils(@NonNull Context context) {
        super(context);
        this.mContext = context;
        initDialog();
    }

    public InputDialogUtils(@NonNull Context context, int themeResId) {
        super(context, themeResId);
        this.mContext = context;
        initDialog();
    }

    protected InputDialogUtils(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
        this.mContext = context;
        initDialog();
    }

    private void initDialog() {
        View view = LinearLayout.inflate(mContext, R.layout.pop_view_session_input, null);
        setContentView(view);

        //输入框
        editText = view.findViewById(R.id.sessionInputEd);

        Window window = getWindow();
        window.setGravity(Gravity.BOTTOM);
        //这里的动画效果自己创建
        window.setWindowAnimations(R.style.BottomDialog_Animation);

        //添加发送点击事件
        view.findViewById(R.id.sessionSendTxt).setOnClickListener(new ClickUtils.OnDebouncingClickListener(Config.IS_GLOBAL_CLICK, Config.MIN_CLICK_DELAY_TIME) {
            @Override
            public void onDebouncingClick(View v) {
                if (listener != null) {
                    listener.getInputTxt(editText);
                    editText.setText("");
                }
            }
        });

        //添加放大点击事件
        view.findViewById(R.id.sessionInputBigImg).setOnClickListener(new ClickUtils.OnDebouncingClickListener(Config.IS_GLOBAL_CLICK, Config.MIN_CLICK_DELAY_TIME) {
            @Override
            public void onDebouncingClick(View v) {
                listener.onCancel(editText);
            }
        });

        setCancelable(true);
        show();
		//保证自定义得布局文件充满屏幕宽度
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.width = (int) (ScreenUtils.getScreenWidth()); //设置宽度
        getWindow().setAttributes(lp);
        getWindow().setAttributes(layoutParams);
    }
 }

接下来重写隐藏显示方法,进行逻辑与回显示键盘操作

@Override
    public void dismiss() {
        KeyboardUtils.hideSoftInput(editText);
        //与键盘解绑
        editText.setFocusable(false);
        editText.setShowSoftInputOnFocus(false);
        editText.setFocusableInTouchMode(false);
        editText.requestFocus();
        super.dismiss();
    }

    @Override
    public void show() {
        //显示键盘
        KeyboardUtils.showSoftInput();
        //与键盘绑定
        editText.setFocusable(true);
        editText.setShowSoftInputOnFocus(true);
        editText.setFocusableInTouchMode(true);
        editText.requestFocus();
        super.show();
    }

键盘回收方法

public static void hideSoftInput(@NonNull final View view) {
        InputMethodManager imm =
                (InputMethodManager) Utils.getApp().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm == null) return;
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }

键盘显示方法

public static void showSoftInput() {
        InputMethodManager imm = (InputMethodManager) Utils.getApp().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm == null) {
            return;
        }
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
    }

style里面的代码

<!-- dialog有遮罩 -->
    <style name="BottomDialog2" parent="@android:style/Theme.Holo.Dialog">
        <item name="android:windowFrame">@null</item><!--边框-->
        <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
        <item name="android:windowIsTranslucent">true</item><!--半透明-->
        <item name="android:windowNoTitle">true</item><!--无标题-->
        <item name="android:windowBackground">@color/colorTransparent</item><!--背景透明-->
        <item name="android:backgroundDimEnabled">true</item><!--模糊-->
    </style>

Activity使用方法

	if (inputDialogUtils == null) {
                        inputDialogUtils = new InputDialogUtils(this, R.style.BottomDialog2);
                    } else {
                        inputDialogUtils.show();
                    }
                    inputDialogUtils.setListener(new InputDialogUtils.InputDialogListener() {
                        @Override
                        public void onConfirm(int type) {

                        }

                        @Override
                        public void onCancel(EditText editText) {
                            inputDialogUtils.cancel();
                        }

                        @Override
                        public void getInputTxt(EditText editText) {
                            ToastUtils.showShort(editText.getText().toString());
                            inputDialogUtils.dismiss();
                        }
                    });

以上为开发时的需求,如有问题,欢迎各位大佬指正。
开发与学习并进。

本文地址:https://blog.csdn.net/qq_44946212/article/details/107881874

相关标签: android