Android : 소프트 키보드가 화면을 위로 밀지 못하게하려면 어떻게합니까?


386

앱 하단에 세로 슬라이딩 서랍이 있습니다. 소프트 키보드가 열리면 서랍의 탭이 위로 올라가 키보드 위에 있습니다. 실제로 화면 하단에 키보드가 표시되면 숨겨지기를 원합니다.

다른 사람이이 문제를 겪고 있습니까? 문제를 해결하는 방법을 알고 있습니까?


1
안녕, 나는 당신이 매니페스트 파일에서 사용한 플래그와 같은 문제가 있습니다, 당신은 plz 저를 도울 수 있습니까
Nixit Patel

1
이 질문은 여기에 복제됩니다 : stackoverflow.com/questions/5516216/…
WonderWorker

답변:


656

액티비티 태그 내부의 파일 에서 액티비티 windowSoftInputMode플래그를 간단히 전환 할 수 있습니다 .adjustPanAndroidMainfest.xml

자세한 내용은 공식 문서 를 확인하십시오 .

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>

43
뷰가 패닝되는 것을 원하지 않고 고정 된 상태로 유지하기를 원하며 키보드로 덮을 부분을 덮습니다.
Christopher Perry

5
패닝하면 입력하는 뷰를 볼 수 있도록 뷰가 스크롤됩니다. 즉, 키보드가 방금 표시된 포커스 뷰를 가리지 않으면 고정 된 상태로 유지됩니다.
Alexander Oleynikov

18
나는 같은 문제에 직면하고있다. manifeast 파일에서 windowSoftInputMode 플래그를 "adjustPan"으로 설정했지만 작동하지 않습니다. 해결 방법
Subrat

20
화면 하단에 버튼 행이 있고 그 위에 ScrollView가있는 경우 도움이되지 않습니다. windowSoftInputMode의 값에 관계없이 버튼이 눌려집니다.
Artem Russakovskii

3
조각에서 작동하지 않습니다. 조각으로하는 방법?
Prashanth Debbadwar

175

어떤 대답도 나를 위해 효과가 없었지만 이것은 트릭을 수행했습니다.

android:windowSoftInputMode="adjustNothing"

6
이렇게하면 키보드가 높이를 다시 계산하기 위해 레이아웃을 만들지 않고도 내용을 오버레이하는 것처럼 보입니다.
Reinherd

13
이렇게하면 키보드를 사용하여 내용을 올리는 문제를 해결할 수 있습니다.
다니엘 더글러스

8
당신은 사용 @Dom에서 수있는 대출 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);프로그램이 값을 설정
브롱 데이비스

1
이것은 다른 답변과 달리 나를 위해 작동합니다 (젤리 4.1)
Virus721

완전한! 내 경우에도 효과가 있습니다. 내부에 편집 텍스트가있는 대화 상자가 표시됩니다. 대화 상자가 열리면 키보드도 나타납니다. "adjustPan"을 시도했지만 키보드 표시 기능이 차단되었습니다. 따라서 "adjustNothing"은 제 경우에는 더 잘 작동했습니다.
sembozdemir

85

필자의 경우 버튼이 밀린 이유는 버튼 위의보기가 이었기 때문에 설정 한 ScrollView값에 관계없이 버튼이 키보드 위로 밀려서 축소되었습니다 android:windowSoftInputMode.

내가 설정하여 소프트 키보드에 의해 밀려지고 버튼의 내 맨 아래 행을 피할 수 있었다 android:isScrollContainer="false"상의 ScrollView버튼 위에 앉아있다.


2
그러나이 경우 소프트 키보드는 화면의 일부를 덮으며 아래로 스크롤 할 수 없습니다. 키보드 상단에 하단 패널이 나타나지 않도록 방지 할 수있는 방법은 한 가지뿐입니다. 키보드를 열면 키보드가 보이지 않습니다.
Dmitry

1
이거 야! 이 설정은 "adjustNothing"누락 된 속성의 효과를 달성 할 수있는 유일한 방법이므로 발언하기에 매우 흥미 롭습니다.
rupps

나는 Textview와 함께 사용 위대한 tnx 작업
Sunil Chaudhary

2
@Artem Russakovskii 나는 당신이 누군지 모르지만이 솔루션에 대해 당신을 사랑합니다. 고마워
Lev

1
@ Artem Russakovskii 이것은 완벽하게 작동합니다. 고마워
SkypeDogg

72

onCreate활동 의 메소드에 다음 코드를 넣어서이 속성을 동적으로 추가 할 수 있습니다 .

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

이것은 나를 위해 일했지만, 그것은 :

android:windowSoftInputMode="adjustPan"

하지 않았다.


android:windowSoftInputMode="adjustPan"AndroidManifest.xml에 추가 했습니까 ?
Habeeb Perwad

아니요, 실제로 아무런 차이가 없었습니다. 첫 번째 코드 줄이 작업을 수행했습니다. :) @HabeebPerwad
Dom

AndoidManifest.xml 파일에 초 줄을 추가했습니다. 그 후에는 효과가 있다고 생각합니다. 방금 물었습니다.
Habeeb Perwad 2018 년

1
@Dom, getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);조각에서 " " 를 사용하는 방법은 무엇입니까?
Tushar Gogna

1
드디어! 작동합니다! 컨트롤러 (에서 확장 FragmentActivity)와 컨트롤러에 연결된 일부보기 (보기가에서 확장 됨 RelativeLayout)가 있습니다. 그래서 controller.getWindow()...당신이 말한 것처럼 귀찮은 견해에서 . 작품
Alaa M.

39

이 답변은 도움이되지 않았습니다. 그래서 나는 이것을 시도했다 :

android:windowSoftInputMode="adjustResize"

이것은 매력처럼 작동했습니다. 이제 내 앱의 헤더가 사라지지 않습니다. 더 부드럽습니다.


이것은 거의 나를 위해 완벽하게 작동합니다. 유일한 문제는 키보드의 제안 막대 / 행이 여전히 내 레이아웃을 숨기고 있다는 것입니다. 그런 문제에 직면 했습니까?
Sufian

이 문제에 직면하지 않았습니다. @Sufian
amalBit

당시에는 아무런 문제가 없었습니다. 이제 확실하지 않습니다. @Sufian
amalBit

비슷한 문제에 직면했을 가능성이있는 사람들은 아마 때문일 것입니다 TabLayout. 가시성을로 설정하면 문제가 사라졌습니다 View.GONE. 레이아웃을 다시 디자인해야 할 때입니다.
Sufian

13

프래그먼트에서 프로그래밍 방식 으로이 작업을 수행하려면 다음 코드를 사용할 수 있습니다

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

이것을 onResume ()에 넣으십시오.


11

미래의 독자들을 위해.

이 문제에 대한 구체적인 제어를 원했기 때문에 이것이 내가 한 일입니다.

조각 또는 활동에서 다른보기 (키보드가 작동하는 동안 필요하지 않은)를 숨기고 복원 하여이 문제를 해결하십시오.

            rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    rootView.getWindowVisibleDisplayFrame(r);
                    int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top);

                    if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                    //ok now we know the keyboard is up...
                        view_one.setVisibility(View.GONE);
                        view_two.setVisibility(View.GONE);

                    }else{
                    //ok now we know the keyboard is down...
                        view_one.setVisibility(View.VISIBLE);
                        view_two.setVisibility(View.VISIBLE);

                    }
                }
            });

1
@Skynet 당신은 절대적으로 맞습니다! 이것은 내 자신의 문제에 사용한 맞춤형 솔루션이었습니다.
Petro

7
이봐, 그것은 훌륭했다. 그러나 키보드가 닫힌 인스턴스의 경우보기가 표시되는 짧은 기간 (밀리 초)이 있습니다. 그래서 가시성을 직접 설정하는 대신 가시성을 사용 view.post(Runnable runnable)하여 설정했습니다. 그것은 나를 위해 큰 것으로 밝혀졌다
daisura99

9

한 줄만 추가하면됩니다 ...

android:windowSoftInputMode="stateHidden|adjustPan"에 필요한 활동을 추가 하십시오 manifest file.

방금 해결되었습니다 :) :)


8

xamarin 사용자의 경우 MainActivity 클래스의 Activity 속성에이 코드를 추가하십시오.

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

또는 Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)MainActivity 클래스의 OnCreate 메소드 에이 코드 를 추가 할 수 있습니다 .


8

이것은 나를 위해 일했다

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

7

지금까지 키보드에 의해 숨겨져있는 textView 아래에 버튼과 textInput 필드 (나란히 있음)가있어서 대답이 도움이되지 않았지만 문제가 해결되었습니다.

android:windowSoftInputMode="adjustResize"

7

매니페스트 파일의 '활동'에 다음 코드를 추가하십시오.

android:windowSoftInputMode="adjustResize"

이것은 잘 작동합니다. 그러나 조언 만하면 백분율을 사용할 때 제대로 작동하지 않습니다. 일부 요소를 다시 조정하기 때문입니다. 따라서 백분율이있는 제약 요소가 있으면 문제가 있습니다. 대신 wrap_content를 사용하면 잘 작동합니다.
Thiago Silva

7
android:windowSoftInputMode="stateHidden|adjustNothing"

이 코드는 작동합니다.


android : windowSoftInputMode = "stateHidden | adjustPan"도 작동해야한다고 생각합니다.
Arthur Sady Cordeiro Rossetti

6

이것은 나를 위해 일한 최고였습니다

android:windowSoftInputMode="adjustNothing"

시도 해봐!


4

글쎄,이 답변을 보았지만 제 경우에는 같은 문제에 빠졌고 XML 파일에있는 Scrollview 태그에 매우 작은 무고한 속성을 넣는 매우 편리하고 쉬운 솔루션을 통해 피난했습니다. 그건

android:isScrollContainer="false"

행운을 빕니다!


4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

이것은 나를 위해 일하고 있습니다.


2

스크롤보기의 경우 :

android:windowSoftInputMode="stateHidden|adjustPan"안드로이드 매니페스트에 추가 한 후에도 여전히 작동하지 않는 경우.

키보드가 나타날 때 스크롤보기가되고 단추 / 대상이 스크롤보기에없는 경우 해당 개체가 키보드를 따라 이동하여 위치를 이동하기 때문에 영향을받을 수 있습니다.

버튼이있는 XML을 확인하고 스크롤보기 브래킷 아래에 있고 버튼이 아닌지 확인하십시오.

이것이 도움이되기를 바랍니다. :디


2

필자의 경우 키보드를 숨겨 두어야하고 버튼을 클릭 한 직후 레이아웃을 조정해야하므로 매니페스트 에이 명령을 추가하면 바로 맞습니다.

android:windowSoftInputMode="stateHidden|adjustResize"

2

키보드를 열 때보기를 숨기려고 할 때.

매니페스트 파일의 액티비티에 추가

android:windowSoftInputMode="stateHidden|adjustPan"

2

그들 중 누구도 나를 위해 일하지 않았습니다.

 private void scrollingWhileKeyboard() {
    drawerlayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            try {
                drawerlayout.getWindowVisibleDisplayFrame(r);
                int screenHeight = drawerlayout.getRootView().getHeight();
                int keypadHeight = screenHeight - r.bottom;
                if (keypadHeight > screenHeight * 0.15) {
                    tabLayout.setVisibility(View.GONE);
                } else {
                    tabLayout.setVisibility(View.VISIBLE);
                }
            } catch (NullPointerException e) {

            }
        }
    });

}

1

활동의 기본 창은 소프트 키보드를위한 공간을 만들기 위해 크기가 조정되지 않습니다. 오히려 창의 내용이 자동으로 이동되어 현재 포커스가 키보드에 의해 가려지지 않으며 사용자는 입력 내용을 항상 볼 수 있습니다.

android:windowSoftInputMode="adjustPan"

이것은 당신이 원하는 것에 대한 더 나은 해결책 일 수 있습니다.



1

이 코드가 도움이 될 수 있습니다. 당신의 oncreate방법으로 사용하십시오 .

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

나는 이것을 시도했지만 뷰가 뷰의 하단 부분을 잘라 내고 위의 시간을 오버레이하도록 뷰를 푸시하는 문제가 있습니까? 어떤 레이아웃이 변경되거나 무엇이 필요한지에 대한 아이디어가 있습니까? stackoverflow.com/questions/39909897/…
Lion789

1

표시하려는 활동에서 매니페스트 파일에 포함하지만 전체 화면 활동을 사용하지 않아야합니다.

android:windowSoftInputMode="adjustPan"


1

추가하여 문제를 해결했습니다.

 android:windowSoftInputMode="adjustNothing" 

매니페스트 파일에 추가하십시오.

Recyclerviews 제약 조건을 isScrollContainer를 false로 설정하십시오.

android:isScrollContainer="false"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.