Cách hiển thị bàn phím mềm khi tập trung edittext


461

Tôi muốn tự động hiển thị bàn phím mềm khi EditTexttập trung (nếu thiết bị không có bàn phím vật lý) và tôi có hai vấn đề:

  1. Khi tôi Activityđược hiển thị, tôi EditTexttập trung nhưng bàn phím không được hiển thị, tôi cần nhấp lại vào bàn phím để hiển thị bàn phím (nó sẽ được hiển thị khi tôi Activityhiển thị).

  2. Và khi tôi nhấp vào xong trên bàn phím, bàn phím bị từ chối nhưng EditTextvẫn tập trung và bạn không muốn (vì chỉnh sửa của tôi đã xong).

Để tiếp tục, vấn đề của tôi là có một cái gì đó giống như trên iPhone: giữ cho đồng bộ hóa bàn phím với EditTexttrạng thái của tôi (tập trung / không tập trung) và tất nhiên không hiển thị bàn phím mềm nếu có bàn phím vật lý.


Tôi chỉ có một EditText cơ bản như: <EditText android: id = "@ + id / myEditText" android: layout_creen = "fill_parent" android: layout_height = "quấn_content" android: imeOptions = "actionDone" /> Và trên hoạt động của tôi này: EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestF Focus ();
Ludovic Landry

2
Điều này giúp tôi tốt hơn bất kỳ câu trả lời nào trong bài đăng này: stackoverflow.com/a/2418314/1491212
Armel Larcier

Câu trả lời:


628

Để buộc bàn phím mềm xuất hiện, bạn có thể sử dụng

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
yourEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

Và để loại bỏ sự tập trung vào EditText, thật đáng buồn, bạn cần phải có một hình nộm Viewđể lấy tiêu điểm.

Tôi hi vọng cái này giúp được


Để đóng nó, bạn có thể sử dụng

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);

Điều này hoạt động để sử dụng nó trong một hộp thoại

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}

2
Nếu tôi làm điều này, bàn phím mềm sẽ hiển thị khi hoạt động xuất hiện (tốt) nhưng khi tiêu điểm của tôi rời khỏi EditText và đi đến Nút chẳng hạn, bàn phím vẫn ở đó (điều đó rất tệ).
Ludovic Landry

157
Không hoạt động với tôi với EditText trong hộp thoại đã có tiêu điểm. Không chắc chắn lý do tại sao.
Matthias

10
@AbdellahBenhammou, có lẽ đang thực hiện một cuộc gọi yêu cầu Tập trung vào văn bản chỉnh sửa của bạn trước khi hiển thị đầu vào mềm có thể giải quyết vấn đề của bạn. Nó đã làm cho tôi.
r1k0

18
@AbdellahBenhammou, hãy làm điều này trong DialogFragment's onCreate (): getDialog (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Phillip

22
Chỉ hoạt động cùng với yourEditText.requestFocus()như được mô tả ở đây: stackoverflow.com/questions/8991522/ấc
Vivek Pandey

231

Tôi đã từng gặp vấn đề tương tự. Ngay sau khi chỉnh sửa, thay đổi TẦM NHÌN thay đổi từ Gone thành VISIBLE, tôi phải đặt tiêu điểm và hiển thị bàn phím mềm. Tôi đã đạt được điều này bằng cách sử dụng mã sau đây:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

Nó hoạt động với tôi với độ trễ 100ms, nhưng không thành công mà không có độ trễ hoặc chỉ có độ trễ 1ms.

Phần bình luận của mã cho thấy một cách tiếp cận khác, chỉ hoạt động trên một số thiết bị. Tôi đã thử nghiệm trên các phiên bản HĐH 2.2 (trình giả lập), 2.2.1 (thiết bị thực) và 1.6 (trình giả lập).

Cách tiếp cận này đã cứu tôi rất nhiều nỗi đau.


48
Tôi không biết một cái gì đó có thể xấu và đẹp như vậy cùng một lúc. Cảm ơn bạn rất nhiều!
mkerley

15
@jellyfish này mô phỏng một vòi trên EditText. Đối với những người khác đọc điều này, thay vì tạo một cái mới, Handlerbạn cũng có thể sử dụng View.postDelayed()phương thức trên yourEditTextchính widget.
Tony Chan

5
Đây là một hack - giải pháp tốt hơn nhiều của David Chandler.
Ben Bederson

4
Nếu giải pháp của David Chandler hoạt động trên tất cả các phiên bản / thiết bị Android và trong trường hợp khi TẦM NHÌN vừa được thay đổi từ Gone thành VISIBLE, thì CÓ - thay vào đó, bạn nên sử dụng giải pháp của anh ấy.
Mike Keskinov

3
Đã đồng ý. Bạn có biết giải pháp tốt hơn hoạt động trên tất cả các hương vị Android?
Mike Keskinov

162

Để làm cho bàn phím xuất hiện, sử dụng

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

Phương pháp này đáng tin cậy hơn là gọi trực tiếp InputMethodManager.

Để đóng nó, sử dụng

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

12
Ai đó có thể vui lòng giải thích tại sao điều này đáng tin cậy hơn là gọi trực tiếp InputMethodManager? (Đối với một, nó không hoạt động, không giống như giải pháp của raukodraug.)
Matthew Quiros

5
Nó cũng không làm việc cho tôi. Làm việc trong Android 2.3.5. giải pháp của raukodraug có tác dụng với tôi. Tìm kiếm phụ thuộc phiên bản nhưng không thể tìm thấy.
Hugo Logmans

2
Điều này làm việc cho tôi trong Android 4.4.2. Phương thức InputMethodManager được chọn làm giải pháp cho bài đăng này không phù hợp với tôi.
Phil

Sau khi sử dụng phương thức trong câu trả lời, tôi đã nối nó và nó hoạt động, nhưng không có nó thì nó không hoạt động. thanx
Manny265

2
Không hoạt động với tôi trong Android 4.4.2. Nó hiển thị bàn phím nhưng không che giấu nó.
John J Smith

87

Khi không có gì khác hoạt động, buộc nó phải được hiển thị :

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

Và sau đó, nếu bạn muốn đóng nó, ví dụ như trong onPause (), bạn có thể gọi:

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

4
Bạn đã đúng, @Bolling! Khi không có gì khác làm việc, mã của bạn đã cứu tôi. Cảm ơn!
Willian Paixao

3
Mã của bạn là người duy nhất làm việc cho tôi và tôi đã thử mọi giải pháp trên trang này! Cảm ơn rất nhiều!
Mattia Ruggiero

4
đừng ép buộc trong một số trường hợp khi bạn chuyển từ nền trước sang nền, bàn phím sẽ vẫn ở đó vì bạn buộc nó. Đây là một vấn đề phân mảnh nhưng tôi đã thấy nó trên bộ đôi samsung.
j2emanue

Tôi thường luôn có mã để đóng bàn phím onPause () vì tôi đã thấy nó bị kẹt ngay cả khi bạn không buộc nó lên.
Bẻ khóa

Điều đó đã làm việc, nhưng khi chuyển sang các màn hình khác, nó vẫn mở
Sithu

75

Đoạn mã sau được lấy từ mã nguồn 4.1 của Google cho SearchView. Có vẻ như hoạt động, tốt trên các phiên bản Android ít hơn.

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

Ngoài ra, mã sau đây cần được thêm vào khi Điều khiển / Hoạt động được tạo. (Trong trường hợp của tôi, đó là một điều khiển tổng hợp, thay vì một hoạt động).

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});

Cảm ơn! Nó hoạt động tốt đáng kinh ngạc. Và đó là giải pháp tôi thấy thoải mái hơn với tất cả các câu trả lời và chủ đề tôi đã đọc về vấn đề này.
Rùa

37
: -D setImeVisibility(hasFocus)?
Matthias

Tôi đã thử phương pháp này vì tôi thực sự "lăn theo quan điểm tìm kiếm của riêng mình" (không muốn phải làm điều đó nhưng có lý do). Điều này làm việc cho tôi ngoại trừ lúc ra mắt hoạt động. Tôi đã thêm android: windowSoftInputMode = "alwaysVisible" vào hoạt động và đã có requestF Focus () được gọi trên văn bản chỉnh sửa. Hoạt động như một nhà vô địch.
javahead76

Bất kỳ ý tưởng về sự cần thiết của removeCallbacks (mShowImeRunnable)? Tôi nghĩ rằng một khi runnable được chọn để chạy từ hàng đợi, nó sẽ bị xóa khỏi hàng đợi cùng một lúc?
Cheok Yan Cheng

1
Sau khi thử một vài biến thể, đây là biến thể duy nhất hoạt động ổn định với tôi (Android 4.42). Thx
John J Smith

34

android:windowSoftInputMode="stateAlwaysVisible" -> trong Tệp kê khai.

edittext.requestFocus(); -> trong mã.

Điều này sẽ mở bàn phím mềm trên đó văn bản chỉnh sửa có yêu cầu tập trung khi hoạt động xuất hiện.


2
Điều này mở bàn phím lúc tạo Activity.
xpto

không trả lời câu hỏi, nhưng đã giúp tôi :)
S.Thiongane

mở khóa mà không yêu cầu tập trung trong api 22
David

Hoạt động tốt cho trường hợp của tôi. Tôi tự hỏi tại sao yêu cầu thuộc tính tập trung chỉ từ xml cũng cần được đề cập đến manifest!
sud007

30

Tôi đã có một số may mắn gần đây trong một số trường hợp đơn giản với mã dưới đây. Tôi chưa hoàn thành tất cả các thử nghiệm nhưng ....

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Và bàn phím hiện lên.


Đối với trường hợp của tôi, tôi đã có một nút để thêm một số thông tin tùy chọn. Trong nút.onClick xử lý mã trên đã được thêm vào để buộc bàn phím mềm xuất hiện cho đầu vào của thông tin tùy chọn. Droid 2.2.2
Dent

đây là một giải pháp tốt nhưng đừng quên rằng bạn nên tạo một đối tượng MotionEvent và gọi tái chế () trên chúng sau khi sử dụng, để người gọi sau sử dụng lại.
jimbob

Bạn chỉ cần một công vănTouchEvent () với ACTION_UP làm đối số của nó ..
Mohammed Junaid

15

Bạn có thể thử buộc bàn phím mềm xuất hiện, nó hoạt động với tôi:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

1
Điều này hoạt động với tôi ... Tôi đã thử những InputMethodManager im = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); im.showSoftInput (tên, inputMethodManager.SHOW_IMPLICIT); hoặc getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); nhưng không ai trong số họ làm việc
Günay Gültekin

10

Đôi khi câu trả lời của raukodraug sẽ không hoạt động. Tôi đã thực hiện theo cách này với một số thử nghiệm và lỗi:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

Và phần EditText :

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });

1
Đây là giải pháp duy nhất phù hợp với tôi trên Android 5
user1021430

10

Để ẩn bàn phím, sử dụng cái này:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

và để hiển thị bàn phím:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Đối với DialogFragment, bạn có thể gọi phần này trong phần ghi đè onStart()và bạn có thể sử dụng getDialog().getWindow()thay thế cho getActivity().getWindow().
Mr-IDE

10

Và đối với Kotlin chỉ cần sử dụng tiện ích mở rộng này:

fun EditText.showKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

Chỉ cần những gì tôi đang tìm kiếm.
lasec0203

8

Đối với đoạn, chắc chắn nó hoạt động:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

7

showSoftInput đã không làm việc cho tôi cả.

Tôi hình dung mình cần thiết lập chế độ nhập liệu: (ở đây trong thành phần Hoạt động trong tệp kê khai)

android:windowSoftInputMode="stateVisible" 

6

Tin hay không vấn đề của tôi với Bàn phím mềm đã được giải quyết khi tôi phát hiện ra rằng hoạt hình Hoạt động có thể vô hiệu hóa Bàn phím mềm. Khi bạn gọi ý định với

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

overridePendingTransition(0, 0);

Nó có thể ẩn Bàn phím mềm và không có cách nào để hiển thị.


6

Tôi có cùng một vấn đề trong nhiều tình huống khác nhau và các giải pháp tôi đã tìm thấy hoạt động ở một số nhưng không hoạt động ở những người khác vì vậy đây là một giải pháp kết hợp hoạt động trong hầu hết các tình huống tôi đã tìm thấy:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}

6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});

6

Tôi đã kết hợp mọi thứ ở đây và đối với tôi nó hoạt động:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

6

Nó làm việc cho tôi. Bạn cũng có thể thử với điều này để hiển thị bàn phím:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

5

đoạn mã. . .

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}

5

Kotlin phần mở rộng để hiển thị bàn phím tập trung.

Đây là sự kết hợp của các phản hồi trước đó, trong đó quá dài hoặc không đầy đủ.

Tiện ích mở rộng này có thể chạy được trên hàng đợi tin nhắn hiển thị bàn phím mềm sau khi yêu cầu tiêu điểm:

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

Gọi nó từ bất kỳ chế độ xem nào khi cần sau đó:

editText.showSoftKeyboard()

4

chỉ cần thêm android: windowSoftInputMode = "stateHidden" trong tệp kê khai ...


4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

4

Bên trong bảng kê khai của bạn:

android:windowSoftInputMode="stateAlwaysVisible"- ban đầu ra mắt bàn phím. android:windowSoftInputMode="stateAlwaysHidden" - Bàn phím ẩn ban đầu.

Tôi cũng thích sử dụng "adjustPan"vì khi bàn phím khởi chạy thì màn hình sẽ tự động điều chỉnh.

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>

4

Chỉ cần thêm dòng này trong chế độ xem Chỉnh sửa của bạn:

android:isScrollContainer="true"

và TADA - bàn phím bắt đầu hiển thị tự động!

Tôi đã có vấn đề tương tự và phát hiện ra giải pháp đơn giản và kỳ lạ này.

Như đã được đề cập ở đây bởi user3392439, sự xuất hiện của bàn phím khi tập trung bằng cách nào đó được kết nối chặt chẽ hơn với sự dự đoán của thành phần cuộn trong tệp XML.

Ngay cả sự hiện diện của một khung nhìn EditText khác bao gồm dòng đã nói ở trên trong cùng một XML làm cho bàn phím xuất hiện bất kể một trong những EditTexts nào hiện đang được chú trọng.

Nếu bạn có ít nhất một chế độ xem hiển thị bao gồm thành phần cuộn trong tệp XML của mình - bàn phím sẽ tự động xuất hiện trên tiêu điểm.

Nếu không có cuộn - thì bạn cần nhấp vào EditText để xuất hiện bàn phím.


Điều này rất lạ nhưng nó chắc chắn hoạt động - Tôi đã cố gắng requesFocus()từ bên trong một trình xử lý nhấp chuột và đây là cách duy nhất ngoài một chương trình rõ ràng ShowSoftInput SHOW_FORCED
đã thu hút

Thánh sh * t, cảm ơn người đàn ông. Không biết tại sao nó hoạt động nhưng tôi đã thử nghiệm nó trên 8 thiết bị từ các nhà sản xuất khác nhau và nó hoạt động mọi lúc!
Antonio Vlasic

3

Tất cả các giải pháp được đưa ra ở trên ( Tương tác InputMethodManager trong trình nghe OnF FocusChangeListener.onF FocusChange được đính kèm với EditText của bạn hoạt động tốt nếu bạn có một chỉnh sửa duy nhất trong hoạt động.

Trong trường hợp của tôi, tôi có hai chỉnh sửa.

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

Tôi đã quan sát thấy rằng onF FocusChange được kích hoạt cho tvX với hasF Focus = true (bàn phím được hiển thị) nhưng sau đó cho tvY với hasF Focus = true (ẩn bàn phím). Cuối cùng, không có bàn phím nào được nhìn thấy.

Giải pháp chung nên có câu lệnh đúng trong "hiển thị bàn phím nếu văn bản EditText có tiêu điểm"


3

Trong phần onResume () của Hoạt động, bạn có thể gọi phương thức bringPal ();

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }

Là gì WidgetUtils.showKeyboard? Đó là bit quan trọng nhất ở đây.
TWiStErRob

2

Không có câu trả lời nào làm việc cho tôi. Đây là một cách đơn giản.

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

Chỉ cần trì hoãn phương thức requestF Focus () trong 400ms.


Rất cám ơn, nó cần một số độ trễ cho bàn phím hiển thị ...
hkh114

1

Tôi đã phát hiện ra một hành vi kỳ lạ, vì trong một trong các ứng dụng của tôi, bàn phím mềm đã tự động hiển thị khi vào hoạt động (có một chỉnh sửa.requestF Focus () trong onCreate).

Khi đào sâu hơn, tôi phát hiện ra rằng điều này là do có một ScrollView xung quanh bố cục. Nếu tôi xóa ScrollView, hành vi như được mô tả trong tuyên bố vấn đề ban đầu: chỉ khi nhấp vào chỉnh sửa đã tập trung thì bàn phím mềm mới hiển thị.

Nếu nó không phù hợp với bạn, hãy thử đặt ScrollView - dù sao nó cũng vô hại.


1

Tôi đã có một vấn đề tương tự bằng cách sử dụng xem hình ảnh động . Vì vậy, tôi đã đặt một trình nghe hoạt hình để đảm bảo rằng tôi sẽ đợi hoạt hình kết thúc trước khi thử yêu cầu quyền truy cập bàn phím trên edittext được hiển thị.

    bottomUp.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (textToFocus != null) {
                // Position cursor at the end of the text
                textToFocus.setSelection(textToFocus.getText().length());
                // Show keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });

1

Tôi đồng ý với raukodraug khi sử dụng trong swithview, bạn phải yêu cầu / tập trung rõ ràng như thế này:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

Trân trọng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.