Làm cách nào tôi có thể đặt tiêu điểm (và hiển thị bàn phím) trên EditText của mình theo chương trình


180

Tôi có một bố cục chứa một số khung nhìn như thế này:

<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>

Làm cách nào để đặt tiêu điểm (hiển thị bàn phím) trên EditTextchương trình của tôi ?

Tôi đã thử điều này và nó chỉ hoạt động khi tôi khởi chạy Activitybình thường, nhưng khi tôi khởi chạy nó trong một TabHost, nó không hoạt động.

txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();


Câu trả lời:


352

Thử cái này:

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

http://developer.android.com/reference/android/view/View.html#requestF Focus ()


Được cập nhật với mã để buộc bàn phím hiển thị từ câu trả lời này: stackoverflow.com/questions/5105354/
David Merriman

5
nó chỉ hoạt động khi tôi khởi chạy hoạt động bình thường, nhưng khi tôi khởi chạy hoạt động của mình trên Tabhost, nó không hoạt động,
Houcine

27
Điều này không hoạt động. Cái này hoạt động với tôi InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); im.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
Günay Gültekin

5
"Điều này không làm việc anh em". Trong một số trường hợp, bạn cần gọi mã này không đồng bộ từ postDelayed (). Tôi gặp trường hợp phải mở bàn phím sau khi người dùng nhấn "OK" trên hộp thoại. Và khi hộp thoại đang đóng, nó bị rối với tiêu điểm. Vì vậy, tôi đã gọi mã ở trên từ postDelayed (). Nó thực hiện sau khi hộp thoại đã đóng. Lợi nhuận.
Danylo Volokh

2
Có tới 237 phiếu bầu cho câu trả lời và 62 cho "nó không hoạt động anh em" Tôi đã thử nó để có ý kiến ​​riêng và nó hoạt động hoàn hảo!)
Daniel

165

sử dụng:

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

20
Sau khi thử hơn 5 cách tiếp cận khác, đây là cách duy nhất phù hợp với tôi (từ một Viewlớp con)
William

13
Gợi ý này dẫn đến bàn phím bị cố định, ngay cả khi trường mất tiêu điểm.
cho đến

2
vâng, nó cũng hoạt động với tôi, và imm.showSoftInput()không hoạt động.
Spark.Bao

8
Mặc dù phương pháp này không hoạt động, nhưng nó có một nhược điểm, việc thoát ứng dụng bằng nút home (phần cứng) sẽ cho phép bàn phím trên màn hình. Bạn sẽ phải nhấn nút quay lại (phần cứng) để ẩn bàn phím coi thường nó là vô dụng trên màn hình chính của bạn.
Adrien Horgnies 7/07/2016

Các cách tiếp cận khác không hiệu quả với tôi, cách này đã làm. cảm ơn bạn.
Iman Akbari

53

Điều này làm việc cho tôi, Nhờ ungalcrys

Hiển thị bàn phím:

editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);

Ẩn bàn phím:

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

2
Giải pháp đầy đủ duy nhất. Cảm ơn.
korro

41

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: android:windowSoftInputMode="stateVisible"(ở đây trong thành phần Hoạt động trong tệp kê khai)

Hy vọng điều này giúp đỡ!


5
Điều này chỉ hiển thị bàn phím khi hoạt động được bắt đầu.
William

1
Tuyệt vời :) Đã thử một loạt các câu trả lời nhưng chỉ với điều này, tôi có thể làm cho nó hoạt động :) Cảm ơn bạn rất nhiều.
Srikanth

câu trả lời rất bị đánh giá thấp
Avinash R

Câu trả lời hoàn hảo. Chỉ hoạt động với "editText.requestF Focus ()". Cảm ơn.
AVJ

37
final EditText tb = new EditText(this);
tb.requestFocus();
tb.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT);
    }
}, 1000);

1
Tôi đã phải làm điều này để làm cho nó hiển thị trong onResume (). Nếu không có độ trễ, sẽ không có gì xảy ra khi sử dụng mọi giải pháp duy nhất được mô tả trong chuỗi này.
FranticRock

1
Nó đây rồi Đó là câu trả lời tôi đang tìm kiếm. Mặc dù vậy, bạn không cần phải trì hoãn toàn bộ giây. Tôi đã thử chỉ 150 millis, và nó cũng hoạt động tốt.
Rubberduck

1
Cảm ơn! Điều này hoạt động ngay cả trong 0 ms ( tb.post({ showKeyboard(tb) })). Lưu ý rằng chúng ta cần một khung nhìn EditText ( tb), không phải là một khung nhìn phân đoạn.
CoolMind

16

Đây là cách mở rộng kotlin để hiển thị và ẩn bàn phím mềm có thể được thực hiện:

fun View.showKeyboard() {
  this.requestFocus()
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun View.hideKeyboard() {
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

Sau đó, bạn có thể làm điều này:

editText.showKeyboard()
// OR
editText.hideKeyboard()

đây là một giải pháp tốt hơn so với nghỉ ngơi
d-feverx

5

Tôi khuyên bạn nên sử dụng LifecyclObserver , một phần của Vòng đời xử lý với các thành phần nhận biết vòng đời của Android Jetpack .

Tôi muốn mở và đóng Bàn phím khi Mảnh / Hoạt động xuất hiện. Đầu tiên, xác định hai chức năng mở rộng cho EditText. Bạn có thể đặt chúng ở bất cứ đâu trong dự án của bạn:

fun EditText.showKeyboard() {
    requestFocus()
    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)
}

Sau đó, xác định LifecyclObserver mở và đóng bàn phím khi Activity / Fragment đạt onResume()hoặc onPause:

class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) :
    LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun openKeyboard() {
        editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun closeKeyboard() {
        editText.get()?.hideKeyboard()
    }
}

Sau đó thêm dòng sau vào bất kỳ Phân đoạn / Hoạt động nào của bạn, bạn có thể sử dụng lại LifecyclObserver bất cứ lúc nào. Ví dụ cho một mảnh:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    // inflate the Fragment layout

    lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText)))

    // do other stuff and return the view

}

4

Dưới đây là ClassHelper Class để ẩn và hiển thị bàn phím

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * Created by khanhamza on 06-Mar-17.
 */

public class KeyboardHelper {
public static void hideSoftKeyboard(final Context context, final View view) {
    if (context == null) {
        return;
    }
    view.requestFocus();
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}, 1000);
}

public static void hideSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}, 1000);
}


public static void openSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}, 1000);
}
}

0

Cách thứ nhất :

    etPassword.post(() -> {
        etPassword.requestFocus();
        InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);
    });

Cách thứ hai :

Trong bản kê khai:

    <activity
        android:name=".activities.LoginActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateVisible"/>

Trong mã:

etPassword.requestFocus();

0

Tôi đã thử rất nhiều cách và nó không hoạt động, không chắc là vì tôi đang sử dụng chuyển đổi được chia sẻ từ đoạn sang hoạt động có chứa văn bản chỉnh sửa.

Btw edittext của tôi cũng được gói trong linearLayout.

Tôi đã thêm một chút chậm trễ để yêu cầu tập trung và mã bên dưới hoạt động với tôi: (Kotlin)

 et_search.postDelayed({
     editText.requestFocus()

     showKeyboard()
 },400) //only 400 is working fine, even 300 / 350, the cursor is not showing

showPal ()

 val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)

0
editTxt.setOnFocusChangeListener { v, hasFocus ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (hasFocus) {
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            } else {
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }

-1

Tôi không thể có bất kỳ câu trả lời nào trong số này để tự làm việc. Giải pháp cho tôi là kết hợp chúng:

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

Tôi không chắc tại sao điều đó là bắt buộc đối với tôi - theo các tài liệu có vẻ như một trong hai phương pháp nên tự hoạt động.


Đây chắc chắn không phải là một thực hành tốt. Có lẽ, giao dịch Activity hoặc Fragment đã can thiệp bằng bàn phím mềm hoặc các cờ Phương thức nhập không được đặt chính xác nhưng dù sao đi nữa, giải pháp này không nên được sử dụng.
Marcel Bro
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.