Як приховати м'яку клавіатуру зсередини фрагмента?


82

Я FragmentActivityвикористовую a ViewPagerдля обслуговування кількох фрагментів. Кожен ListFragmentз них має такий макет:

<?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>

Під час початку роботи відображається програмна клавіатура. Щоб виправити це, я зробив наступне всередині фрагмента:

@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);
}

Я зберігаю вхідний ViewGroup containerпараметр onCreateViewяк спосіб доступу до маркера вікна для основної діяльності. Це працює без помилок, але клавіатура не приховується від дзвінка hideSoftInputFromWindowв onStart.

Спочатку я намагався використовувати завищений макет замість container, тобто:

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

але це викинуло a NullPointerException, мабуть, тому, що сам фрагмент не є діяльністю і не має унікального маркера вікна?

Чи є спосіб приховати програмну клавіатуру зсередини фрагмента, чи слід створити метод у FragmentActivityі викликати його зсередини фрагмента?

Відповіді:


179

Поки ваш Фрагмент створює подання, ви можете використовувати IBinder (маркер вікна) з цього подання після того, як його буде приєднано. Наприклад, ви можете замінити onActivityCreated у вашому фрагменті:

@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
я додав це до свого проекту. але коли я натискаю на іншу вкладку, він аварійно завершує роботу.
andro-girl

4
Для тих, хто робить це і отримує збій з NullPointerException, просто використовуйте InputMethodManager всередині вашого фрагмента onCreateView метод. Зробивши це, ви отримаєте свій вигляд, і ви зможете змінити останній рядок, скориставшись видом, який ви надули до immu.hideSoftInputFromWindow (view.getWindowToken (), 0);
Аурасфера

83

Для мене не працювало нічого, крім наступного рядка коду:

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

1
SOFT_INPUT_STATE_HIDDENтакож працював у мене, хоча я не знаю, в чому різниця між цим і `SOFT_INPUT_STATE_ALWAYS_HIDDEN '.
hBrent

2
Перша відповідь не спрацювала, ця зробила трюк. Дякую
муджіб

1
Дякуємо, що заощадили мій час, приятель.
Harish Reddy

Моя ситуація полягає у тому, що я використовую фрагмент / TabView. На першій вкладці є "Поради" в TextView. На другій вкладці є активність, де у мене є EditText (s) з "editText1.setShowSoftInputOnFocus (false);" набір команд і власна власна клавіатура. Коли я поміщаю програму у фоновий режим, а потім повертаю її у поле зору, з’являється небажана м’яка клавіатура. Встановлення вищевказаної команди в методі onStart Life Cycle Override зупиняє це. Дякую @Shajeel Afzal
назавжди студент CS

21

Якщо ви додасте наступний атрибут до визначення маніфесту вашої діяльності, він повністю заблокує спливаючу клавіатуру, коли ваша активність відкриється. Сподіваємось, це допомагає:

(Додайте до визначення маніфесту своєї діяльності):

android:windowSoftInputMode="stateHidden"

Дякую, цим я врешті-решт займався. Однак я все одно хотів би знати, як за допомогою диспетчера методів введення показувати / приховувати клавіатуру, тому що, можливо, мені доведеться використовувати її колись після початку активності.
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;
    }

Зберігати екземпляр мого кореневого подання в моєму класі

View view;

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

Використовуйте подання, щоб приховати клавіатуру

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

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

Я використовував це, але використовував getView () зі свого фрагмента, а не зберігав екземпляр свого перегляду.
MrEngineer13,

OnCreate - це клас поза Фрагментом, тому я передаю йому rootView, щоб мати змогу використовувати його для видалення phoneKeyPad у цьому класі. Я припускаю, що вони хотіли це зсередини Фрагменту, а не класу у Фрагменті.
Мобільні додатки

10

Виняток, DialogFragmentоднак, фокус вбудованого Dialogповинен бути прихованим, а не лише перший EditTextу вбудованомуDialog

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

5
Це єдиний спосіб приховати клавіатуру, якщо у вас є DialogFragment.
Matjaz Kristl

де це написати?
Mstack

@Mstack, працює над методом onActivityCreated (). override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)}
Самі Ісса

7

Цей код працює для фрагментів:

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

4

Використовуйте цей статичний метод з будь-якого місця (Діяльність / Фрагмент), яке Вам подобається.

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();
    }
}

Якщо ви хочете використовувати для фрагмента, просто зателефонуйте hideKeyboard(((Activity) getActivity())).


3

це буде працювати в моєму випадку, коли у вкладках я переключаюся з одного фрагмента на інший

@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);
        }
    }
}

якщо у вас є фрагмент вкладки, і ви хочете приховати клавіатуру лише для кількох вкладок, використовуйте це.
Ронні Сулістіо

1

Нічого з цього не працювало на API27. Мені довелося додати це в контейнер макета, для мене це був 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>

він не працює на api <26, але це робить (всередині класу фрагментів) @Override public void onResume () {super.onResume (); getView (). setFocusable (true); getView (). setFocusableInTouchMode (істина); getView (). requestFocus (); }
Дарко

1

Це працювало у мене в класі Котліна

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

Використовуйте цей код у будь-якому прослуховувачі кнопок фрагментів:

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

Працює, але ви повинні перевірити, якщо getActivity().getCurrentFocus().getWindowToken()не має значення null, інакше це призведе до помилки, якщо немає зосередженого editText. Дивіться мою відповідь нижче
Duc Trung Mai

0

Просто додайте цей рядок у свій код:

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

0

У Котліні:

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

0

Використовуй це:

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);
   }
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.