package com.mylhyl.circledialog.view; import android.content.Context; import android.text.InputFilter; import android.text.InputType; import android.text.TextUtils; import android.view.View; import android.view.ViewTreeObserver; import android.widget.EditText; import android.widget.RelativeLayout; import android.widget.TextView; import com.mylhyl.circledialog.internal.BackgroundHelper; import com.mylhyl.circledialog.internal.CircleParams; import com.mylhyl.circledialog.internal.Controller; import com.mylhyl.circledialog.internal.EmojiFilter; import com.mylhyl.circledialog.internal.MaxLengthEnWatcher; import com.mylhyl.circledialog.internal.MaxLengthWatcher; import com.mylhyl.circledialog.params.DialogParams; import com.mylhyl.circledialog.params.InputParams; import com.mylhyl.circledialog.params.SubTitleParams; import com.mylhyl.circledialog.params.TitleParams; import com.mylhyl.circledialog.res.drawable.InputDrawable; import com.mylhyl.circledialog.res.values.CircleDimen; import com.mylhyl.circledialog.view.listener.InputView; import com.mylhyl.circledialog.view.listener.OnCreateInputListener; import com.mylhyl.circledialog.view.listener.OnInputCounterChangeListener; import static com.mylhyl.circledialog.res.values.CircleDimen.INPUT_COUNTER__TEXT_SIZE; /** * Created by hupei on 2017/3/31. *

* 输入框 *

*/ final class BodyInputView extends RelativeLayout implements InputView { private DialogParams mDialogParams; private TitleParams mTitleParams; private SubTitleParams mSubTitleParams; private InputParams mInputParams; private OnInputCounterChangeListener mOnInputCounterChangeListener; private OnCreateInputListener mOnCreateInputListener; private EditText mEditText; private TextView mTvCounter; public BodyInputView(Context context, CircleParams circleParams) { super(context); init(circleParams); } @Override public EditText getInput() { return mEditText; } @Override public View getView() { return this; } private void init(CircleParams circleParams) { mDialogParams = circleParams.dialogParams; mTitleParams = circleParams.titleParams; mSubTitleParams = circleParams.subTitleParams; mInputParams = circleParams.inputParams; mOnInputCounterChangeListener = circleParams.circleListeners.inputCounterChangeListener; mOnCreateInputListener = circleParams.circleListeners.createInputListener; int rlPaddingTop = mTitleParams == null ? mSubTitleParams == null ? CircleDimen.TITLE_PADDING[1] : mSubTitleParams.padding[1] : mTitleParams.padding[1]; setPadding(0, Controller.dp2px(getContext(), rlPaddingTop), 0, 0); //如果标题没有背景色,则使用默认色 int backgroundColor = mInputParams.backgroundColor != 0 ? mInputParams.backgroundColor : mDialogParams.backgroundColor; BackgroundHelper.handleBodyBackground(this, backgroundColor, circleParams); // fix: 2020/4/27 八阿哥 since 5.2.0 修复软键盘自动弹出的问题 setFocusableInTouchMode(true); setFocusable(true); createInput(); createCounter(); if (mInputParams.isEmojiInput) { mEditText.setFilters(new InputFilter[]{new EmojiFilter()}); } if (mOnCreateInputListener != null) { mOnCreateInputListener.onCreateText(this, mEditText, mTvCounter); } } private void createInput() { mEditText = new EditText(getContext()); mEditText.setId(android.R.id.input); int inputType = mInputParams.inputType; if (inputType != InputType.TYPE_NULL) { mEditText.setInputType(mInputParams.inputType); } if (mDialogParams.typeface != null) { mEditText.setTypeface(mDialogParams.typeface); } mEditText.setHint(mInputParams.hintText); mEditText.setHintTextColor(mInputParams.hintTextColor); mEditText.setTextSize(mInputParams.textSize); mEditText.setTextColor(mInputParams.textColor); mEditText.getViewTreeObserver() .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mEditText.getViewTreeObserver().removeOnGlobalLayoutListener(this); int height = mEditText.getMeasuredHeight(); if (mInputParams.inputHeight > height) { mEditText.setHeight(Controller.dp2px(getContext(), mInputParams.inputHeight)); } } }); mEditText.setGravity(mInputParams.gravity); if (!TextUtils.isEmpty(mInputParams.text)) { mEditText.setText(mInputParams.text); mEditText.setSelection(mInputParams.text.length()); } int backgroundResourceId = mInputParams.inputBackgroundResourceId; if (backgroundResourceId == 0) { int strokeWidth = Controller.dp2px(getContext(), mInputParams.strokeWidth); InputDrawable inputDrawable = new InputDrawable(strokeWidth, mInputParams.strokeColor, mInputParams.inputBackgroundColor); BackgroundHelper.handleBackground(mEditText, inputDrawable); } else { mEditText.setBackgroundResource(backgroundResourceId); } LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); int[] margins = mInputParams.margins; if (margins != null) { layoutParams.setMargins(Controller.dp2px(getContext(), margins[0]), Controller.dp2px(getContext(), margins[1]), Controller.dp2px(getContext(), margins[2]), Controller.dp2px(getContext(), margins[3])); } int[] padding = mInputParams.padding; if (padding != null) { mEditText.setPadding(Controller.dp2px(getContext(), padding[0]), Controller.dp2px(getContext(), padding[1]), Controller.dp2px(getContext(), padding[2]), Controller.dp2px(getContext(), padding[3])); } mEditText.setTypeface(mEditText.getTypeface(), mInputParams.styleText); addView(mEditText, layoutParams); } private void createCounter() { if (mInputParams.maxLen <= 0) { } LayoutParams layoutParamsCounter = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); //右下 layoutParamsCounter.addRule(ALIGN_RIGHT, android.R.id.input); layoutParamsCounter.addRule(ALIGN_BOTTOM, android.R.id.input); if (mInputParams.counterMargins != null) { layoutParamsCounter.setMargins(0, 0, Controller.dp2px(getContext(), mInputParams.counterMargins[0]), Controller.dp2px(getContext(), mInputParams.counterMargins[1])); } mTvCounter = new TextView(getContext()); if (mDialogParams.typeface != null) { mTvCounter.setTypeface(mDialogParams.typeface); } mTvCounter.setTextSize(INPUT_COUNTER__TEXT_SIZE); mTvCounter.setTextColor(mInputParams.counterColor); if (mInputParams.isCounterAllEn) { mEditText.addTextChangedListener(new MaxLengthEnWatcher(mInputParams.maxLen, mEditText, mTvCounter, mOnInputCounterChangeListener)); } else { mEditText.addTextChangedListener(new MaxLengthWatcher(mInputParams.maxLen, mEditText, mTvCounter, mOnInputCounterChangeListener)); } addView(mTvCounter, layoutParamsCounter); } }