实现评论功能(弹框在软键盘上方)

public class VideoSubCommentDialogFragment extends DialogFragment implements View.OnClickListener {

    EditText commentEditText;

    TextView tvSend;

    InputMethodManager inputMethodManager;

    CommentClickListener mCommentClickListener;

    DialogFragmentDataCallback dataCallback;

    String mPreCommentText;

    String mHint;

    LinearLayout llComment;

    Handler mHandler;

    private Rect mRect = new Rect();

    private boolean softKeyBoardIsVisible;

    Dialog mDialog;

    int count = 0;

    @Override

    public Dialog onCreateDialog(Bundle savedInstanceState) {

        mDialog = new Dialog(getActivity(), R.style.BottomDialog);

        mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

        mDialog.setContentView(R.layout.dialog_fragment_comment_layout);

        mDialog.setCanceledOnTouchOutside(true);

        Window window = mDialog.getWindow();

        WindowManager.LayoutParams layoutParams;

        if (window != null) {

            layoutParams = window.getAttributes();

            layoutParams.gravity = Gravity.BOTTOM;

            layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;

            window.setAttributes(layoutParams);

        }

        commentEditText = (EditText) mDialog.findViewById(R.id.edt_comment);

        tvSend = (TextView) mDialog.findViewById(R.id.tv_send);

        llComment = (LinearLayout) mDialog.findViewById(R.id.ll_comment);

        tvSend.setOnClickListener(this);

        mHandler = new MyHandler(getActivity());

        initText();

        initListener();

        setSoftKeyboard();

        //        fillEditText();

        return mDialog;

    }

    private void initText() {

        if (getArguments() != null) {

            mPreCommentText = getArguments().getString("text");

            mHint = getArguments().getString("hint");

            if (!TextUtils.isEmpty(mPreCommentText)) {

                commentEditText.setText(mPreCommentText);

            } else {

                commentEditText.setText("");

            }

            if (!TextUtils.isEmpty(mHint)) {

                commentEditText.setHint(mHint);

            } else {

                commentEditText.setText("");

            }

        }

    }

    @Override

    public void onStop() {

        super.onStop();

        dismissAllowingStateLoss();

        if (mHandler != null) {

            mHandler.removeMessages(1);

            mHandler = null;

        }

    }

    public class MyHandler extends Handler {

        private final WeakReference mActivty;

        private MyHandler(Activity mActivty) {

            this.mActivty = new WeakReference(mActivty);

        }

        @Override

        public void handleMessage(Message msg) {

            super.handleMessage(msg);

            Activity activity = mActivty.get();

            if (activity != null) {

                if (activity.isFinishing()) {

                    return;

                }

                switch (msg.what) {

                    case 1:

                        int[] location = new int[2];

                        llComment.getLocationOnScreen(location);

                        int height = location[1];

                        int screenHeight = SysUtils.getScreenSize(getActivity())[1];

                        if (height > screenHeight - 200) {

                            count++;

                            if (count > 1) {

                                //键盘缩起

                                if (mDialog != null) {

                                    mDialog.dismiss();

                                }

                                return;

                            }

                        }

                        mHandler.sendEmptyMessageDelayed(1, 200);

                        break;

                    default:

                        break;

                }

            }

        }

    }

    @Override

    public void onStart() {

        super.onStart();

        Window window = getDialog().getWindow();

        WindowManager.LayoutParams windowParams = window.getAttributes();

        windowParams.dimAmount = 0.0f;

        window.setAttributes(windowParams);

    }

    private void initListener() {

        commentEditText.setOnKeyListener(new View.OnKeyListener() {

            @Override

            public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {

                if (keyCode == KeyEvent.KEYCODE_ENTER && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {

                    //评论

                    sendComment(view);

                    return true;

                } else if (keyCode == KeyEvent.KEYCODE_BACK && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {

                    dismiss();

                }

                return false;

            }

        });

    }

    private void sendComment(View view) {

        String commentContent = commentEditText.getText().toString().trim();

        //                    String commentContent =  stringToUtf8(mEdtComment.getText().toString().trim());

        if (TextUtils.isEmpty(commentContent)) {

            Toast.makeText(getActivity(), "请输入内容", Toast.LENGTH_SHORT).show();

        } else {

            InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);

            if (imm.isActive(view)) {

                imm.hideSoftInputFromWindow(view.getApplicationWindowToken(), 0);

            }

            if (mCommentClickListener != null) {

                mCommentClickListener.toComment(commentContent);

            }

            dismiss();

        }

    }

    interface CommentClickListener {

        void toComment(String comment);

        String getCommentText();

        void setCommentText(String commentTextTemp);

    }

    public void setCommentClickListener(CommentClickListener commentClickListener) {

        this.mCommentClickListener = commentClickListener;

    }

    private void setSoftKeyboard() {

        commentEditText.setFocusable(true);

        commentEditText.setFocusableInTouchMode(true);

        commentEditText.requestFocus();

        //为 commentEditText 设置监听器,在 DialogFragment 绘制完后立即呼出软键盘,呼出成功后即注销

        commentEditText.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            @Override

            public void onGlobalLayout() {

                inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);

                if (inputMethodManager != null) {

                    if (inputMethodManager.showSoftInput(commentEditText, 0)) {

                        commentEditText.getViewTreeObserver().removeOnGlobalLayoutListener(this);

                    }

                }

                if (mHandler != null) {

                    mHandler.sendEmptyMessageDelayed(1, 200);

                }

            }

        });

    }

    @Override

    public void onClick(View view) {

        switch (view.getId()) {

            case R.id.tv_send:

                //发送

                sendComment(commentEditText);

                break;

            default:

                break;

        }

    }

    @Override

    public void onDismiss(DialogInterface dialog) {

        if (mCommentClickListener != null) {

            mCommentClickListener.setCommentText(commentEditText.getText().toString());

        }

        count = 0;

        super.onDismiss(dialog);

    }

    @Override

    public void onCancel(DialogInterface dialog) {

        if (mCommentClickListener != null) {

            mCommentClickListener.setCommentText(commentEditText.getText().toString());

        }

        count = 0;

        super.onCancel(dialog);

    }

}

你可能感兴趣的:(实现评论功能(弹框在软键盘上方))