Đóng / ẩn bàn phím mềm Android


3819

Tôi có một EditTextvà một Buttontrong bố trí của tôi.

Sau khi viết vào trường chỉnh sửa và nhấp vào Button, tôi muốn ẩn bàn phím ảo. Tôi giả sử rằng đây là một đoạn mã đơn giản, nhưng tôi có thể tìm thấy một ví dụ về nó ở đâu?

Khi chạm bên ngoài bàn phím.


13
Điều gì nếu bạn chỉ có một EditText và một số nút, như hộp kiểm và radio? Nơi duy nhất bạn cần bàn phím là trong EditText duy nhất. Làm thế nào để bạn đăng ký để biết rằng một cái gì đó khác đã được chọn / nhấp để ẩn bàn phím?
AlikElzin-kilaka

14
tôi cảm thấy ngu ngốc. Tôi không thể ẩn bàn phím trên ICS. Đã thử tất cả các phương pháp ở đây và kết hợp chúng. Không đời nào. Phương pháp để hiển thị nó hoạt động, nhưng tôi không thể che giấu nó bất kể mã thông báo gió, ẩn cờ, cài đặt bảng kê khai hoặc nến cho bất kỳ vị thánh nào. Trên chương trình bàn phím, tôi luôn thấy điều này: I / LatinIME (396): InputType.TYPE_NULL được chỉ định W / LatinIME (396): Lớp đầu vào không mong đợi: inputType = 0x00000000 imeOptions = 0x00000000
rupps

4
/ ** * Phương pháp này được sử dụng để ẩn bàn phím mềm. * Hoạt động @param * / công khai void hideSoftPal (Hoạt động hoạt động) {InputMethodManager inputMethodManager = (InputMethodManager) Activity.getSystemService (Activity.INPUT_METHOD_SERVICE); inputMethodManager. SuedeSoftInputFromWindow (Activity.getCienF Focus (). getWindowToken (), 0); }
Harshal Benake

cái này hiệu quả với tôi
nmxprime

Với các thiết bị tăng kích thước và độ phân giải màn hình, việc ẩn bàn phím ảo đang trở nên ít quan trọng hơn.
Al-Kathiri Khalid

Câu trả lời:


2038

Để giúp làm rõ sự điên rồ này, tôi muốn bắt đầu bằng cách xin lỗi thay mặt cho tất cả người dùng Android vì cách đối xử hết sức lố bịch của bàn phím mềm. Lý do có rất nhiều câu trả lời, mỗi câu trả lời khác nhau, cho cùng một câu hỏi đơn giản là vì API này, giống như nhiều người khác trong Android, được thiết kế khủng khiếp. Tôi có thể nghĩ không có cách nào lịch sự để nói nó.

Tôi muốn giấu bàn phím. Tôi hy vọng sẽ cung cấp cho Android tuyên bố sau : Keyboard.hide(). Kết thúc. Cảm ơn rât nhiều. Nhưng Android có một vấn đề. Bạn phải sử dụng InputMethodManagerđể ẩn bàn phím. OK, tốt, đây là API của Android cho bàn phím. NHƯNG! Bạn được yêu cầu phải có Contextquyền truy cập vào IMM. Bây giờ chúng tôi có một vấn đề. Tôi có thể muốn ẩn bàn phím khỏi một lớp tĩnh hoặc tiện ích không sử dụng hoặc không cần sử dụng Context. hoặc Và FAR tệ hơn, IMM yêu cầu bạn chỉ định những gì View(hoặc thậm chí tệ hơn, những gì Window) bạn muốn ẩn bàn phím TỪ.

Đây là những gì làm cho việc ẩn bàn phím rất khó khăn. Google thân mến: Khi tôi đang tìm công thức làm bánh, không có nơi nào RecipeProvidertrên trái đất có thể từ chối cung cấp cho tôi công thức đó trừ khi tôi trả lời đầu tiên WHO sẽ ăn bánh VÀ nơi nó sẽ được ăn !!

Câu chuyện buồn này kết thúc với một sự thật xấu xí: để ẩn bàn phím Android, bạn sẽ được yêu cầu cung cấp 2 hình thức nhận dạng: a Contextvà a Viewhoặc a Window.

Tôi đã tạo ra một phương thức tiện ích tĩnh có thể thực hiện công việc RẤT vững chắc, miễn là bạn gọi nó từ một Activity.

public static void hideKeyboard(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    //Find the currently focused view, so we can grab the correct window token from it.
    View view = activity.getCurrentFocus();
    //If no view currently has focus, create a new one, just so we can grab a window token from it
    if (view == null) {
        view = new View(activity);
    }
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Xin lưu ý rằng phương thức tiện ích này CHỈ hoạt động khi được gọi từ một Activity! Các cuộc gọi phương thức trên getCurrentFocuscủa mục tiêu Activityđể lấy mã thông báo cửa sổ thích hợp.

Nhưng giả sử bạn muốn ẩn bàn phím khỏi máy EditTextchủ lưu trữ trong DialogFragment? Bạn không thể sử dụng phương pháp trên cho điều đó:

hideKeyboard(getActivity()); //won't work

Điều này sẽ không hoạt động vì bạn sẽ chuyển tham chiếu đến Fragmentmáy chủ lưu trữ Activity, điều này sẽ không có quyền kiểm soát tập trung trong khi Fragmenthiển thị! Ồ Vì vậy, để ẩn bàn phím khỏi các mảnh vỡ, tôi dùng đến cấp độ thấp hơn, phổ biến hơn và xấu hơn:

public static void hideKeyboardFrom(Context context, View view) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Dưới đây là một số thông tin bổ sung lượm lặt được từ việc lãng phí nhiều thời gian hơn để theo đuổi giải pháp này:

Giới thiệu về windowSoftInputMode

Vẫn còn một điểm tranh cãi nữa cần phải biết. Theo mặc định, Android sẽ tự động gán tiêu điểm ban đầu cho EditTextđiều khiển đầu tiên hoặc có thể lấy nét trong của bạn Activity. Theo tự nhiên, InputMethod (thường là bàn phím mềm) sẽ phản hồi lại sự kiện lấy nét bằng cách hiển thị chính nó. Các windowSoftInputModethuộc tính trong AndroidManifest.xmlkhi thiết lập để stateAlwaysHidden, chỉ thị bàn phím để bỏ qua trọng tâm ban đầu tự giao này.

<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="stateAlwaysHidden"/>

Hầu như không thể tin được, nó dường như không làm gì để ngăn bàn phím mở khi bạn chạm vào điều khiển (trừ khi focusable="false"và / hoặc focusableInTouchMode="false"được gán cho điều khiển). Rõ ràng, cài đặt windowSoftInputMode chỉ áp dụng cho các sự kiện lấy nét tự động, không áp dụng cho các sự kiện lấy nét được kích hoạt bởi các sự kiện chạm.

Do đó, stateAlwaysHiddenRẤT kém tên thực sự. Nó có lẽ nên được gọi ignoreInitialFocusthay thế.

Hi vọng điêu nay co ich.


CẬP NHẬT: Nhiều cách khác để nhận mã thông báo cửa sổ

Nếu không có chế độ xem tập trung (ví dụ: có thể xảy ra nếu bạn chỉ thay đổi các đoạn), có các chế độ xem khác sẽ cung cấp mã thông báo cửa sổ hữu ích.

Đây là những lựa chọn thay thế cho đoạn mã trên if (view == null) view = new View(activity); Những điều này không đề cập rõ ràng đến hoạt động của bạn.

Bên trong một lớp phân mảnh:

view = getView().getRootView().getWindowToken();

Cho một đoạn fragmentnhư một tham số:

view = fragment.getView().getRootView().getWindowToken();

Bắt đầu từ nội dung của bạn:

view = findViewById(android.R.id.content).getRootView().getWindowToken();

CẬP NHẬT 2: Xóa tiêu điểm để tránh hiển thị lại bàn phím nếu bạn mở ứng dụng từ nền

Thêm dòng này vào cuối phương thức:

view.clearFocus();


2
Viết rất hay. Tuy nhiên, có một điều, nếu bạn bắt đầu một hoạt động khác trên đầu trang, đó là kích hoạt bàn phím, bàn phím sẽ vẫn có mặt khi bạn quay lại. Đã sửa lỗi đó bằng cách xóa bàn phím bằng phương pháp của bạn khi thoát khỏi hoạt động hàng đầu.
Oyvind

3
@rmirabelle FragmentCó vẻ như bạn có thể sử dụnggetActivity().getWindow().getDecorView()
McX

1
Bài này rất hay nhưng bạn thiếu hai phần rất quan trọng. Những thay đổi tinh tế được thực hiện trên mỗi phiên bản và được thực hiện trên mỗi sản xuất. Ví dụ: trên Samsung galaxy s6, chúng ta cần sử dụng .clearF Focus () trước khi ẩn bàn phím ... nếu không bàn phím sẽ vẫn bật lên khi nhấp vào lần thứ hai của edittext: S
Warpzit

17
google chỉ nên thực sự cung cấp Keyboard.hide();tiện ích đó
HendraWD

1
[someView] .getContext () << Có thể là trường hợp hoạt động. Nó luôn là cùng một đối tượng. (Ngoại trừ các dịch vụ bên trong ...)
Oliver Dixon

4419

Bạn có thể buộc Android ẩn bàn phím ảo bằng InputMethodManager , gọi điện hideSoftInputFromWindow, chuyển mã thông báo của cửa sổ chứa chế độ xem tập trung của bạn.

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Điều này sẽ buộc bàn phím bị ẩn trong mọi tình huống. Trong một số trường hợp, bạn sẽ muốn chuyển vào InputMethodManager.HIDE_IMPLICIT_ONLYlàm tham số thứ hai để đảm bảo bạn chỉ ẩn bàn phím khi người dùng không rõ ràng buộc nó xuất hiện (bằng cách nhấn giữ menu).

Lưu ý: Nếu bạn muốn làm điều này trong Kotlin, hãy sử dụng: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

Cú pháp của Kotlin

// Check if no view has focus:
 val view = this.currentFocus
 view?.let { v ->
  val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager 
  imm?.hideSoftInputFromWindow(v.windowToken, 0)
 }

14
Cảm ơn điều này dường như hoạt động tuyệt vời nếu sử dụng 0 làm tham số thứ hai. Nhưng nếu tôi sử dụng InputMethodManager.HIDE_IMPLICIT_ONLY thì bàn phím không bao giờ bị ẩn (mặc dù tôi không giữ menu). Có gợi ý nào không?
RoflcoptrException

27
Mát mẻ. Chỉ cần làm rõ, điều này chỉ loại bỏ nó nếu có, nhưng sẽ không ngăn nó bật lên, phải không?
Cheezmeister

15
Có thể hữu ích khi gọi editText.clearF Focus () trước khi ẩn softInput
user2224350

111
Gọi editText.clearFocus()sau đó InputMethodManager.HIDE_IMPLICIT_ONLYthậm chí hoạt động trên4.1
sprocket12

11
Điều làm việc cho tôi trên 4.4 / htc là thực thi View focused = getCurrentFocus()để có được cái chắc chắn là chế độ xem hiện tại, đang gọi focused.clearFocus(), và sau đó inputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)(với các cờ rõ ràng).
Ionoclast Brigham

806

Cũng hữu ích để ẩn bàn phím mềm là:

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

Điều này có thể được sử dụng để triệt tiêu bàn phím mềm cho đến khi người dùng thực sự chạm vào Chế độ xem Chỉnh sửa.


116
Bạn cũng có thể đạt được hiệu quả tương tự bằng cách thêm android: windowSoftInputMode = "stateHidden" vào hoạt động của bạn trong tệp kê khai.
BoD

7
Đã thử điều này trong một đoạn (tham chiếu hoạt động sở hữu) trên API cấp 9 và nó không hoạt động một cách đáng tiếc. Đã thử gọi nó trong onResume và onActivityCreated - không có hiệu lực.
Đặc vụKnopf

2
Tôi đang làm việc trong một hộp thoại và điều này đã làm việc. Tôi đang sử dụng Android 3.2. Tôi đặt nó trong phương thức onCreateDialog (Bundle). Nó không hoạt động trong phương thức onCreate. Hộp thoại hộp thoại = super.onCreateDialog (yetInstanceState); hộp thoại.getWindow (). setSoftInputMode (WindowManager.LayoutParams. SOFT_INPUT_STATE_ALWAYS_HIDDEN); Kết quả là chế độ xem của tôi với EditTexts trong đó hiển thị mà không cần bàn phím. Khi người dùng chạm vào một văn bản chỉnh sửa, bàn phím sẽ hiển thị.
flobacca

4
Điều này không hoạt động khi tiêu điểm vẫn nằm trong EditText (như, sau khi chạm vào nút). Sử dụng giải pháp của Reto cho điều đó.
Noumenon

4
Tại sao ghi đè cài đặt bảng kê khai là một ý tưởng tồi? Tôi gọi nó từ một mảnh. Không có cài đặt rõ ràng nào áp dụng cho một đoạn ...
Greg Enni

349

Tôi có thêm một giải pháp để ẩn bàn phím:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

Ở đây vượt qua HIDE_IMPLICIT_ONLYtại vị trí showFlag0tại vị trí của hiddenFlag. Nó sẽ mạnh mẽ đóng bàn phím mềm.


4
Bạn đang sử dụng cờ ẩn trong tham số showflags. Điều này chỉ hoạt động vì các hằng số sử dụng cùng một số nguyên. Ví dụ sử dụng các cờ chính xác
Alex

Đã thử nghiệm trên Android 4.0, tôi thích giải pháp này, vì tôi có nhiều văn bản chỉnh sửa, các nút trên hoạt động đó, có thể tập trung

32
@Mark: Bởi vì phương thức này được gọi là "toggleSoftInput", chứ không phải "hideSoftInput" :)
Sver

19
Giải pháp này hiển thị bàn phím nếu nó bị ẩn. Điều đó không đúng
Michael Katkov

1
@AkashAggarwal - Nó "hoạt động" nếu bạn bỏ qua thực tế rằng nó chỉ hoạt động cho bạn vì bàn phím đang hiển thị. (Nó hiển thị mức độ hiển thị của bàn phím: nó ẩn khi hiển thị, NHƯNG nó hiển thị khi bị ẩn !!) Bạn có thể ĐẢM BẢO rằng trong mọi trường hợp, trên tất cả các thiết bị, cho tất cả các phiên bản Android trong tương lai, bàn phím sẽ KHÔNG hiển thị tại thời điểm bạn gọi này? Nếu vậy, hãy tiếp tục và sử dụng nó!
ToolmakerSteve

149

Giải pháp của Meier cũng hiệu quả với tôi. Trong trường hợp của tôi, cấp cao nhất của Ứng dụng của tôi là tabhost và tôi muốn ẩn từ khóa khi chuyển đổi tab - Tôi nhận được mã thông báo cửa sổ từ Chế độ xem tabhost.

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
    }
}

Tôi cũng có cái này để làm việc với SearchView. Xem dưới đây cho câu trả lời của tôi. Cảm ơn mckoss!
Azurespot

139

Vui lòng thử mã dưới đây trong onCreate()

EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);

2
Phương pháp này hoạt động như một phương tiện để khắc phục lỗi "không thể ẩn bàn phím mềm" trong 2.0 và 2.1 như được mô tả trong code.google.com/p/android/issues/detail?id=7115 ... phương thức hideSoftInputFromWindow được liệt kê ở trên không hoạt động khi tôi đã thử nó, nhưng editView.setInputType (0) đã làm.
Spike Williams

18
Điều này là hợp pháp theo Javadoc (không phải là hack) mặc dù tôi sẽ viết lại phương thức này nhưeditView.setInputType(InputType.TYPE_NULL);
Bostone

3
Điều này hoạt động, tuy nhiên, nó ẩn Android: gợi ý. Tôi đang sử dụng Android 1.5
Tirtha

này là rất tốt cho khi bạn cần để đóng bàn phím từ một hộp thoại, không cần phải có được một thể hiện bất cứ điều gì hay và có thể gán này cho tất cả chỉnh sửa văn bản khi người dùng nhấn một nút để đóng hộp thoại
I'm_With_Stupid

Nó hoạt động, nhưng nó cũng ẩn con trỏ. Tôi cần con trỏ, nhưng không có bàn phím hệ thống.
Stefan Brendle

129

Cập nhật: Tôi không biết tại sao giải pháp này không còn hoạt động nữa (Tôi mới thử nghiệm trên Android 23). Vui lòng sử dụng giải pháp của Saurabh Pareek thay thế. Đây là:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

Câu trả lời cũ:

//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

8
Tôi nên đặt mã này ở đâu? Tôi đã cố gắng dán getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); trong onCreate () nhưng bàn phím không bao giờ giấu
user2236096

không hoạt động, đã được thử nghiệm trong radiogroup.setOnCheckedChangeListener, API 23
Christian Schäfer

Nếu bạn nhìn kỹ hơn, InputMethodManager.HIDE_IMPLICIT_ONLY và InputMethodManager.SHOW_IMPLICIT có cùng một giá trị, đó là "1", do đó không có sự khác biệt giữa các cuộc gọi này. => không hoạt động
Palejandro

nếu gọi im.toggleSoftInput (InputMethodManager.HIDE_IMPLICIT_ONLY, 0); sau đó bàn phím sẽ hiển thị trên màn hình :) Triển khai tốt nhất là: github.com/ravindu1024/android-keyboardlistener Xấu hổ trên SDK Android
Duna

I don't know why this solution is not work any more- bởi vì là Android , mọi thứ sẽ có thể thay đổi, có thể là một phần của thiết kế tồi ... Chúng tôi viết một cách bất cẩn, sau đó chúng tôi tấn công tất cả và viết lại mọi thứ.
Vua King

89
protected void hideSoftKeyboard(EditText input) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}

5
Điều này làm việc cho tôi! Nhưng tại sao bạn lại đặt input.setInputType (0) ? Tôi không thể tương tác với EditTextView khi tôi có dòng mã đó (Nó hoạt động khi tôi gỡ bỏ nó).
ymerdrengene

Có lẽ input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE).
CoolMind

Tôi đã xóa input.setInputType(0);khỏi mã này. Nó đã thay đổi một hành vi bàn phím và inputTypecho EditText.
CoolMind

74

Nếu tất cả các câu trả lời khác ở đây không phù hợp với bạn như bạn muốn, thì có một cách khác để điều khiển bàn phím theo cách thủ công.

Tạo một hàm với đó sẽ quản lý một số EditTextthuộc tính:

public void setEditTextFocus(boolean isFocused) {
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);

    if (isFocused) {
        searchEditText.requestFocus();
    }
}

Sau đó, đảm bảo rằng OnF Focus của EditTextbạn mở / đóng bàn phím:

searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (v == searchEditText) {
            if (hasFocus) {
                // Open keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
            } else {
                // Close keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
            }
        }
    }
});

Bây giờ, bất cứ khi nào bạn muốn mở bàn phím, hãy gọi thủ công:

setEditTextFocus(true);

Và để kết thúc cuộc gọi:

setEditTextFocus(false);

+1 - Nếu bạn muốn bắt đầu một hoạt động với bàn phím đóng, hãy sử dụng giải pháp này và thêm một onclicklistener, thiết lập setEditTextF Focus (true). Hoạt động như charme!
schlingel

Tôi đã nhận được 'Không thể giải quyết bối cảnh biểu tượng', trên dòng mã thứ 7 và 10 của khối mã thứ hai.
gimmegimme

Sử dụng getContext () thay vào đó
Rotemmiz

61

Saurabh Pareek có câu trả lời tốt nhất cho đến nay.

Cũng có thể sử dụng các cờ chính xác, mặc dù.

/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
    .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

Ví dụ về sử dụng thực tế

/* click button */
public void onClick(View view) {      
  /* hide keyboard */
  ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
      .toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

  /* start loader to check parameters ... */
}

/* loader finished */
public void onLoadFinished(Loader<Object> loader, Object data) {
    /* parameters not valid ... */

    /* show keyboard */
    ((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
        .toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);

    /* parameters valid ... */
}

1
Đây là hiệu quả nhất cho phiên bản mới nhất. Một người sẽ luôn cần phải điều chỉnh nó cho các phiên bản cũ hơn. Đặc biệt là trước v3.
Alex

2
@Mazen: sử dụngfragment.getActivity().getSystemService();
Johan S

Đây là câu trả lời toàn diện nhất, bao gồm cả hiển thị và ẩn.
André Staltz

4
Không. Trên Samsung Tab của tôi, Android 5.0, mã được gọi là "ẩn bàn phím" ở trên sẽ TẠO bàn phím mềm - nếu nó đã bị ẩn, nó sẽ hiển thị nó. Có một lý do chức năng này có TOGGLE trong tên.
ToolmakerSteve

57

từ việc tìm kiếm, ở đây tôi tìm thấy một câu trả lời phù hợp với tôi

// Show soft-keyboard:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

// Hide soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Người duy nhất làm việc cho tôi cho Motorola với Android 5.1
GMX

55

Câu trả lời ngắn

Trong bạn OnClicknghe gọi onEditorActioncủa EditTextvớiIME_ACTION_DONE

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
    }
});

Khoan sâu

Tôi cảm thấy phương pháp này tốt hơn, đơn giản hơn và phù hợp hơn với mẫu thiết kế của Android. Trong ví dụ đơn giản ở trên (và thường là trong hầu hết các trường hợp phổ biến), bạn sẽ có một tiêu điểm EditTextđã / đã tập trung và nó cũng thường là người gọi bàn phím ở nơi đầu tiên (nó chắc chắn có thể gọi nó trong nhiều trường hợp kịch bản phổ biến). Theo cách tương tự, sẽ là một trong những để phát hành bàn phím, thường có thể được thực hiện bởi một ImeAction. Chỉ cần xem làm thế nào EditTextvới một android:imeOptions="actionDone"hành vi, bạn muốn đạt được cùng một hành vi bằng cách tương tự.


Kiểm tra câu trả lời liên quan này


Đây là câu trả lời. Chỉ có phương pháp hoạt động phiên bản chéo. Tôi đã quay lại câu hỏi này để đăng câu trả lời này vì tôi không nghĩ có ai khác biết
Noah Passalacqua

Đây phải là câu trả lời chính xác. Thay vì lừa Android để ẩn bàn phím khi nó thực sự cần ở đó, chúng tôi nói với người dùng rằng đã xong, điều này sẽ kích hoạt cùng một ImeAction [tên ngu ngốc, tôi thừa nhận] như thể người dùng đã nhấp vào "DONE" trên bàn phím . Bằng cách này, sẽ không có gì khác biệt nếu người dùng xác nhận nhập liệu trên bàn phím hoặc nhấn nút UI.
Oliver Hausler

46

Điều này sẽ làm việc:

public class KeyBoard {

    public static void show(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
    }

    public static void hide(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
    }

    public static void toggle(Activity activity){
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        if (imm.isActive()){
            hide(activity); 
        } else {
            show(activity); 
        }
    }
}

KeyBoard.toggle(activity);

Đã hoạt động một phần, ngay cả khi bàn phím bị ẩn "isActive ()" trả về sai!
xpto

Tất nhiên rồi, nó phải thế. Hoặc có thể tôi không hiểu bạn. Dù sao, bạn có thể bổ sung cho lớp hide()show()các phương thức để có nhiều quyền kiểm soát hơn khi nào nó sẽ hiển thị và khi nào không. Làm việc cho tôi, tôi cũng đã làm như vậy :) Tôi sẽ chỉnh sửa ví dụ
slinden77

@YoushaAleayoub có. KeyBoard.toggle(fragment.getActivity())
slinden77

@ slinden77, lol, tôi đang nói về Câu trả lời của bạn ... không phải bài này bạn đã nhận xét. Vì vậy, câu trả lời vẫn KHÔNG làm việc.
Yousha Aleayoub 16/07/2016

@YoushaAleayoub uhm, đúng vậy. Câu hỏi ban đầu không đề cập đến các mảnh vỡ, bạn là người đã đề cập đến các mảnh vỡ. Vì vậy, câu trả lời của tôi là hoàn toàn hợp lệ. Để sử dụng nó với các đoạn, hãy gọi phương thức khác với a Fragment, như nhận xét. Tìm hiểu làm thế nào để sử dụng phương pháp xin vui lòng và sau đó quay trở lại. Bạn đang nhầm lẫn mọi người với câu trả lời ngớ ngẩn của bạn
slinden77 17/07/16

43

Tôi đang sử dụng bàn phím tùy chỉnh để nhập số Hex nên tôi không thể hiển thị bàn phím IMM ...

Trong v3.2.4_r1 setSoftInputShownOnFocus(boolean show)đã được thêm vào để kiểm soát thời tiết hoặc không hiển thị bàn phím khi TextView được lấy nét, nhưng nó vẫn bị ẩn nên phải sử dụng phản chiếu:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    try {
        Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
        method.invoke(mEditText, false);
    } catch (Exception e) {
        // Fallback to the second method
    }
}

Đối với các phiên bản cũ hơn, tôi đã nhận được kết quả rất tốt (nhưng không hoàn hảo) với một OnGlobalLayoutListener, được thêm vào với sự trợ giúp của a ViewTreeObservertừ chế độ xem gốc của tôi và sau đó kiểm tra xem bàn phím có được hiển thị như sau không:

@Override
public void onGlobalLayout() {
    Configuration config = getResources().getConfiguration();

    // Dont allow the default keyboard to show up
    if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0);
    }
}

Giải pháp cuối cùng này có thể hiển thị bàn phím trong tích tắc và rối với tay cầm lựa chọn.

Khi trong bàn phím vào toàn màn hình, onGlobalLayout không được gọi. Để tránh điều đó, hãy sử dụng TextView # setImeOptions (int) hoặc trong khai báo TextView XML:

android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"

Cập nhật: Chỉ tìm thấy những hộp thoại sử dụng để không bao giờ hiển thị bàn phím và hoạt động trong tất cả các phiên bản:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Cảm ơn bạn. Hai cờ FLAG_ALT_FOCUSABLE_IM và FLAG_ALT_FOCUSABLE_IM thực tế là điều duy nhất giúp ích trong trường hợp của tôi. Tôi không muốn một bàn phím được hiển thị trong hoạt động của mình - ngay cả khi người dùng nhấp vào một edittext. (Tôi đã tạo "bàn phím" của riêng mình).
Daniel Novak

Tuy nhiên, giải pháp tuyệt vời, nếu hoạt động phía trước của bạn không ở chế độ toàn màn hình, bàn phím sẽ hiển thị phía sau nó. Ngoài ra, hỗ trợ di chuyển con trỏ của bàn phím vẫn còn hiển thị. Và nó không thể lột da được.
chia đôi

Tôi thứ hai. Trong tất cả các cách có thể, chỉ có phương thức getWindow (). SetFlags () hoạt động, ít nhất là trên Android 5.1. Lưu ý rằng setSoftInputShownOnF Focus () hiện được đặtShowSoftInputOnF Focus () và không còn bị ẩn nhưng không hoạt động, ít nhất là không khi người dùng chạm vào trường.
olefevre

"Cập nhật" của bạn là giải pháp làm việc duy nhất cho tôi. Tôi đang tìm giải pháp ít nhất hai giờ :)
Stefan Brendle

33
public void setKeyboardVisibility(boolean show) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(show){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }else{
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
    }
}

30

Tôi đã dành hơn hai ngày để nghiên cứu tất cả các giải pháp được đăng trong chuỗi và nhận thấy chúng thiếu theo cách này hay cách khác. Yêu cầu chính xác của tôi là có một nút sẽ hiển thị độ tin cậy 100% hoặc ẩn bàn phím trên màn hình. Khi bàn phím ở trạng thái ẩn sẽ không xuất hiện lại, bất kể trường nhập nào người dùng nhấp vào. Khi ở trạng thái hiển thị, bàn phím sẽ không biến mất cho dù người dùng nhấp vào nút nào. Điều này cần phải hoạt động trên Android 2.2+ cho đến các thiết bị mới nhất.

Bạn có thể thấy một triển khai làm việc này trong RPN sạch ứng dụng của tôi .

Sau khi thử nghiệm nhiều câu trả lời được đề xuất trên một số điện thoại khác nhau (bao gồm cả thiết bị froyo và bánh gừng), rõ ràng là các ứng dụng Android có thể tin cậy:

  1. Tạm thời giấu bàn phím. Nó sẽ xuất hiện lại một lần nữa khi người dùng tập trung vào một trường văn bản mới.
  2. Hiển thị bàn phím khi một hoạt động bắt đầu và đặt cờ trên hoạt động cho biết bàn phím của chúng phải luôn hiển thị. Cờ này chỉ có thể được đặt khi một hoạt động đang bắt đầu.
  3. Đánh dấu một hoạt động để không bao giờ hiển thị hoặc cho phép sử dụng bàn phím. Cờ này chỉ có thể được đặt khi một hoạt động đang bắt đầu.

Đối với tôi, tạm thời giấu bàn phím là không đủ. Trên một số thiết bị, nó sẽ xuất hiện lại ngay sau khi một trường văn bản mới được tập trung. Vì ứng dụng của tôi sử dụng nhiều trường văn bản trên một trang, việc tập trung vào trường văn bản mới sẽ khiến bàn phím ẩn bật lại.

Thật không may, mục 2 và 3 trong danh sách chỉ hoạt động đáng tin cậy khi một hoạt động đang được bắt đầu. Khi hoạt động đã hiển thị, bạn không thể ẩn hoặc hiển thị bàn phím vĩnh viễn. Mẹo nhỏ là thực sự khởi động lại hoạt động của bạn khi người dùng nhấn nút chuyển đổi bàn phím. Trong ứng dụng của tôi khi người dùng nhấn vào nút bàn phím chuyển đổi, đoạn mã sau sẽ chạy:

private void toggleKeyboard(){

    if(keypadPager.getVisibility() == View.VISIBLE){
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, true);
        i.putExtras(state);

        startActivity(i);
    }
    else{
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, false);
        i.putExtras(state);

        startActivity(i);
    }
}

Điều này làm cho hoạt động hiện tại được lưu trạng thái vào Bundle và sau đó hoạt động được bắt đầu, đi qua một boolean cho biết liệu bàn phím sẽ được hiển thị hay ẩn đi.

Bên trong phương thức onCreate, đoạn mã sau được chạy:

if(bundle.getBoolean(SHOW_KEYBOARD)){
    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
    getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

Nếu bàn phím mềm phải được hiển thị, thì InputMethodManager được yêu cầu hiển thị bàn phím và cửa sổ được hướng dẫn để làm cho đầu vào mềm luôn hiển thị. Nếu bàn phím mềm phải được ẩn thì WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM được đặt.

Cách tiếp cận này hoạt động đáng tin cậy trên tất cả các thiết bị tôi đã thử nghiệm - từ điện thoại HTC 4 tuổi chạy Android 2.2 cho đến nexus 7 chạy 4.2.2. Nhược điểm duy nhất với phương pháp này là bạn cần cẩn thận với việc xử lý nút quay lại. Vì ứng dụng của tôi về cơ bản chỉ có một màn hình (là máy tính), tôi có thể ghi đè onBackPression () và quay lại màn hình chính của thiết bị.


1
cách giải quyết phức tạp, nhưng tôi nghĩ rằng nó quá nhiều, để tạo lại hàng ngàn đối tượng chỉ để ẩn Bàn phím. Tôi không biết ai đã thiết kế IMM cho Android, nhưng nó có mùi giống như Windows APi. Theo tôi, một IME tốt nên có hai phương pháp: ẩn và hiển thị :-)
rupps

Tất cả đều đúng, nhưng cách giải quyết của tôi có một lợi thế - nó luôn hoạt động! Không có giải pháp nào khác tôi có thể tìm thấy luôn luôn chuyển đổi bàn phím, bất kể trường nào trong UI có trọng tâm, người dùng đã làm gì để chuyển đổi và bàn phím và phiên bản Android nào họ đang chạy: - \
Luke Sleeman

Man, tôi hoàn toàn tuyệt vọng để giấu bàn phím. Đã thử hàng ngàn thứ và noooone hoạt động. Nhưng cách giải quyết của bạn là quá nhiều đối với tôi, tôi phải tạo lại như 10 đoạn, khởi tạo dịch vụ, xóa rất nhiều WeakReferences .... bạn biết không? GC sẽ vứt đi như 25mb: S ... Vẫn đang tìm kiếm một cách đáng tin cậy để làm điều đó :(
rupps

@Dmitry cũng không phải là một thế giới xin chào ... đó là một ứng dụng phức tạp cho máy tính bảng. Tôi từ chối hoàn toàn giải phóng nó khỏi bộ nhớ chỉ để ẩn một bàn phím ngớ ngẩn ... Dù sao tôi cũng tìm thấy thứ gì đó hoạt động kết hợp hàng ngàn giải pháp được đề xuất ở đây :)
rupps

27

Ngoài ra, với giải pháp xung quanh này , nếu bạn muốn đóng bàn phím mềm từ bất cứ đâu mà không cần tham chiếu đến trường (EditText) được sử dụng để mở bàn phím, nhưng vẫn muốn làm điều đó nếu trường được tập trung, bạn có thể sử dụng này (từ một Hoạt động):

if (getCurrentFocus() != null) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}

25

Nhờ câu trả lời SO này , tôi đã rút ra được những điều sau đây, trong trường hợp của tôi, hoạt động độc đáo khi cuộn qua các đoạn của ViewPager ...

private void hideKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

private void showKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    }
}

21

Các câu trả lời ở trên hoạt động cho các kịch bản khác nhau nhưng nếu bạn muốn ẩn bàn phím trong chế độ xem và đấu tranh để có được ngữ cảnh phù hợp, hãy thử điều này:

setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        hideSoftKeyBoardOnTabClicked(v);
    }
}

private void hideSoftKeyBoardOnTabClicked(View v) {
    if (v != null && context != null) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

và để lấy bối cảnh lấy nó từ hàm tạo :)

public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
    init();
}

18

Nếu bạn muốn đóng bàn phím mềm trong quá trình kiểm tra đơn vị hoặc chức năng, bạn có thể làm như vậy bằng cách nhấp vào "nút quay lại" từ bài kiểm tra của mình:

// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

Tôi đặt "nút quay lại" trong dấu ngoặc kép, vì ở trên không kích hoạt onBackPressed()Hoạt động được đề cập. Nó chỉ đóng bàn phím.

Đảm bảo tạm dừng một chút trước khi tiếp tục, vì phải mất một chút thời gian để đóng nút quay lại, vì vậy các lần nhấp tiếp theo vào Chế độ xem, v.v., sẽ không được đăng ký cho đến sau khi tạm dừng ngắn (1 giây là đủ dài ).


16

Đây là cách bạn làm điều đó trong Mono cho Android (AKA MonoDroid)

InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
    imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);

1
Có gì searchboxtrong đoạn trích?
PCoder

16

Điều này làm việc cho tôi cho tất cả các hành vi bàn phím kỳ lạ

private boolean isKeyboardVisible() {
    Rect r = new Rect();
    //r will be populated with the coordinates of your view that area still visible.
    mRootView.getWindowVisibleDisplayFrame(r);

    int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top);
    return heightDiff > 100; // if more than 100 pixels, its probably a keyboard...
}

protected void showKeyboard() {
    if (isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (getCurrentFocus() == null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    } else {
        View view = getCurrentFocus();
        inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
    }
}

protected void hideKeyboard() {
    if (!isKeyboardVisible())
        return;
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View view = getCurrentFocus();
    if (view == null) {
        if (inputMethodManager.isAcceptingText())
            inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
    } else {
        if (view instanceof EditText)
            ((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
        inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

1
Hãy nghĩ rằng tôi đã thử 10 câu trả lời trước cái này. Đã từ bỏ hy vọng. Cảm ơn người đàn ông.
Xu hướng

MRootView là gì?
justdan0227

14

Thêm vào hoạt động của bạn android:windowSoftInputMode="stateHidden"trong tệp Manifest. Thí dụ:

<activity
            android:name=".ui.activity.MainActivity"
            android:label="@string/mainactivity"
            android:windowSoftInputMode="stateHidden"/>

14

Phương pháp đơn giản và dễ sử dụng, chỉ cần gọi hidePalFrom (YourActivity.this); để ẩn bàn phím

/**
 * This method is used to hide keyboard
 * @param activity
 */
public static void hideKeyboardFrom(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

13

Chỉ cần sử dụng mã được tối ưu hóa này trong hoạt động của bạn:

if (this.getCurrentFocus() != null) {
    InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

Hoạt động tốt. Cảm ơn
Alif

12
public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

sau cuộc gọi đó trên onTouchListener:

findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Utils.hideSoftKeyboard(activity);
        return false;
    }
});

Hãy thử điều này thật tốt - điều này hiệu quả với tôi: InputMethodManager imm = ((InputMethodManager) getSystemService (Activity.INPUT_METHOD_SERVICE)); im. leatherSoftInputFromWindow (getWindow (). getCienF Focus (). getWindowToken (), 0);
zmicer

12

dùng cái này

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

12

Đối với trường hợp của tôi, tôi đã sử dụng SearchView trong thanh hành động. Sau khi người dùng thực hiện tìm kiếm, bàn phím sẽ bật lại.

Sử dụng InputMethodManager không đóng bàn phím. Tôi đã phải xóa Lấy nét và đặt tiêu điểm của chế độ xem tìm kiếm thành sai:

mSearchView.clearFocus();
mSearchView.setFocusable(false);

1
Rất thông minh. Nếu người dùng muốn tìm kiếm khác, chỉ cần nhấp vào tìm kiếm một lần nữa.
Alex

SearchView không có clearFocus()trong các trang API Android, vì vậy điều này không hiệu quả với tôi, nhưng một giải pháp khác đã làm (xem câu trả lời của tôi dưới đây).
Azurespot


12

Tôi có trường hợp, nơi tôi EditTextcó thể được đặt trong một AlertDialog, vì vậy bàn phím nên được đóng lại khi bị loại bỏ. Các mã sau đây dường như đang làm việc ở bất cứ đâu:

public static void hideKeyboard( Activity activity ) {
    InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE );
    View f = activity.getCurrentFocus();
    if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) )
        imm.hideSoftInputFromWindow( f.getWindowToken(), 0 );
    else 
        activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );
}

1
Giải pháp này tốt hơn bởi vì bạn không phải kiểm soát EditText nào chuyển qua làm tham số cho phương thức hideSoftInputFromWindow (). Nó hoạt động rất tốt !!
Billyjoker 12/2/2015

12

Tôi gần như đã thử tất cả các câu trả lời này, tôi đã gặp một số vấn đề ngẫu nhiên đặc biệt là với samsung galaxy s5.

Những gì tôi kết thúc là buộc chương trình và ẩn, và nó hoạt động hoàn hảo:

/**
 * Force show softKeyboard.
 */
public static void forceShow(@NonNull Context context) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

/**
 * Force hide softKeyboard.
 */
public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) {
    if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) {
        editText.requestFocus();
    }
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
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.