Android: Làm cách nào để ngăn bàn phím mềm đẩy tầm nhìn của tôi lên?


386

Tôi có một ngăn kéo trượt dọc ở dưới cùng của ứng dụng của tôi. Khi bàn phím mềm mở ra, nó sẽ đẩy tab cho ngăn kéo lên, để nó nằm trên bàn phím. Tôi thực sự muốn nó vẫn ở dưới cùng của màn hình, bị ẩn khi bàn phím được hiển thị.

Bất cứ ai khác chạy vào vấn đề này? Biết cách khắc phục?


1
xin chào, tôi đang gặp vấn đề tương tự với cờ bạn đã sử dụng trong tệp kê khai, bạn có thể giúp tôi với điều đó không
Nixit Patel

1
Câu hỏi này được nhân đôi tại đây: stackoverflow.com/questions/5516216/ từ
WonderWorker

Câu trả lời:


656

Bạn chỉ có thể chuyển windowSoftInputModecờ Hoạt động của mình sang adjustPantrong AndroidMainfest.xmltệp bên trong thẻ hoạt động.

Kiểm tra các tài liệu chính thức để biết thêm.

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

43
Tôi không muốn chế độ xem lia máy, tôi muốn nó ở trạng thái tĩnh, và chỉ cần che bàn phím lên bất cứ thứ gì nó sẽ che đậy.
Christopher Perry

5
Bằng cách xoay, điều đó có nghĩa là chế độ xem sẽ được cuộn để hiển thị chế độ xem mà bạn đang nhập. Nói cách khác, nếu bàn phím vừa xuất hiện không che khuất tầm nhìn tập trung thì nó sẽ tĩnh.
Alexander Oleynikov

18
Tôi đang đối mặt với vấn đề tương tự. làm cho cờ windowSoftInputMode thành "điều chỉnh" trong tệp kê khai. Nhưng không hoạt động. Làm thế nào để giải quyết nó
Subrat

20
Không giúp ích gì trong trường hợp tôi có một hàng nút ở phía dưới màn hình và ScrollView phía trên chúng. Các nút được đẩy lên bất kể giá trị nào trong windowSoftInputMode.
Artem Russakovskii

3
không làm việc trong một mảnh Làm thế nào để làm điều đó trong mảnh?
Prashanth Debbadwar

175

Không có câu trả lời nào phù hợp với tôi, nhưng điều này đã tạo nên mánh khóe:

android:windowSoftInputMode="adjustNothing"

6
Điều này làm cho bàn phím xuất hiện lớp phủ nội dung, mà không tạo bố cục để tính toán lại chiều cao của nó.
Reinherd

13
Điều này giải quyết vấn đề bàn phím đẩy nội dung lên mặc dù đó là điều tôi và OP muốn đạt được.
Daniel Douglas

8
mượn từ @Dom bạn có thể sử dụng getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);để đặt giá trị này theo chương trình
Bron Davies

1
Câu hỏi này phù hợp với tôi, không giống như các câu trả lời khác (thạch đậu 4.1)
Virus721

Hoàn hảo! Nó cũng đang làm việc trong trường hợp của tôi. Tôi đang hiển thị một hộp thoại có một edittext bên trong. Ngay khi hộp thoại mở ra, bàn phím cũng xuất hiện. Tôi đã thử "điều chỉnh", nhưng nó bị chặn tính năng xuất hiện bàn phím. Vì vậy, "điều chỉnh" làm việc tốt hơn trong trường hợp của tôi.
sembozdemir

85

Trong trường hợp của tôi, lý do các nút được đẩy lên là vì chế độ xem phía trên chúng là ScrollViewvà nó bị sụp đổ với các nút được đẩy lên phía trên bàn phím cho dù android:windowSoftInputModetôi đang đặt giá trị nào .

Tôi đã có thể tránh hàng nút dưới cùng của mình bị bàn phím mềm đẩy lên bằng cách đặt android:isScrollContainer="false"trên nút ScrollViewnằm phía trên các nút.


2
Nhưng trong trường hợp này, bàn phím mềm che một phần màn hình và không có cách nào để cuộn xuống. Có vẻ như chỉ có một cách để ngăn bảng dưới cùng hiển thị ở đầu bàn phím - ẩn nó khi bàn phím đang mở ...
Dmitry

1
đây là nó! Theo tôi, thiết lập này rất thú vị để nhận xét, như là cách duy nhất tôi tìm thấy để đạt được các hiệu ứng của tài sản bị thiếu "điều chỉnh"!
rupps

Tôi sử dụng nó với Textview Work great tnx
Sunil Chaudhary

2
@Artem Russakovskii Tôi không biết bạn là ai, nhưng tôi yêu bạn vì giải pháp này. Cảm ơn rất nhiều.
Lev

1
@Artem Russakovskii điều này hoạt động hoàn hảo. Cảm ơn rất nhiều.
SkypeDogg

72

Bạn có thể cố gắng thêm thuộc tính này một cách linh hoạt, bằng cách đặt đoạn mã sau vào onCreatephương thức hoạt động của bạn:

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

Điều này làm việc cho tôi, nhưng đó:

android:windowSoftInputMode="adjustPan"

không


Bạn đã thêm android:windowSoftInputMode="adjustPan"AndroidManifest.xml chưa?
Habeeb Perwad

Không, vì nó không thực sự làm cho tôi bất kỳ sự khác biệt. Dòng mã đầu tiên đã thực hiện công việc. :) @HabeebPerwad
Dom

Tôi đã thêm dòng giây trong tệp AndoidManifest.xml. Tôi nghĩ rằng sau đó chỉ có nó làm việc. nên cứ hỏi.
Habeeb Perwad

1
@Dom, làm thế nào để sử dụng " getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);" trong một đoạn?
Tushar Gogna

1
Cuối cùng! Những công việc này! Tôi đã có một bộ điều khiển (mở rộng từ FragmentActivity) và một số khung nhìn được gắn vào nó (các khung nhìn mở rộng từ RelativeLayout). Vì vậy, trong quan điểm rắc rối tôi đã làm controller.getWindow()...như bạn nói. Hoạt động
Alaa M.

39

Những câu trả lời ở đây không giúp tôi. Vì vậy, tôi đã thử điều này:

android:windowSoftInputMode="adjustResize"

Điều này hoạt động như một cơ duyên, Bây giờ tiêu đề của ứng dụng của tôi không biến mất. Nó mượt mà hơn.


Điều này gần như hoạt động hoàn hảo cho tôi. Vấn đề duy nhất là thanh / hàng gợi ý của bàn phím vẫn che giấu bố cục của tôi. Bạn đã đối mặt với một vấn đề như vậy?
Sufian

Tôi đã không phải đối mặt với vấn đề này. @Sufian
amalBit

Tôi đã không phải đối mặt với bất kỳ vấn đề sau đó. Bây giờ tôi không chắc chắn. @Sufian
amalBit

Đối với những người có thể phải đối mặt với vấn đề tương tự, nó có thể là do TabLayout. Vấn đề đã biến mất khi tôi đặt tầm nhìn của nó View.GONE. Có lẽ đã đến lúc thiết kế lại bố cục của tôi.
Sufian

13

Để thực hiện việc này theo chương trình trong một đoạn, bạn có thể sử dụng mã sau

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

Đặt cái này vào onResume ()


11

Dành cho độc giả tương lai.

Tôi muốn kiểm soát cụ thể vấn đề này, vì vậy đây là những gì tôi đã làm:

Từ một đoạn hoặc hoạt động, ẩn các chế độ xem khác của bạn (không cần thiết trong khi bàn phím lên), sau đó khôi phục chúng để giải quyết vấn đề này:

            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 Bạn hoàn toàn đúng! Đây là một giải pháp tùy chỉnh mà tôi đã sử dụng cho vấn đề của riêng mình.
Dầu mỏ

7
Này, điều này thật tuyệt vời. Tuy nhiên, ví dụ bàn phím bị đóng, có một khoảng thời gian ngắn (mili giây) trong đó chế độ xem được chuyển sang hiển thị. Vì vậy, thay vì đặt trực tiếp tầm nhìn, tôi đã sử dụng view.post(Runnable runnable)và đặt mức độ hiển thị từ đó. Nó trở nên tuyệt vời đối với tôi
daisura99

9

Chỉ cần một dòng duy nhất được thêm vào ...

Thêm android:windowSoftInputMode="stateHidden|adjustPan"vào hoạt động cần thiết của bạn manifest file.

Tôi vừa mới giải quyết :) :)


8

Đối với người dùng xamarin thêm mã này vào thuộc tính Activity của lớp MainActivity,

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

hoặc bạn có thể thêm mã này Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)vào phương thức OnCreate của lớp MainActivity.


8

Cái này làm việc cho tôi

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

7

Cho đến nay, các câu trả lời không giúp ích gì cho tôi khi tôi có một nút và trường textInput (cạnh nhau) bên dưới textView bị ẩn bởi bàn phím, nhưng điều này đã giải quyết vấn đề của tôi:

android:windowSoftInputMode="adjustResize"

7

Thêm mã sau vào 'hoạt động' của tệp kê khai.

android:windowSoftInputMode="adjustResize"

Điều này hoạt động tốt. Tuy nhiên, chỉ để tư vấn, nó không hoạt động tốt khi bạn sử dụng phần trăm. Bởi vì nó điều chỉnh một số yếu tố. Vì vậy, nếu bạn có các yếu tố ràng buộc với phần trăm, bạn sẽ gặp vấn đề. Sử dụng quấn_content thay thế và nó sẽ hoạt động rất tốt.
Thiago Silva


6

Đây là điều tốt nhất làm việc cho tôi

android:windowSoftInputMode="adjustNothing"

Thử nó!


4

Vâng, tôi đã xem những câu trả lời này nhưng trong trường hợp của tôi, tôi đã rơi vào cùng một vấn đề và đã quy y một giải pháp rất tiện dụng và đơn giản nhất là đưa một thuộc tính vô tội rất nhỏ vào thẻ Scrollview của bạn nằm trong tệp xml của bạn. Đó là

android:isScrollContainer="false"

Chúc may mắn!


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

Đây là một trong những làm việc cho tôi.


2

Đối với Chế độ xem cuộn:

nếu sau khi thêm android:windowSoftInputMode="stateHidden|adjustPan"vào Bản kê khai Android của bạn mà vẫn không hoạt động.

Nó có thể bị ảnh hưởng vì khi bàn phím xuất hiện, nó sẽ ở chế độ xem cuộn và nếu nút / bất kỳ đối tượng nào của bạn không nằm trong chế độ xem cuộn của bạn thì các đối tượng sẽ theo bàn phím và di chuyển vị trí của nó.

Kiểm tra xml của bạn nơi nút của bạn và đảm bảo rằng nó nằm trong khung Xem cuộn của bạn và không nằm ngoài nó.

Hy vọng điều này sẽ giúp ra. : D


2

Trong trường hợp của tôi, tôi cần bàn phím bị ẩn và ngay sau khi nhấp vào nút, bố cục của tôi cần được điều chỉnh, vì vậy tôi chỉ cần thêm lệnh này trong tệp kê khai và nó đã siêu đúng.

android:windowSoftInputMode="stateHidden|adjustResize"

2

Khi bạn muốn ẩn xem khi mở bàn phím.

Thêm phần này vào Activity của bạn trong tệp kê khai

android:windowSoftInputMode="stateHidden|adjustPan"

2

Không ai trong số họ làm việc cho tôi, hãy thử cái này

 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

Cửa sổ chính của hoạt động sẽ không thay đổi kích thước để nhường chỗ cho bàn phím mềm. Thay vào đó, nội dung của cửa sổ sẽ được tự động mở để tiêu điểm hiện tại không bao giờ bị che khuất bởi bàn phím và người dùng luôn có thể thấy những gì họ đang gõ.

android:windowSoftInputMode="adjustPan"

Đây có thể là một giải pháp tốt hơn cho những gì bạn muốn.


1

Hãy thử sử dụng cái này:

android:windowSoftInputMode="stateHidden|adjustPan"

1

Mã này có thể giúp bạn. Sử dụng nó trong oncreatephương pháp của bạn .

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

Tôi đã thử điều này nhưng tôi gặp vấn đề trong đó chế độ xem cắt bỏ một chút phần dưới cùng của chế độ xem và đẩy chế độ xem để che lấp thời gian ở trên? Bất kỳ ý tưởng về những gì thay đổi bố trí hoặc những gì cần thiết? stackoverflow.com/questions/39909897/
Mạnh

1

Bao gồm trong tệp kê khai của bạn trong hoạt động mà bạn muốn hiển thị. Nhưng hãy đảm bảo không sử dụng Hoạt động toàn màn hình

android:windowSoftInputMode="adjustPan"

1

@manifest trong hoạt động của bạn:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

1

Tôi đã giải quyết vấn đề của mình bằng cách thêm

 android:windowSoftInputMode="adjustNothing" 

Trong tệp kê khai thêm.

và làm cho ràng buộc Recyclerviews isScrollContainer thành false.

android:isScrollContainer="false"
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.