需求是输入框和软键盘一起弹出,效果图如下:
可以使用Dialog 的形式,因为Dialog中如果有输入框的话在弹出软键盘后会将弹窗顶起,这样就实现了这个效果:
本次使用DialogFragment 可以方便管理Dialog的生命周期
代码如下:
public class InputDialogForFeedBack extends DialogFragment { private Dialog dialog; private EditText editText; private View contentView; private Handler handler = new Handler(); private IInputFinishCallback callback; private TextView cancel; private TextView submit; private TextView textNumber; public interface IInputFinishCallback{ void sendStr(String inputStr); } public InputDialogForFeedBack(IInputFinishCallback callback) { this.callback = callback; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { dialog = new Dialog(getActivity(),R.style.Dialog_NoTitle); initView(); setDialgParms(); initEvent(); return dialog; } private void initEvent() { submit.setOnClickListener(v -> { String trim = editText.getText().toString().trim(); if (!TextUtils.isEmpty(trim) && trim.length() <= 200){ callback.sendStr(trim); dialog.dismiss(); }else { ToastUtils.showSmallCenter("输入为空"); } }); cancel.setOnClickListener(v -> { dialog.dismiss(); }); editText.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) { String s1 = s.toString(); if (!TextUtils.isEmpty(s1)){ if (s1.length() > 200){ ToastUtils.showSmallCenter("不能超过200个字符"); return; } textNumber.setText(s1.length()+"/200"); } } }); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { public InputMethodManager mInputMethodManager; @Override public void onDismiss(DialogInterface dialog) { handler.postDelayed(new Runnable() { @Override public void run() { hideSoftkeyboard(); } }, 200); } }); } private void setDialgParms() { Window window = dialog.getWindow(); WindowManager.LayoutParams wml = window.getAttributes(); DisplayMetrics dm = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); wml.width = dm.widthPixels; wml.gravity = Gravity.BOTTOM; window.setAttributes(wml); editText.setFocusable(true); editText.setFocusableInTouchMode(true); } private void initView() { contentView = LayoutInflater.from(getContext()).inflate(R.layout.input_feed_back_dialog_layout,null); editText = contentView.findViewById(R.id.dialog_input_et); cancel = contentView.findViewById(R.id.dialog_cancel_tv); submit = contentView.findViewById(R.id.dialog_submit_tv); textNumber = contentView.findViewById(R.id.dialog_text_number_tv); dialog.setContentView(contentView); } public static void showKeyboard(View view) { InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { view.requestFocus(); imm.showSoftInput(view, 0); } } public void hideSoftkeyboard() { try { ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)) .hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } catch (NullPointerException e) { } } @Override public void onResume() { super.onResume(); handler.postDelayed(new Runnable() { @Override public void run() { showKeyboard(editText); } },300); } @Override public void onDestroy() { super.onDestroy(); if (dialog != null){ dialog.dismiss(); dialog = null; } if (callback != null){ callback = null; } if (handler != null){ handler.removeCallbacksAndMessages(null); handler = null; } } }
使用的话很简单
InputDialogForFeedBack dialog = new InputDialogForFeedBack(new InputDialogForFeedBack.IInputFinishCallback() { @Override public void sendStr(String inputStr) { //TODO 提交反馈信息 } }); dialog.showNow(fragmentManager,"input");
附:弹窗的样式代码
<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog"> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowAnimationStyle">@style/AnimationPicker</item> </style>
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/addevelopment/890736.html