Làm thế nào để ẩn bàn phím mềm từ bên trong một mảnh?


83

Tôi có một FragmentActivitysử dụng một ViewPagerđể phân phát một số mảnh. Mỗi là một ListFragmentvới bố cục sau:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="8dp">
        <ListView android:id="@id/android:list"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

        <EditText android:id="@+id/entertext"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</LinearLayout>

Khi bắt đầu hoạt động, bàn phím mềm sẽ hiển thị. Để khắc phục điều này, tôi đã thực hiện như sau bên trong đoạn:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //Save the container view so we can access the window token
    viewContainer = container;
    //get the input method manager service
    imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    . . .
}

@Override
public void onStart() {
    super.onStart();

    //Hide the soft keyboard
    imm.hideSoftInputFromWindow(viewContainer.getWindowToken(), 0);
}

Tôi lưu ViewGroup containertham số đến từ onCreateViewnhư một cách để truy cập mã thông báo cửa sổ cho hoạt động chính. Này chạy mà không có lỗi, nhưng bàn phím không được ẩn từ các cuộc gọi đến hideSoftInputFromWindowtrong onStart.

Ban đầu, tôi đã thử sử dụng bố cục tăng cao thay vì container:

imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0);

nhưng điều này đã tạo ra một NullPointerException, có lẽ vì bản thân phân đoạn không phải là một hoạt động và không có mã thông báo cửa sổ duy nhất?

Có cách nào để ẩn bàn phím mềm khỏi một phân mảnh hay tôi nên tạo một phương thức trong FragmentActivityvà gọi nó từ bên trong phân mảnh?

Câu trả lời:


180

Miễn là Fragment của bạn tạo Chế độ xem, bạn có thể sử dụng IBinder (mã thông báo cửa sổ) từ chế độ xem đó sau khi nó đã được đính kèm. Ví dụ: bạn có thể ghi đè onActivityCreate trong Fragment của mình:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}

9
tôi đã thêm cái này vào dự án của mình. nhưng khi tôi nhấp vào một tab khác, nó bị lỗi.
andro-girl

4
Đối với những người đang làm việc này và gặp sự cố với NullPointerException, chỉ cần sử dụng InputMethodManager bên trong phương thức onCreateView phân đoạn của bạn. Làm như vậy, bạn sẽ có chế độ xem của mình và bạn có thể thay đổi dòng cuối cùng bằng cách sử dụng chế độ xem bạn đã tăng lên thành imm.hideSoftInputFromWindow (view.getWindowToken (), 0);
Aurasphere

84

Không có gì ngoài dòng mã sau đây phù hợp với tôi:

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

1
SOFT_INPUT_STATE_HIDDENcũng làm việc cho tôi, mặc dù tôi không biết sự khác biệt giữa điều đó và `SOFT_INPUT_STATE_ALWAYS_HIDDEN 'là gì.
hBrent

2
Câu trả lời đầu tiên không hoạt động, câu trả lời này đã thực hiện thủ thuật. Cảm ơn
moujib

1
Cảm ơn bạn đã tiết kiệm thời gian của tôi.
Harish Reddy

Tình huống của tôi là tôi đang sử dụng phân mảnh / TabView. Tab đầu tiên có "Mẹo" trong TextView. Tab thứ hai có một hoạt động mà tôi có (các) EditText với "editText1.setShowSoftInputOnFocus (false);" bộ lệnh và bàn phím tùy chỉnh của riêng tôi. Khi tôi đặt ứng dụng ở chế độ nền và sau đó đưa ứng dụng trở lại chế độ xem, bàn phím mềm không mong muốn sẽ bật lên. Đặt lệnh trên trong phương pháp Ghi đè vòng đời onStart sẽ ngăn chặn điều này. Cảm ơn @Shajeel Afzal
Mãi mãi là Sinh viên CS

21

Nếu bạn thêm thuộc tính sau vào định nghĩa tệp kê khai của hoạt động, nó sẽ ngăn hoàn toàn bàn phím bật ra khi hoạt động của bạn mở ra. Hy vọng rằng điều này sẽ giúp:

(Thêm vào định nghĩa tệp kê khai Hoạt động của bạn):

android:windowSoftInputMode="stateHidden"

Cảm ơn, đây là những gì tôi đã làm. Tuy nhiên, tôi vẫn muốn biết cách sử dụng Trình quản lý phương thức nhập để hiển thị / ẩn bàn phím, vì tôi có thể cần sử dụng nó đôi khi sau khi hoạt động bắt đầu.
WilHall

12
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_my, container,
                false);
        someClass.onCreate(rootView);
        return rootView;
    }

Giữ một bản sao của chế độ xem gốc của tôi trong lớp của tôi

View view;

public void onCreate(View rootView) {
    view = rootView;

Sử dụng chế độ xem để ẩn bàn phím

 public void removePhoneKeypad() {
    InputMethodManager inputManager = (InputMethodManager) view
            .getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);

    IBinder binder = view.getWindowToken();
    inputManager.hideSoftInputFromWindow(binder,
            InputMethodManager.HIDE_NOT_ALWAYS);
}

Tôi đã sử dụng điều này nhưng tôi đã sử dụng getView () từ phân đoạn của mình thay vì giữ một phiên bản của chế độ xem của tôi.
MrEngineer 13

OnCreate là một lớp bên ngoài Fragment, vì vậy tôi chuyển nó qua rootView để có thể sử dụng nó để xóa phoneKeyPad trong lớp này. Tôi cho rằng họ muốn nó từ bên trong Fragment chứ không phải một lớp trong Fragment.
Ứng dụng di động

10

DialogFragmentTuy nhiên, ngoại lệ , tiêu điểm của phần được nhúng Dialogphải được ẩn, thay vào đó chỉ tiêu điểm đầu tiên EditTexttrong phần được nhúngDialog

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

5
Đây là cách duy nhất để ẩn keybord, nếu bạn có DialogFragment.
Matjaz Kristl,

viết cái này ở đâu?
Mstack

@Mstack, hoạt động trên phương thức onActivityCreate (). override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)}
Sami Issa

7

Mã này hoạt động cho các đoạn:

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

4

Sử dụng phương thức tĩnh này, từ bất kỳ đâu (Hoạt động / Phân mảnh) bạn thích.

public static void hideKeyboard(Activity activity) {
    try{
        InputMethodManager inputManager = (InputMethodManager) activity
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        View currentFocusedView = activity.getCurrentFocus();
        if (currentFocusedView != null) {
            inputManager.hideSoftInputFromWindow(currentFocusedView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

Nếu bạn muốn sử dụng cho phân mảnh chỉ cần gọi hideKeyboard(((Activity) getActivity())).


3

điều này sẽ hoạt động trong trường hợp của tôi khi trong các tab, tôi chuyển từ một đoạn này sang một đoạn khác

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        try {
            InputMethodManager mImm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            mImm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
            mImm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {
            Log.e(TAG, "setUserVisibleHint: ", e);
        }
    }
}

nếu bạn có phân đoạn tab và chỉ muốn ẩn bàn phím cho một vài tab, hãy sử dụng điều này.
Ronny Sulistio vào

1

Không có gì trong số này hoạt động trên API27. Tôi phải thêm cái này vào vùng chứa của bố cục, đối với tôi nó là một ConstraintLayout:

<android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:focusedByDefault="true">

//Your layout

</android.support.constraint.ConstraintLayout>

nó không hoạt động trên api <26, nhưng điều này có (bên trong lớp phân mảnh) @Override public void onResume () {super.onResume (); getView (). setFocusable (true); getView (). setFocusableInTouchMode (true); getView (). requestFocus (); }
Darko

1

Điều này đã làm việc cho tôi trong lớp Kotlin

fun hideKeyboard(activity: Activity) {
    try {
        val inputManager = activity
            .getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        val currentFocusedView = activity.currentFocus
        if (currentFocusedView != null) {
            inputManager.hideSoftInputFromWindow(currentFocusedView.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }

}

1

Sử dụng mã này trong bất kỳ trình nghe nút phân đoạn nào:

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

Hoạt động nhưng bạn phải kiểm tra xem getActivity().getCurrentFocus().getWindowToken()có phải là null hay không, nếu không nó sẽ gây ra lỗi nếu không có editText tập trung. Xem câu trả lời của tôi bên dưới
Đức Trung Mai

0

Chỉ cần thêm dòng này vào mã của bạn:

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

0

Trong Kotlin:

(activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view?.windowToken,0)

0

Dùng cái này:

Button loginBtn = view.findViewById(R.id.loginBtn);
loginBtn.setOnClickListener(new View.OnClickListener() {
   public void onClick(View v) {
      InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE);
      imm.hideSoftInputFromWindow(v.getWindowToken(), 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.