最近一个月都在超强度的加班中,博客都没时间维护了,搬了一个月砖也没有什么长进,不过有个评论回复的需求还是可以动脑子的。就跟qq空间的回复框弹出的效果差不多。
简单分析
为了做出这个效果,我把qq空间的回复效果仔细分析了一遍。首先他的输入框是跟随系统键盘一起弹出和收回的,如果不做回复操作,直接隐藏系统键盘的话输入框会停留在屏幕底部,触摸屏幕的任何位置输入框都会消失,不难看出他是在点击回复的时候,弹出一个Dialog,Dialog中添加了一个自定义布局;如果做回复操作后就键盘会自动收回,输入框也会跟着键盘的动画消失;就这么简单的实现了随键盘弹出和收回的动画。
核心代码
protected Dialog onCreateDialog() {
final Dialog mDialog = new Dialog(context);
//加载自定义布局
View mView = View.inflate(context,R.layout.dialog_comment, null);
final EditText edt_reply = (EditText) mView.findViewById(R.id.edt_comments);
Button btn_reply = (Button) mView.findViewById(R.id.btn_send);
edt_reply.setFocusable(true);
mDialog .requestWindowFeature(Window.FEATURE_NO_TITLE);
mDialog .getWindow().setGravity(Gravity.BOTTOM);
mDialog .setContentView(mView);
ColorDrawable cd = new ColorDrawable(0x000000);
mDialog .getWindow().setBackgroundDrawable(cd);
//弹出系统键盘
TDevice.showSoftKeyboard(mDialog);
mDialog .show();
btn_reply.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//回复操作
});
mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
TDevice.hideSoftKeyboard(edt_reply);
}
});
return mDialog ;
}
以上代码中:
- requestWindowFeature(Window.FEATURE_NO_TITLE) 去除Dialog的标题
- setGravity(Gravity.BOTTOM) 设置初始位置在屏幕底部,当键盘弹出时刚好把输入框顶上去。
- TDevice.showSoftKeyboard(mDialog); TDevice一个弹键盘的工具类,这行代码必须放在mDialog .show();之前,具体代码如下。
public static void showSoftKeyboard(Dialog dialog) {
dialog.getWindow().setSoftInputMode(4);
}
隐藏软键盘
public static void hideSoftKeyboard(View view) {
if (view == null)
return;
View focusView = null;
if (view instanceof EditText)
focusView = view;
Context context = view.getContext();
if (context != null && context instanceof Activity) {
Activity activity = ((Activity) context);
focusView = activity.getCurrentFocus();
}
if (focusView != null) {
if (focusView.isFocused()) {
focusView.clearFocus();
}
InputMethodManager manager = (InputMethodManager) focusView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
manager.hideSoftInputFromWindow(focusView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
manager.hideSoftInputFromInputMethod(focusView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
基本上思路就这样,效果图自己想象吧