조각 내부에서 소프트 키보드를 숨기는 방법은 무엇입니까?


83

나는 여러 조각을 제공하기 위해 FragmentActivity사용하고 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. 이것은 오류없이 실행되지만 키보드는 hideSoftInputFromWindowin에 대한 호출에서 숨겨지지 않습니다 onStart.

원래는 대신 부풀려진 레이아웃을 사용해 보았습니다 container.

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

그러나 이것은 NullPointerException아마도 조각 자체가 활동이 아니고 고유 한 창 토큰이 없기 때문에.

조각 내에서 소프트 키보드를 숨기는 방법이 있습니까, 아니면에서 메서드를 만들고 FragmentActivity조각 내에서 호출해야합니까?

답변:


180

프래그먼트가 뷰를 생성하는 한 해당 뷰 가 연결된 해당 뷰에서 IBinder (창 토큰)를 사용할 수 있습니다 . 예를 들어 Fragment에서 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으로 충돌이 발생하는 사람들은 조각 onCreateView 메서드 내에서 InputMethodManager를 사용하십시오. 이렇게하면 뷰가 표시되고 부풀린 뷰를 사용하여 마지막 줄을 imm.hideSoftInputFromWindow (view.getWindowToken (), 0);
Aurasphere

84

다음 코드 줄 외에는 아무것도 없었습니다.

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

1
SOFT_INPUT_STATE_HIDDEN그것과`SOFT_INPUT_STATE_ALWAYS_HIDDEN '의 차이점이 무엇인지 모르겠지만 나를 위해 일했습니다.
hBrent 2014

2
첫 번째 대답은 작동하지 않았고, 이것은 트릭을했습니다. 감사합니다
moujib 2016-08-02

1
시간을 절약 해주셔서 감사합니다.
Harish Reddy

내 상황은 조각 / TabView를 사용하고 있습니다. 첫 번째 탭에는 TextView에 "팁"이 있습니다. 두 번째 탭에는 "editText1.setShowSoftInputOnFocus (false);"와 함께 EditText (s)가있는 활동이 있습니다. 명령 세트와 나만의 맞춤형 키패드. 앱을 백그라운드에 놓은 다음 앱을 다시보기로 가져 오면 원하지 않는 소프트 키보드가 팝업됩니다. onStart Life Cycle Override 메서드에서 위의 명령을 설정하면이를 중지합니다. 감사합니다 @Shajeel Afzal
Forever a CS Student

21

활동의 매니페스트 정의에 다음 속성을 추가하면 활동이 열릴 때 키보드가 터지는 것을 완전히 억제합니다. 도움이 되었기를 바랍니다.

(활동의 매니페스트 정의에 추가) :

android:windowSoftInputMode="stateHidden"

고마워, 이것이 내가 한 일입니다. 그러나 활동이 시작된 후 언젠가 사용해야 할 수도 있기 때문에 입력기 관리자를 사용하여 키보드를 표시하거나 숨기는 방법을 알고 싶습니다.
WilHall 2011

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 2015-08-29

onCreate는 Fragment 외부의 클래스이므로이 클래스에서 phoneKeyPad를 제거하는 데 사용할 수 있도록 rootView에 전달합니다. 나는 그들이 Fragment의 클래스가 아닌 Fragment 내부에서 그것을 원했다고 생각합니다.
모바일 응용 프로그램

10

의 예외 DialogFragment하지만, 임베디드의 초점은 Dialog대신 첫 번째, 숨겨진해야 EditText임베디드 내Dialog

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

5
이것은 DialogFragment가있는 경우 keybord를 숨기는 유일한 방법입니다.
마차 즈 Kristl

이것을 어디에 쓸 것인가?
Mstack

@Mstack은 onActivityCreated () 메서드에서 작동합니다. override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)}
Sami Issa

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

탭 조각이 있고 몇 개의 탭에 대해서만 키보드를 숨기려면 이것을 사용하십시오.
Ronny Sulistio 2018

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 (true); getView (). requestFocus (); }
Darko

1

이것은 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

프래그먼트 버튼 리스너에서이 코드를 사용하세요.

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

Kotlin에서 :

(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);
   }
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.