1. 程式人生 > >Android點選顯示一個可編輯文字的dialog(解決失去游標問題)

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