您現在的位置是:首頁 > 網路遊戲首頁網路遊戲

Android實現彈窗中有輸入框填寫內容

簡介}*設定輸入的文字*public void setText(String text) {messageTextView

怎麼彈出輸入框

「來源: |龍旋 ID:longxuanzhigu」

一、前言:

最近,在做社群的時候,遇到點選評論的時候,彈起輸入框,填寫文字,鍵盤的彈起和隱藏一直控制不好,借用同事的方法,總結使用一下。

效果圖如下:

Android實現彈窗中有輸入框填寫內容

二、程式碼:

1、主類方法呼叫:

public class MainActivity extends AppCompatActivity { //輸入彈窗 private InputTextMsgDialog inputTextMsgDialog; private Timer timer; @Override protected void onCreate(Bundle savedInstanceState) { super。onCreate(savedInstanceState); setContentView(R。layout。activity_main); Button btn = findViewById(R。id。btn); btn。setOn​ClickListener(new View。On​ClickListener() { @Override public void on​Click(View view) { showSoft(); } }); } /** * 彈起鍵盤 */ private void showSoft() { try { if (inputTextMsgDialog == null) { inputTextMsgDialog = new InputTextMsgDialog(MainActivity。this, R。style。dialog_center); inputTextMsgDialog。setHint(“請輸入聊天內容”); } if (timer == null) { timer = new Timer(); } timer。schedule(new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { inputTextMsgDialog。showKeyboard(); } }); } }, 100); inputTextMsgDialog。show(); inputTextMsgDialog。setmOnTextSendListener(new InputTextMsgDialog。OnTextSendListener() { @Override public void onInputTextString(String msg) { // LogUtils。d(“msg===========” + msg); } @Override public void on​ClickSend(String message) { String comment = message。replace(“ ”, “”); if (!TextUtils。isEmpty(comment)) { Toast。makeText(MainActivity。this, comment, Toast。LENGTH_SHORT)。show(); } else { Toast。makeText(MainActivity。this, “請輸入聊天內容”, Toast。LENGTH_SHORT)。show(); } } }); } catch (Exception e) { e。printStackTrace(); } }}

注意:

鍵盤彈起必須主執行緒,而且是要延時彈起;

2、stytle 風格 dialog_center

<!—— 輸入框中間彈出框 Theme。AppCompat。Dialog。Alert ——><!—— parent=“@android:style/Theme。Holo。Light。Dialog”——>

3、InputTextMsgDialog檔案

public class InputTextMsgDialog extends AppCompatDialog {private Context mContext;private InputMethodManager imm;private ScrollViewEditText messageTextView;private TextView confirmBtn;private KeyboardLayout rlDlg;private int mLastDiff = 0;private int maxNumber = 150;public interface OnTextSendListener {void onInputTextString(String msg);void on​ClickSend(String message); }private OnTextSendListener mOnTextSendListener;public InputTextMsgDialog(@NonNull Context context, int theme) {super(context, theme);this。mContext = context; init(); setLayout(); }/** * 最大輸入字數 預設200 */@SuppressLint(“SetTextI18n”)public void setMaxNumber(int maxNumber) {this。maxNumber = maxNumber; }/** * 設定輸入提示文字 */public void setHint(String text) { messageTextView。setHint(text); }/*設定輸入的文字*/public void setText(String text) { messageTextView。setText(text); }public void setTextInit(){ rlDlg。mHasInit=false; }/** * 設定按鈕的文字 預設為:傳送 */public void setBtnText(String text) { confirmBtn。setText(text); }private void init() { setContentView(R。layout。dialog_input_text_msg); getWindow()。getDecorView()。setPadding(0,0,0,0); WindowManager windowManager = getWindow()。getWindowManager(); Display display = windowManager。getDefaultDisplay(); WindowManager。LayoutParams lp = getWindow()。getAttributes(); lp。width = WindowManager。LayoutParams。MATCH_PARENT; getWindow()。setAttributes(lp); messageTextView = findViewById(R。id。et_input_message); ConstraintLayout rldlgview =findViewById(R。id。rl_inputdlg_view); messageTextView。addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }@Overridepublic void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { Editable editable = messageTextView。getText();int len = editable。length();if(len > maxNumber) { Toast。makeText(mContext,“最大可輸入”+maxNumber+“個字元”,Toast。LENGTH_SHORT);int selEndIndex = Selection。getSelectionEnd(editable); String str = editable。toString();//擷取新字串 String newStr = str。substring(0,maxNumber); messageTextView。setText(newStr); editable = messageTextView。getText();//新字串的長度int newLen = editable。length();//舊游標位置超過字串長度if(selEndIndex > newLen) { selEndIndex = editable。length(); }//設定新游標所在的位置 Selection。setSelection(editable, selEndIndex); } }@Overridepublic void afterTextChanged(Editable editable) {if (editable。length() == 0) { confirmBtn。setTextColor(mContext。getResources()。getColor(R。color。color_FFCCCCCC)); } else { confirmBtn。setTextColor(mContext。getResources()。getColor(R。color。color_FF666666)); } } }); confirmBtn = (TextView) findViewById(R。id。confrim_btn); imm = (InputMethodManager) mContext。getSystemService(INPUT_METHOD_SERVICE); messageTextView。setOnEditorActionListener(new TextView。OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {switch (actionId) {case KeyEvent。KEYCODE_ENDCALL:case KeyEvent。KEYCODE_ENTER:// if (messageTextView。getText()。length() > maxNumber) {// Toast。makeText(mContext, “超過最大字數限制”, Toast。LENGTH_LONG)。show();// return true;// }// if (messageTextView。getText()。length() > 0) {// imm。hideSoftInputFromWindow(messageTextView。getWindowToken(), 0);// dismiss();// } else {// Toast。makeText(mContext, “請輸入文字”, Toast。LENGTH_LONG)。show();// }return true;case KeyEvent。KEYCODE_BACK: dismiss();return false;default:return false; } } }); messageTextView。setOnKeyListener(new View。OnKeyListener() {@Overridepublic boolean onKey(View view, int i, KeyEvent keyEvent) { Log。d(“My test”, “onKey ” + keyEvent。getCharacters());return false; } }); confirmBtn。setOn​ClickListener(new View。On​ClickListener() {@Overridepublic void on​Click(View v) { mOnTextSendListener。on​ClickSend(messageTextView。getText()。toString()。trim()); imm。showSoftInput(messageTextView, InputMethodManager。SHOW_FORCED); imm。hideSoftInputFromWindow(messageTextView。getWindowToken(), 0); messageTextView。setText(“”); dismiss(); } }); rlDlg = findViewById(R。id。rl_outside_view); findViewById(R。id。rl_background)。setOn​ClickListener(new View。On​ClickListener() {@Overridepublic void on​Click(View v) { mOnTextSendListener。onInputTextString(messageTextView。getText()。toString()。trim()); imm。showSoftInput(messageTextView, InputMethodManager。SHOW_FORCED); imm。hideSoftInputFromWindow(messageTextView。getWindowToken(), 0); messageTextView。setText(“”); dismiss(); } }); rlDlg。setOnkbdStateListener(new KeyboardLayout。onKybdsChangeListener() {@Overridepublic void onKeyBoardStateChange(int state) {switch (state) {case KeyboardLayout。KEYBOARD_STATE_HIDE:// Toast。makeText(getApplicationContext(), “軟鍵盤隱藏”, Toast。LENGTH_SHORT)。show();// Log。e(“KeyboardLayout”,“KeyboardLayout——軟鍵盤隱藏”); mOnTextSendListener。onInputTextString(messageTextView。getText()。toString()。trim()); messageTextView。setText(“”);if(isShowing()){ dismiss(); }break;case KeyboardLayout。KEYBOARD_STATE_SHOW:// Toast。makeText(getApplicationContext(), “軟鍵盤彈起”, Toast。LENGTH_SHORT)。show();break; } } }); rldlgview。setOn​ClickListener(new View。On​ClickListener() {@Overridepublic void on​Click(View v) { imm。hideSoftInputFromWindow(messageTextView。getWindowToken(), 0); dismiss(); } }); setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent keyEvent) {if (keyCode == KeyEvent。KEYCODE_BACK && keyEvent。getRepeatCount() == 0) { dismiss(); }return false; } }); }public void showKeyboard() {if(messageTextView!=null){//設定可獲得焦點 messageTextView。setFocusable(true); messageTextView。setFocusableInTouchMode(true);//請求獲得焦點 messageTextView。requestFocus();//呼叫系統輸入法// InputMethodManager imm = (InputMethodManager) mContext。getSystemService(INPUT_METHOD_SERVICE);// imm。showSoftInput(messageTextView, 0);// imm。toggleSoftInput(0, InputMethodManager。HIDE_NOT_ALWAYS); InputMethodManager inputMethodManager=(InputMethodManager)mContext。 getSystemService(Context。INPUT_METHOD_SERVICE); inputMethodManager。showSoftInput(messageTextView, InputMethodManager。HIDE_NOT_ALWAYS); } }private void setLayout() { getWindow()。setGravity(Gravity。BOTTOM); WindowManager m = getWindow()。getWindowManager(); Display d = m。getDefaultDisplay(); WindowManager。LayoutParams p = getWindow()。getAttributes(); p。width = WindowManager。LayoutParams。MATCH_PARENT; p。height = WindowManager。LayoutParams。WRAP_CONTENT; getWindow()。setAttributes(p); setCancelable(true); getWindow()。setSoftInputMode(WindowManager。LayoutParams。SOFT_INPUT_STATE_VISIBLE); }public void setmOnTextSendListener(OnTextSendListener onTextSendListener) {this。mOnTextSendListener = onTextSendListener; }@Overridepublic void dismiss() {super。dismiss();//dismiss之前重置mLastDiff值避免下次無法開啟 mLastDiff = 0; rlDlg。setmHasInit(false); rlDlg。setmHasKeybord(false); }@Overridepublic void show() {super。show(); }}

dialog_input_text_msg.xml 佈局檔案

<?xml version=“1。0” encoding=“utf-8”?>

4、ScrollViewEditText 檔案

@SuppressLint(“AppCompatCustomView”)public class ScrollViewEditText extends EditText {//滑動距離的最大邊界private int mOffsetHeight;//是否到頂或者到底的標誌private boolean mBottomFlag = false;public ScrollViewEditText(Context context) {super(context); init(); }public ScrollViewEditText(Context context, AttributeSet attrs) {super(context, attrs); init(); }public ScrollViewEditText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr); init(); }private void init() { }@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super。onMeasure(widthMeasureSpec, heightMeasureSpec);int paddingTop;int paddingBottom;int mHeight;int mLayoutHeight;//獲得內容面板 Layout mLayout = getLayout();//獲得內容面板的高度 mLayoutHeight = mLayout。getHeight();//獲取上內邊距 paddingTop = getTotalPaddingTop();//獲取下內邊距 paddingBottom = getTotalPaddingBottom();//獲得控制元件的實際高度 mHeight = getHeight();//計算滑動距離的邊界 mOffsetHeight = mLayoutHeight + paddingTop + paddingBottom - mHeight; }@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {if (event。getAction() == MotionEvent。ACTION_DOWN)//如果是新的按下事件,則對mBottomFlag重新初始化 mBottomFlag = false;//如果已經不要這次事件,則傳出取消的訊號,這裡的作用不大if (mBottomFlag) event。setAction(MotionEvent。ACTION_CANCEL);return super。dispatchTouchEvent(event); }@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean result = super。onTouchEvent(event);//如果是需要攔截,則再攔截,這個方法會在onScrollChanged方法之後再呼叫一次if (!mBottomFlag) getParent()。requestDisallowInterceptTouchEvent(true);return result; }@Overrideprotected void onScrollChanged(int horiz, int vert, int oldHoriz, int oldVert) {super。onScrollChanged(horiz, vert, oldHoriz, oldVert);if (vert == mOffsetHeight || vert == 0) {//這裡觸發父佈局或祖父佈局的滑動事件 getParent()。requestDisallowInterceptTouchEvent(false); mBottomFlag = true; } }}

5、KeyboardLayout檔案

public class KeyboardLayout extends RelativeLayout {private static final String TAG = KeyboardLayout。class。getSimpleName();public static final byte KEYBOARD_STATE_SHOW = -3;public static final byte KEYBOARD_STATE_HIDE = -2;public static final byte KEYBOARD_STATE_INIT = -1;public boolean mHasInit;private boolean mHasKeybord;private int mHeight;private onKybdsChangeListener mListener;public void setmHasInit(boolean mHasInit) {this。mHasInit = mHasInit; }public void setmHasKeybord(boolean mHasKeybord) {this。mHasKeybord = mHasKeybord; }public KeyboardLayout(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle); }public KeyboardLayout(Context context, AttributeSet attrs) {super(context, attrs); }public KeyboardLayout(Context context) {super(context); }/** * set keyboard state listener */public void setOnkbdStateListener(onKybdsChangeListener listener) { mListener = listener; }@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {super。onLayout(changed, l, t, r, b);if (!mHasInit) { mHasInit = true; mHeight = b;if (mListener != null) { mListener。onKeyBoardStateChange(KEYBOARD_STATE_INIT); } } else { mHeight = mHeight < b ? b : mHeight; }if (mHasInit && mHeight > b) { mHasKeybord = true;if (mListener != null) { mListener。onKeyBoardStateChange(KEYBOARD_STATE_SHOW); } Log。w(TAG, “show keyboard……。”); }if (mHasInit && mHasKeybord && mHeight == b) { mHasKeybord = false;if (mListener != null) { mListener。onKeyBoardStateChange(KEYBOARD_STATE_HIDE); } Log。w(TAG, “hide keyboard……。”); } }public interface onKybdsChangeListener {public void onKeyBoardStateChange(int state); }}

6、handler延時彈起程式碼示例:

private final int BOND = 1;private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super。handleMessage(msg);switch (msg。what){case BOND: InputMethodManager inputMethodManager = (InputMethodManager) context。getSystemService(Context。INPUT_METHOD_SERVICE); inputMethodManager。toggleSoftInput(0, InputMethodManager。HIDE_NOT_ALWAYS);break; } }};InputPwdDialog inputPwdDialog = new InputPwdDialog(context,Gravity。BOTTOM,R。layout。item_dialog); inputPwdDialog。show();handler。sendEmptyMessageDelayed(BOND,100);

原始碼地址:

https://gitee。com/luoyanyong/InputMsgDialog

到這裡就結束啦。

Top