Di chuyển bố trí lên khi bàn phím mềm được hiển thị?


139

Tôi có một vài thành phần trong RelativeView với bộ thuộc tính dưới cùng căn chỉnh, khi bàn phím mềm xuất hiện các yếu tố được ẩn bởi bàn phím mềm.

Tôi muốn họ di chuyển lên để nếu có đủ không gian màn hình, chúng được hiển thị phía trên bàn phím hoặc để làm cho phần phía trên bàn phím có thể cuộn để người dùng vẫn có thể nhìn thấy các yếu tố.

Bất kỳ ý tưởng về cách tiếp cận này?


Tham khảo cập nhật từ blog của nhà phát triển Android
Jayabal

@Dinedal Làm thế nào để bạn đặt thuộc tính dưới cùng với RelativeView?
KJEjava48

Câu trả lời:



95

Bạn cũng có thể sử dụng mã này trong onCreate()phương thức:

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

11
Đối với tôi ngay cả khi tôi đặt điều chỉnhPren screnn chỉ di chuyển đến văn bản chỉnh sửa tôi đã nhấp nhưng không phải toàn bộ bố cục
murt


22

Thay đổi hoạt động của tệp Bản kê khai của bạn như

windowSoftInputMode="adjustResize"

HOẶC LÀ

Thay đổi onCreate()phương thức của bạn trong lớp hoạt động như

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

11
Tại sao bạn sử dụng các cờ khác nhau?
CoolMind

Phiên bản hiện tại yêu cầu tiền tố android: android: windowSoftInputMode = "điều chỉnh kích thước"
Andrea Leganza

21

vấn đề tương tự tôi đã phải đối mặt với bố cục của tôi bao gồm chế độ xem cuộn bên trong. Bất cứ khi nào tôi cố gắng chọn văn bản trong EditText, thanh hành động Sao chép / Cắt / Dán sẽ được di chuyển lên với mã bên dưới vì nó không thay đổi kích thước bố cục

android:windowSoftInputMode="adjustPan"

Bằng cách sửa đổi nó như dưới đây

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) tệp style.xml, theo kiểu hoạt động

<item name="android:windowActionBarOverlay">true</item>

Nó đã làm việc.!!!!!!!!!!!!


18

Trong AndroidManifest.xml, đừng quên đặt:

 android:windowSoftInputMode="adjustResize"

và đối với RelativeLayout bên trong ScrollView, hãy đặt:

 android:layout_gravity="center" or android:layout_gravity="bottom" 

mọi thứ sẽ ổn thôi


android: layout_gravity = "centre" đã hoạt động, cảm ơn! :) bây giờ EditText di chuyển trên bàn phím như tôi muốn
Pavel Biryukov

11

cho Hoạt động trong chèn methode được kích hoạt bên dưới dòng

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

và cho các đoạn trong phương thức onCreate của nó

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

10

Có 3 bước để làm theo để cuộn màn hình lên.

  1. Viết vào tệp kê khai cho hoạt động của bạn:

android: windowSoftInputMode = "điều chỉnh kích thước"

  1. Thêm dòng sau vào phương thức oncreate () của hoạt động của bạn

getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. Sau đó đặt toàn bộ chế độ xem của bạn trong "Scrollview" trong tệp XML như:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

PS Đừng quên thêm android: layout_gravity = "centre" trong bố cục tương đối.


6

Tôi đã thử một phương pháp của Diego Ramírez, nó hoạt động. Trong AndroidQuản lý:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

Trong Activity_main.xml:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>

6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

Thêm NestedScrollView xung quanh bố cục mà bạn muốn cuộn, điều này sẽ hoạt động hoàn hảo


3

Tôi đã tìm thấy một giải pháp cho vấn đề của mình rằng nó khá giống với vấn đề của bạn.

Trước hết, tôi chỉ có một linearLayout với 2 yếu tố, ImageView và linearLayout chứa 2 EditText và một Nút, vì vậy tôi cần giữ chúng tách biệt trong toàn màn hình mà không cần bàn phím và khi bàn phím xuất hiện, chúng sẽ nhìn gần hơn.

Vì vậy, tôi đã thêm chế độ xem giữa chúng với thuộc tính height trong 0dp và weight 1, điều đó cho phép tôi giữ các chế độ xem của mình tách biệt nhau. và khi bàn phím xuất hiện, vì chúng không có chiều cao cố định, chúng chỉ thay đổi kích thước và giữ nguyên khía cạnh.

Voila! Bố cục thay đổi kích thước và khoảng cách giữa các chế độ xem của tôi là như nhau khi bàn phím có hoặc không có.


6
Tại sao bạn không đăng mã, để hiểu rõ hơn?
johnkarka

Tôi đã đăng một mã mẫu ở trên: stackoverflow.com/a/31994697/2914140 .
CoolMind

bạn có thể đạt được điều này theo cách ít hack hơn bằng cách sử dụng ConstraintLayoutvà ghim phần trên cùng lên trên và phần dưới cùng ở dưới cùng. Khi bàn phím mở, nó sẽ tự động thay đổi kích thước bằng cách nén khoảng trống ở giữa (nếu bạn sử dụng adjustResize)
hmac

2
If user want this task using manifest then add this line in manifest
In manifest add this line: - android:windowSoftInputMode="adjustPan"
    e.g.
     <activity
           android:name=".ui.home.HomeActivity"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="adjustPan">
     </activity>


    In Java File or Kotlin File(Programically) : - If user want this using Activity then add below line in onCreate Method

    activity!!.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Xin chào và chào mừng bạn đến với stackoverflow, và cảm ơn bạn đã trả lời. Thay vì chỉ đăng một khối mã, bạn có thể giải thích ngắn gọn về vấn đề bạn đã giải quyết và cách bạn giải quyết nó không? Điều này sẽ giúp những người tìm thấy câu hỏi này trong tương lai để hiểu rõ hơn về vấn đề và cách giải quyết nó.
Plutian

1

Đây là mã kê khai đầy đủ

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

1

nếu bạn bị phân mảnh thì bạn phải thêm đoạn mã dưới đây vào onCreate cho hoạt động của mình, nó giải quyết vấn đề cho tôi

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

1

Trong tệp kê khai của bạn thêm dòng dưới đây. Nó sẽ làm việc

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>

1

Tôi vừa thêm dòng sau vào bố cục cấp cao nhất và mọi thứ đã hoạt động:

android:fitsSystemWindows="true"

@ yash786 có thể hiển thị nút bên dưới edittext có nhận được trọng tâm không? Câu hỏi thứ hai bạn có thể chia sẻ cho bạn tập tin bố cục hoặc trả lời tôi làm thế nào bạn thêm edittext vào đầu keybord không?
Heroes84

nó hoạt động cho tôi sự kiện mà không cần android: windowSoftInputMode = "stateVisible | điều chỉnhResize"
zoom

0

Được rồi, điều này rất muộn tuy nhiên tôi đã phát hiện ra rằng nếu bạn thêm Chế độ xem Danh sách dưới văn bản chỉnh sửa của mình thì bàn phím sẽ di chuyển tất cả các bố cục dưới edittext đó mà không di chuyển ListView

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

Đây là giải pháp duy nhất làm việc cho tôi.


0

Không một lời khuyên nào giải quyết vấn đề của tôi. Điều chỉnh Pan gần giống như công việc Điều chỉnh thay đổi kích thước . Nếu tôi đặt Điều chỉnh Không có gì ngoài bố cục không di chuyển lên nhưng nó ẩn phần dưới của tôi mà tôi đang viết chính xác. Vì vậy, sau 24 giờ tìm kiếm liên tục, tôi đã tìm thấy nguồn này và nó giải quyết vấn đề của tôi.

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.