Android 仿今日头条评论输入框

释放双眼,带上耳机,听听看~!

相信不少小伙伴,在做评论功能的时候,都被输入框恶心过。
产品总会要求,自己的产品输入框要有自己特色。
既然如此,那就自己写一个呗。
先上效果图:
这里写图片描述
做一个输入框dialog很难吗?可能有些接触android不久的小小伙伴会觉得,难以入手。那我们就拆成几部来做,其实很简单。
第一步: 写弹出框样式布局
这里写图片描述
布局就一个EditText和一个TextView,做了下背景的圆角和描边处理,很快我们就可以撸出来了。在自定义View的时候,将这个布局inflate出来。
第二步 软键盘顶起dialog
可能有的手机什么都不设置,软键盘就会把dialog弹起,有的手机则会遮住dialog布局。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

详情参考 谷哥的小弟 探索Android软键盘的疑难杂症http://blog.csdn.net/lfdfhl/article/details/52415390
第三步 布局做好了,你的软键盘也确定在挡住dialog位置的时候,会把dialog弹起,那剩下的事,就是讲dialog置于屏幕底部,点击需要评论的时候,showDialog,然后EditText聚焦,软键盘弹出讲dialog顶起,自然我们想要的效果就出来了
自定义评论框Dialog代码

import android.annotation.SuppressLint;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.DialogFragment;
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.TextView;
import android.widget.Toast;
public class KeyMapDailog extends DialogFragment {
//点击发表,内容不为空时的回调
public SendBackListener sendBackListener;
public interface  SendBackListener{
void sendBack(String inputText);
}
private ProgressDialog progressDialog;
private String texthint;
private Dialog dialog;
private EditText inputDlg;
private int numconut=300;
private String tag=null;
public KeyMapDailog() {
}
@SuppressLint("ValidFragment")
public KeyMapDailog(String texthint, SendBackListener sendBackListener){//提示文字
this.texthint=texthint;
this.sendBackListener=sendBackListener;
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
// 使用不带Theme的构造器, 获得的dialog边框距离屏幕仍有几毫米的缝隙。
dialog = new Dialog(getActivity(), R.style.BottomDialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置Content前设定
//        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
View contentview = View.inflate(getActivity(), R.layout.comment_dialog_layout, null);
dialog.setContentView(contentview);
dialog.setCanceledOnTouchOutside(true); // 外部点击取消
// 设置宽度为屏宽, 靠近屏幕底部。
Window window = dialog.getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.gravity = Gravity.BOTTOM; // 紧贴底部
lp.alpha = 1;
lp.dimAmount = 0.5f;
lp.width = WindowManager.LayoutParams.MATCH_PARENT; // 宽度持平
window.setAttributes(lp);
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
inputDlg = (EditText) contentview.findViewById(R.id.dialog_comment_content);
inputDlg.setHint(texthint);
final TextView tv_send = (TextView) contentview.findViewById(R.id.dialog_comment_send);
inputDlg.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) {
tv_send.setBackgroundResource(R.drawable.corners_review_cansend);
} else {
tv_send.setBackgroundResource(R.drawable.corners_review_send);
}
}
});
tv_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.isEmpty(inputDlg.getText().toString())) {
//                    ToastUtils.getInstance().showToast("输入内容为空奥");
Toast.makeText(getActivity(),"输入内容为空",Toast.LENGTH_LONG).show();
return;
} else {
progressDialog = new ProgressDialog(getActivity());
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
sendBackListener.sendBack(inputDlg.getText().toString());
}
}
});
inputDlg.setFocusable(true);
inputDlg.setFocusableInTouchMode(true);
inputDlg.requestFocus();
final Handler hanler = new Handler();
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
public InputMethodManager mInputMethodManager;
@Override
public void onDismiss(DialogInterface dialog) {
hanler.postDelayed(new Runnable() {
@Override
public void run() {
hideSoftkeyboard();
}
}, 200);
}
});
return dialog;
}
public void hideProgressdialog(){
progressDialog.cancel();
}
public void hideSoftkeyboard() {
try {
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
} catch (NullPointerException e) {
}
}
}

使用:

KeyMapDailog  dialog =new KeyMapDailog("隐藏文字", new KeyMapDailog.SendBackListener() {
@Override
public void sendBack(String inputText) {
//TODO  点击发表后业务逻辑
}
});

很多IM软件,需要在软键盘上加一行选择表情,拍照等功能的菜单栏,再上面是输入框。效果自己脑补~
源代码链接http://download.csdn.net/detail/qq_31390699/9717746

人已赞赏
Android文章

Android 根据图片高度动态设置ViewPager高度

2020-4-16 20:16:58

Android文章

Android Dialog的封装

2020-4-16 21:33:05

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索