动感biubiu 2022-06-22 02:38 采纳率: 46.2%
浏览 426
已结题

Android软键盘遮住DialogFragment怎么解决

弹出一个底部DialogFragment,里面包含TextView,但是点击TextView后软键盘会遮挡内容。
想要的效果是软键盘弹出来时候,整个DialogFragment是顶在软键盘上方,如下图。

P.S:请直接粘代码,咋们不谈理论。

public class Popup extends DialogFragment {

...............

@Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        root = inflater.inflate(mItemId, null);

        final Dialog dialog = getDialog();

        Window window = dialog.getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();

        //取消标题
        window.requestFeature(Window.FEATURE_NO_TITLE);
        //去掉dialog默认的padding
        window.getDecorView().setPadding(0, 0, 0, 0);
        //取消设置弹窗自带的背景颜色
        window.setBackgroundDrawableResource(R.color.transparent);
        //设置导航栏颜
        window.setNavigationBarColor(Color.TRANSPARENT);
        //内容扩展到导航栏
        window.setType(WindowManager.LayoutParams.TYPE_APPLICATION_PANEL);

        //设置是否可关闭
        dialog.setCancelable(mCancelable);
        //设置没有标题
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

        //设置Dialog的宽高
        lp.width = widthType;
        lp.height = heightType;
        //设置Dialog的位置在哪里
        lp.gravity = gravityType;

        ...................

        return root;
    }
}

img

img

img

  • 写回答

6条回答 默认 最新

  • 灯塔@kuaidao 2022-06-22 09:03
    关注

    该方案已经线上验证

    将题主自定义布局替换为如下Dialog的布局. show()的时候延迟100毫秒显示。

    
    package com.component.dialog;
    
    import android.app.Activity;
    import android.app.Dialog;
    import android.content.Context;
    import android.graphics.Color;
    import android.graphics.drawable.ColorDrawable;
    import android.os.Bundle;
    import android.os.Handler;
    import android.text.Editable;
    import android.text.TextUtils;
    import android.text.TextWatcher;
    import android.view.Gravity;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.EditText;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    import com.component.constant.DataContans;
    import com.component.itface.OnItemClickRecyclerListener;
    import com.component.util.CheckTextUtil;
    import com.component.util.ScreenUtil;
    import com.component.util.SoftKeyBoardListener;
    import com.core.toaster.Toaster;
    import com.ftoutiao.component.R;
    
    import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    
    public class ChatEditDialog extends Dialog implements View.OnClickListener {
    
        private Context mContext;
        RelativeLayout ll_all;
        private Activity activity;
        private TextView send;
        private EditText et_content;
        private OnItemClickRecyclerListener onItemClickRecyclerListener;
        /**
         * 判断是否 需要 去除上次遗留的评论
         */
        private int chatId = 0;
    
        public ChatEditDialog(Context context, Activity mContext) {
            super(context);
            this.mContext = context;
            this.activity = mContext;
        }
    
        public void setOnItemClickRecyclerListener(OnItemClickRecyclerListener onItemClickRecyclerListener) {
            this.onItemClickRecyclerListener = onItemClickRecyclerListener;
        }
    
        public void setHintEditStr(String name) {
            if (TextUtils.isEmpty(name)) {
                et_content.setHint(activity.getResources().getString(R.string.send_comment_text));
                send.setText(activity.getResources().getString(R.string.send_text));
            } else {
                et_content.setHint(activity.getResources().getString(R.string.chat_hui) + name);
                send.setText(activity.getResources().getString(R.string.revert_txt));
    
            }
        }
    
        public void equelChatId(int id) {
            if (id == -1) {
                et_content.setText("");
            }
            if (chatId != id) {
                et_content.setText("");
            }
            chatId = id;
        }
    
        @Override
        public void show() {
            super.show();
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    et_content.requestFocus();
                    et_content.requestFocusFromTouch();
                    showKeyboard(et_content);
                }
            }, 100);
        }
    
        public ChatEditDialog(@NonNull Context context) {
            super(context);
            this.mContext = context;
        }
    
    
        Handler mHandler = new Handler();
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
    //        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
            getWindow().setDimAmount(0f);
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.commend_et_content);
            ll_all = findViewById(R.id.ll_all);
            et_content = findViewById(R.id.et_content);
            send = findViewById(R.id.send);
            send.setOnClickListener(this);
            initSizeView();
            addEditLister();
        }
    
        private void addEditLister() {
            send.setClickable(false);
            et_content.addTextChangedListener(new TextWatcher() {
    
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
    
                    if (s.length() > 0) {
    //                    send.setBackgroundResource(R.drawable.login_choose_login_shape);
                        send.setBackgroundResource(R.drawable.game_select_shape);
                        send.setTextColor(Color.parseColor("#FFFFFF"));
                        send.setClickable(true);
                        if (s.length() > 300) {
                            et_content.setText(s.subSequence(0, 300));
                            Toaster.show("最多输入300个字");
                        }
                    } else {
    //                  send.setBackgroundResource(com.ftoutiao.component.R.drawable.game_bottom_edit_shape);
                        send.setBackgroundResource(R.drawable.game_unselect_shape);
                        send.setTextColor(Color.parseColor("#FFFFFF"));
                        send.setClickable(false);
    //                  send.setTextColor(Color.parseColor("#ACACAC"));
                    }
                }
            });
            addKeyboardChangeListener();
        }
    
        /**
         * 显示键盘
         */
        public void showKeyboard(View view) {
            InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
        }
    
        /**
         * 显示键盘
         */
        public void hideKeyboard() {
            ScreenUtil.hideInput(activity);
        }
    
        private void addKeyboardChangeListener() {
            SoftKeyBoardListener.setListener(activity, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
                @Override
                public void keyBoardShow(int height) {
                }
    
                @Override
                public void keyBoardHide(int height) {
                    dismiss();
                }
            });
        }
    
        @Override
        public void setOnDismissListener(@Nullable OnDismissListener listener) {
            super.setOnDismissListener(listener);
        }
    
        @Override
        public void dismiss() {
            ScreenUtil.hideInputMethod(getContext(), et_content);
            super.dismiss();
        }
    
        /**
         * 设置开始显示dialog的内容的位置
         */
        private void initSizeView() {
            Window window = this.getWindow();
            window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//注意此处
            window.setGravity(Gravity.BOTTOM);
            window.getAttributes().windowAnimations = R.style.SlipDialogAnimation;
            window.setLayout(-1, -2);//这2行,和上面的一样,注意顺序就行;
        }
    
        @Override
        public void onClick(View view) {
            int i = view.getId();
            if (i == R.id.send) {
                if (onItemClickRecyclerListener != null) {
                    if (CheckTextUtil.isFastDoubleClick()) return;
    
                    if (CheckTextUtil.getIsTourish()) {
                        onItemClickRecyclerListener.onItemClick("hitesoft", 100);
                        return;
                    }
                    if (!DataContans.checkLogin()) {
                        onItemClickRecyclerListener.onItemClick("hitesoft", 13);
                        return;
                    }
                    String contentStr = et_content.getText().toString().trim();
                    if (TextUtils.isEmpty(contentStr)) {
                        Toaster.show(activity.getResources().getString(R.string.input_comment_content_text));
                        return;
                    }
    
                    if (et_content.length() > 500) {
                        Toaster.show(activity.getResources().getString(R.string.limit_500_text));
                        return;
                    }
                    ScreenUtil.hideInputMethod(getContext(), et_content);
                    et_content.setText("");
                    onItemClickRecyclerListener.onItemClick(contentStr, 11);
                }
            }
        }
    }
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月27日
  • 赞助了问题酬金5元 6月22日
  • 赞助了问题酬金5元 6月22日
  • 请采纳用户回复 6月22日
  • 展开全部

悬赏问题

  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?