Trường văn bản Android: đặt tiêu điểm + đầu vào mềm theo lập trình


80

Theo quan điểm của tôi, tôi có một EditText tìm kiếm và tôi muốn kích hoạt theo chương trình hành vi của một sự kiện nhấp chuột trên trường, tức là đưa tiêu điểm vào trường văn bản VÀ hiển thị bàn phím mềm nếu cần (nếu không có bàn phím cứng).

Tôi đã thử field.requestFocus(). Trường thực sự được lấy nét nhưng bàn phím mềm không được hiển thị.

Tôi đã thử field.performClick(). Nhưng điều đó chỉ gọi OnClickListener của trường.

Bất kỳ ý tưởng ?

Câu trả lời:


148

Tốt thưa ông, hãy thử cái này:

edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

Tôi không chắc, nhưng điều này có thể được yêu cầu trên một số điện thoại (một số thiết bị cũ hơn):

final InputMethodManager inputMethodManager = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);

3
Kết quả tương tự như requestFocus () một mình ... Trường được lấy nét nhưng bàn phím mềm không được kích hoạt.
sdabet

12
Cuối cùng tôi đã giải quyết được ban hành bằng cách gọi field.requestFocus()trong onResume()phương thức hoạt động (thay vì onCreate()). Không biết chính xác lý do tại sao nó hoạt động ...
sdabet

31
Chế độ xem không thể lấy tiêu điểm trước khi nó thực sự được hiển thị trên màn hình. Điều này không thể được thực hiện trong khi onCreate () giữ chuỗi giao diện người dùng, do đó khung nhìn được bố trí trực tiếp sau onCreate () và trước onResume (). :)
pgsandstrom

@fiddler Nó hoạt động onResumeonResumeđược gọi sau onCreate, vì vậy fieldkhông tồn tại cho đến khi onCreateđược chạy. Xem tại đây: developer.android.com/reference/android/app/…
Randy

3
Đề xuất tuyệt vời, ol 'chap. Tôi tuyên bố; điều này rất xứng đáng được ủng hộ!
MW.

62

Đây là mã đã làm việc cho tôi.

edittext.post(new Runnable() {
    public void run() {
        edittext.requestFocusFromTouch();
        InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        lManager.showSoftInput(edittext, 0);
    }
});

Đó là nó! Thưởng thức ;)


1
Cảm ơn và điều này đã làm việc cho tôi. Tôi thêm theo EditTextchương trình khi người dùng nhấn nút.
câm

Tôi đã thêm một EditTexttừ một phương thức hộp thoại. Một số cờ đang được thiết lập bởi Android khiến điều khiển này không nhận được bất kỳ lần chạm nào. Nếu bạn thêm trường vào có thể chạy, các cờ sẽ không được đặt.
JeffRegan

Có vẻ như cái InputTypetrong số EditTextnày đang được Android đặt thành null. Nếu bạn đặt InputType, nó sẽ hoạt động.
JeffRegan

Giải pháp làm việc duy nhất cho tôi (nếu tôi sử dụng InputMethodManager để hiển thị bàn phím bị bắt buộc, thì tôi không thể ẩn nó)
Pavel

Không có phương pháp nào khác hiệu quả với tôi, nhưng phương pháp này đã làm được. Tôi muốn có một hộp cho người dùng nhấp vào để mở chế độ xem hội thoại chỉnh sửa thay vì có một dòng chỉnh sửa để nhấp vào để có chế độ xem EditText. Trên điện thoại, dòng chỉnh sửa mất hầu hết chức năng vì chế độ xem hội thoại chỉnh sửa bao phủ toàn bộ màn hình, vì vậy người dùng không thể nhìn thấy dòng chỉnh sửa, bao gồm cả các chữ cái trong đó khi họ đang nhập.
Androidcoder

6

Đoạn mã sau phù hợp với tôi , sau khi hai câu trả lời khác không hoạt động với tôi :

@Override
public void onResume() {
    super.onResume();
    SingletonBus.INSTANCE.getBus().register(this);
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen
}

Trong trường hợp ShowKeyboard

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
  //      passwordInput.requestFocusFromTouch();
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

Sau khi nhập thành công, tôi cũng đảm bảo rằng tôi ẩn bàn phím

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

Về mặt kỹ thuật, tôi chỉ thêm 300 ms trễ trước khi chạy yêu cầu hiển thị bàn phím mềm. Kỳ lạ, phải không? Cũng được đổi requestFocus()thành requestFocusFromTouch().

CHỈNH SỬA: Không sử dụng requestFocusFromTouch()nó cung cấp một sự kiện cảm ứng cho trình khởi chạy. Gắn bó với requestFocus().

EDIT2: Trong Hộp thoại ( DialogFragment), sử dụng như sau

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

thay vì

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

requestFocusFromTouch()dường như kích hoạt một sự kiện cảm ứng trên trình khởi chạy. Thật là kỳ lạ.
EpicPandaForce

0
        field.post(new Runnable() {
            @Override
            public void run() {
                field.requestFocus();
                field.onKeyUp(KeyEvent.KEYCODE_DPAD_CENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER));
            }
        });

0

Trong trường hợp của tôi, tôi muốn hiển thị bàn phím ảo không có tham chiếu đến hộp văn bản cụ thể, vì vậy tôi đã sử dụng phần đầu tiên của câu trả lời được chấp nhận để lấy tiêu điểm :

edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

Sau đó, tôi hiển thị bàn phím ảo :

InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
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.