Android點選顯示一個可編輯文字的dialog(解決失去游標問題)
前言:
一個簡單的實現方式舉例。
描述:
需求上可能會提出這樣一點:點選一個按鈕,展示一個dialog彈窗,這個彈窗上有①可編輯文字,②確定按鈕,③取消按鈕。
具體操作:
那麼針對這個需求,我們常規性的話,應該建立一個工程,寫一個demo,建立一個BaseActivity介面,讓我們後續建立的所有Activity都去繼承它。
比如我們建立完工程之後,預設是擁有MainActivity,那麼讓MainActivity去繼承BaseActivity,BaseActivity裡在下文會提到裡面要寫什麼內容。
MainActivity中,按需求功能,我們在它的XML檔案內建立一個Button控制元件,簡單設定常規屬於,然後在MainActivity中宣告:
如下:private Button btn_show_dialog;
再在onCreate方法中找到這個控制元件:
如下:btn_show_dialog=(Button)findViewById(btn_show_dialog);
再給這個控制元件增加點選事件:
btn_show_dialog.setOnClickListener(.....);
當執行點選事件時候,我們在點選的方法裡面去呼叫顯示彈窗的方法,我們建立一個彈窗佈局
如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="420dp" android:layout_height="217dp" android:layout_gravity="center" android:layout_marginLeft="@dimen/ds_43dp" android:layout_marginRight="@dimen/ds_43dp" android:background="@drawable/yuanjiao" android:orientation="vertical"> <!--修改使用者資料的dialog的彈窗--> <EditText android:id="@+id/edit_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/ds_60dp" android:background="@null" android:hint="請輸入要修改的內容" android:textColor="@color/cs_555555" android:textColorHint="@color/cs_999999" android:textSize="@dimen/ds_24sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="16dp" android:orientation="horizontal"> <!--是--> <Button android:id="@+id/btn_yes" android:layout_width="188dp" android:layout_height="@dimen/ds_43dp" android:layout_marginLeft="@dimen/ds_15dp" android:layout_marginRight="@dimen/ds_8dp" android:layout_weight="1" android:background="@drawable/greenyuanjiao" android:text="是" android:textColor="@color/white" android:textSize="@dimen/ds_20sp" /> <!--否--> <Button android:id="@+id/btn_no" android:layout_width="188dp" android:layout_height="@dimen/ds_43dp" android:layout_marginLeft="@dimen/ds_8dp" android:layout_marginRight="@dimen/ds_15dp" android:layout_weight="1" android:background="@drawable/moregrayyuanjiao" android:text="否" android:textColor="@color/white" android:textSize="@dimen/ds_20sp" /> </LinearLayout> </RelativeLayout>
然後我們寫一個顯示彈窗的方法:
/** * 點選個人資料的彈窗 **/ @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void showContentDialog() { grDdialog = new AlertDialog.Builder(mContext, R.style.Dialog).create(); grDdialog.setCancelable(false); grDdialog.setCanceledOnTouchOutside(true); grDdialog.setView(new EditText(mContext)); grDdialog.show(); grDdialog.getWindow().setContentView(R.layout.edit_teacher_info_dialog); final EditText edit_content = (EditText) grDdialog.findViewById(R.id.edit_content); grDdialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { // 解決EditText, 在dialog中無法自動彈出對話方塊的問題 showKeyboard(edit_content); } }); Button btn_yes = (Button) grDdialog.findViewById(R.id.btn_yes); Button btn_no = (Button) grDdialog.findViewById(R.id.btn_no); //是 btn_yes.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //做非空判斷 if (edit_content.getText().toString().length() > 0) { //學科 tv_charge_subject.setText(edit_content.getText().toString().trim()); grDdialog.dismiss(); } else { T.showShort(mContext, "請確保輸入的內容不為空!"); } } }); //否 btn_no.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { grDdialog.dismiss(); } }); }
注意:dialog在點選是,否的情況下都要dismiss。而且如果離開此頁面。在介面銷燬的生命週期,也要關閉
如下:if (grDdialog!=null){grDdialog.dismiss);}
建立一個解決彈窗內edittext點選失去游標的方法:
如下:
/** * 解決在dialog中無法自動彈出對話方塊的問題 **/ @TargetApi(Build.VERSION_CODES.CUPCAKE) public void showKeyboard(EditText editText) { if (editText != null) { //設定可獲得焦點 editText.setFocusable(true); editText.setFocusableInTouchMode(true); //請求獲得焦點 editText.requestFocus(); //呼叫系統輸入法 InputMethodManager inputManager = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); }
最後再附上:點選空白區域關閉軟鍵盤的3個常用方法,放在baseActivity中,這樣一套完整的demo就寫好了。
關閉軟鍵盤方法:
如下:
/** * 1點選空白位置 隱藏軟鍵盤 */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (isShouldHideKeyboard(v, ev)) { hideKeyboard(v.getWindowToken()); } } return super.dispatchTouchEvent(ev); } /** * 2根據EditText所在座標和使用者點選的座標相對比,來判斷是否隱藏鍵盤,因為當用戶點選EditText時則不能隱藏 */ private boolean isShouldHideKeyboard(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { int[] l = {0, 0}; v.getLocationInWindow(l); int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + v.getWidth(); if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { // 點選EditText的事件,忽略它。 return false; } else { return true; } } // 如果焦點不是EditText則忽略,這個發生在檢視剛繪製完,第一個焦點不在EditText上,和使用者用軌跡球選擇其他的焦點 return false; } /** * 3獲取InputMethodManager,隱藏軟鍵盤 */ private void hideKeyboard(IBinder token) { if (token != null) { InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); } }
版權宣告:本文為博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/qq_35874340/article/details/80663797