ย้ายเค้าโครงขึ้นเมื่อซอฟต์คีย์บอร์ดแสดงขึ้น?


146

ฉันมีองค์ประกอบบางอย่างใน RelativeView ที่มีชุดแอตทริบิวต์จัดตำแหน่งด้านล่างเมื่อแป้นพิมพ์อ่อนขึ้นมาองค์ประกอบต่างๆจะซ่อนอยู่โดยแป้นพิมพ์อ่อน

ฉันต้องการให้พวกเขาเลื่อนขึ้นเพื่อที่ว่าหากมีพื้นที่หน้าจอเพียงพอที่จะแสดงเหนือแป้นพิมพ์หรือเพื่อให้ส่วนเหนือแป้นพิมพ์สามารถเลื่อนได้เพื่อให้ผู้ใช้ยังคงเห็นองค์ประกอบต่างๆ

มีความคิดอย่างไรกับวิธีการนี้?


อัปเดตข้อมูลอ้างอิงจากบล็อกนักพัฒนา Android
Jayabal

@Dinedal คุณจะตั้งค่าการจัดตำแหน่งแอตทริบิวต์ด้านล่างให้กับ ur RelativeView ได้อย่างไร ???
KJEjava48

คำตอบ:


109

ใช่ลองอ่านบทความนี้ในไซต์ของนักพัฒนา Androidซึ่งอธิบายถึงวิธีการที่เฟรมเวิร์กจัดการกับคีย์บอร์ดแบบนุ่มที่ปรากฏ

android:windowSoftInputModeแอตทริบิวต์สามารถนำมาใช้เพื่อระบุสิ่งที่เกิดขึ้นบนพื้นฐานต่อกิจกรรม: ไม่ว่าจะเป็นรูปแบบที่มีการปรับขนาดหรือไม่ว่าจะเลื่อน ฯลฯ


98

คุณยังสามารถใช้รหัสนี้ในonCreate()วิธีการ:

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

12
สำหรับฉันแม้ว่าฉันจะตั้งค่า adjustmentPan screnn ให้เลื่อนขึ้นไปที่ข้อความแก้ไขที่ฉันคลิกเท่านั้น แต่ไม่ใช่ทั้งเลย์เอาต์
murt


23

เปลี่ยนแปลงกิจกรรมของไฟล์ Manifest ของคุณเช่น

android:windowSoftInputMode="adjustResize"

หรือ

ทำการเปลี่ยนแปลงonCreate()วิธีการของคุณในคลาสกิจกรรมเช่น

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

11
ทำไมถึงใช้แฟล็กต่างกัน
CoolMind

เวอร์ชันปัจจุบันต้องใช้คำนำหน้า Android: android: windowSoftInputMode = "adjustmentResize"
Andrea Leganza

21

ปัญหาที่คล้ายกันที่ฉันเผชิญกับเลย์เอาต์ของฉันซึ่งประกอบด้วยมุมมองแบบเลื่อนด้านใน เมื่อใดก็ตามที่ฉันพยายามเลือกข้อความใน EditText แถบการดำเนินการคัดลอก / ตัด / วางจะเลื่อนขึ้นพร้อมกับโค้ดด้านล่างเนื่องจากไม่ได้ปรับขนาดเค้าโครง

android:windowSoftInputMode="adjustPan"

โดยปรับเปลี่ยนเป็นดังต่อไปนี้

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) ไฟล์ style.xml ในรูปแบบกิจกรรม

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

ได้ผล. !!!!!!!!!!!!


18

ใน AndroidManifest.xml อย่าลืมตั้งค่า:

 android:windowSoftInputMode="adjustResize"

และสำหรับ RelativeLayout ภายใน ScrollView ให้ตั้งค่า:

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

มันจะโอเค


android: layout_gravity = "center" ใช้งานได้ขอบคุณ! :) ตอนนี้ EditText เคลื่อนผ่านแป้นพิมพ์ตามที่ฉันต้องการ
Pavel Biryukov

11

สำหรับกิจกรรมในการสร้างการแทรกเมธอดด้านล่างบรรทัด

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

และสำหรับชิ้นส่วนในเมธอด onCreate

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

10

มี 3 ขั้นตอนในการติดตามเพื่อเลื่อนหน้าจอขึ้น

  1. เขียนในไฟล์รายการสำหรับกิจกรรมของคุณ:

android: windowSoftInputMode = "adjustmentResize"

  1. เพิ่มบรรทัดต่อไปนี้ในวิธี oncreate () ของกิจกรรมของคุณ

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

  1. จากนั้นวางมุมมองทั้งหมดของคุณใน "Scrollview" ในไฟล์ XML เช่น:
<?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>

ปล. อย่าลืมเพิ่ม android: layout_gravity = "center" ในรูปแบบสัมพัทธ์ของผู้ปกครอง


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

เพิ่ม NestedScrollView รอบ ๆ เค้าโครงที่คุณต้องการเลื่อนสิ่งนี้จะทำงานได้อย่างสมบูรณ์แบบ


6

ฉันลองใช้วิธีของ Diego Ramírezแล้วมันได้ผล ใน AndroidManifest:

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

ใน 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>

3

ฉันพบวิธีแก้ปัญหาของฉันแล้วว่ามันค่อนข้างเหมือนกับของคุณ

ก่อนอื่นฉันมีเพียง LinearLayout ที่มี 2 องค์ประกอบคือ ImageView และ LinearLayout ซึ่งมี 2 EditText และปุ่มเดียวดังนั้นฉันจึงต้องแยกมันออกจากกันในแบบเต็มหน้าจอโดยไม่มีแป้นพิมพ์และเมื่อแป้นพิมพ์ปรากฏขึ้นพวกเขาควรดูใกล้ขึ้น

ดังนั้นฉันจึงเพิ่มมุมมองระหว่างพวกเขาด้วยแอตทริบิวต์ความสูงใน 0dp และน้ำหนัก 1 ซึ่งช่วยให้ฉันแยกมุมมองของฉันออกจากกัน และเมื่อแป้นพิมพ์ปรากฏขึ้นเนื่องจากไม่มีความสูงคงที่พวกเขาก็ปรับขนาดและคงลักษณะไว้

โวลา! การปรับขนาดเค้าโครงและระยะห่างระหว่างมุมมองของฉันจะเท่ากันเมื่อแป้นพิมพ์อยู่หรือไม่อยู่


7
ทำไมคุณไม่โพสต์รหัสเพื่อความเข้าใจที่ดีขึ้น?
johnkarka

ผมโพสต์โค้ดตัวอย่างข้างต้น: stackoverflow.com/a/31994697/2914140
CoolMind

คุณสามารถบรรลุสิ่งนี้ได้อย่างแฮ็กน้อยโดยใช้ไฟล์ ConstraintLayoutและตรึงส่วนบนสุดไว้ที่ด้านบนและส่วนล่างไปที่ด้านล่าง เมื่อแป้นพิมพ์เปิดขึ้นจะปรับขนาดโดยการบีบช่องว่างตรงกลาง (ถ้าคุณใช้adjustResize)
hmac

2
  1. หากผู้ใช้ต้องการงานนี้โดยใช้รายการให้เพิ่มบรรทัดนี้ในรายการ
  2. ในรายการให้เพิ่มบรรทัดนี้: - android: windowSoftInputMode = "adjustPan" เช่น

ในไฟล์ Java หรือไฟล์ Kotlin (โดยทางโปรแกรม): - หากผู้ใช้ต้องการสิ่งนี้โดยใช้กิจกรรมให้เพิ่มบรรทัดด้านล่างใน onCreate Method

activity?.window()?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)

สวัสดีและยินดีต้อนรับสู่ stackoverflow และขอขอบคุณสำหรับคำตอบของคุณ แทนที่จะโพสต์บล็อกโค้ดคุณสามารถให้คำอธิบายสั้น ๆ เกี่ยวกับปัญหาที่คุณแก้ไขได้และจะแก้ไขอย่างไร ซึ่งจะช่วยให้ผู้ที่พบคำถามนี้ในอนาคตเข้าใจปัญหาและวิธีจัดการได้ดีขึ้น
Plutian

1

นี่คือรหัสรายการแบบเต็ม

<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

หากคุณอยู่ในส่วนย่อยคุณต้องเพิ่มรหัสด้านล่างใน onCreate ในกิจกรรมของคุณซึ่งจะช่วยแก้ปัญหาให้ฉันได้

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

1

ในไฟล์รายการของคุณให้เพิ่มบรรทัดด้านล่าง มันจะทำงาน

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

1

ฉันเพิ่งเพิ่มบรรทัดต่อไปนี้ในเลย์เอาต์ระดับบนสุดและทุกอย่างก็ใช้ได้:

android:fitsSystemWindows="true"

@ yash786 อาจแสดงปุ่มด้านล่างข้อความแก้ไขที่ได้รับโฟกัส? คำถามที่สองคุณสามารถแชร์ไฟล์เลย์เอาต์ของคุณหรือตอบฉันได้อย่างไรว่าคุณเพิ่ม edittext ด้านบนของคีย์บอร์ได้อย่างไร
Heroes84

มันใช้ได้กับฉันเหตุการณ์ที่ไม่มี android: windowSoftInputMode = "stateVisible | adjustmentResize"
ซูม

0

เอาล่ะมันสายไปแล้ว แต่ฉันได้ค้นพบว่าถ้าคุณเพิ่มมุมมองรายการใต้ข้อความแก้ไขของคุณแป้นพิมพ์จะย้ายเค้าโครงทั้งหมดภายใต้ข้อความแก้ไขนั้นโดยไม่ต้องย้าย 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**

นี่เป็นทางออกเดียวที่ใช้ได้ผลสำหรับฉัน


0

ไม่ใช่คำแนะนำเดียวที่ช่วยแก้ปัญหาของฉัน ปรับแพนเกือบจะเป็นเหมือนการทำงานปรับเปลี่ยนขนาด ถ้าฉันตั้งค่าAdjust Nothingกว่าเค้าโครงจะไม่เลื่อนขึ้น แต่จะซ่อนข้อความแก้ไขด้านล่างที่ฉันกำลังเขียนอยู่ ดังนั้นหลังจาก 24 ชั่วโมงของการค้นหาอย่างต่อเนื่องฉันพบแหล่งที่มานี้และช่วยแก้ปัญหาของฉันได้


0

อาจจะสายไป แต่ฉันต้องการเพิ่มบางอย่าง ใน Android Studio เวอร์ชัน 4.0.1 และ Gradle เวอร์ชัน 6.1.1 windowSoftInputMode จะไม่ทำงานตามที่คาดไว้หากคุณเพิ่มแฟล็กต่อไปนี้ในกิจกรรมของคุณ:

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

หลังจากเสียเวลาไปมากฉันพบว่าแฮ็ค เพื่อให้adjustResizeหรือAdjustPanหรือแอตทริบิวต์ใด ๆwindowSoftInputModeทำงานได้อย่างถูกต้องคุณต้องลบสิ่งนั้นออกจากกิจกรรมของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.