เลื่อนหน้าเมื่อซอฟต์คีย์บอร์ดโผล่ขึ้นมา


100

ฉันมี<ScrollView>เค้าโครง:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_scrollview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/input_one"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_two"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_three"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

          <Button
            android:id="@+id/ok_btn"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="20dp"
            android:text="@string/ok_str" />

      </LinearLayout>
</ScrollView>

ดังที่คุณเห็นด้านบนการจัดวางแบบเรียบง่ายประกอบด้วยช่องป้อนข้อมูลสามช่องและปุ่ม "ตกลง"

ฉันเรียกใช้แอปด้วยเค้าโครงด้านบนเมื่อฉันแตะที่ช่องป้อนข้อมูลที่ 1 ( @+id/input_one) แป้นพิมพ์แบบนิ่มจะปรากฏขึ้นจากด้านล่างของหน้าจอโดยจะซ่อนช่องป้อนข้อมูลที่ 3 และปุ่ม "ตกลง"

ตั้งแต่ฉันใช้<ScrollView>ฉันคิดว่าฉันสามารถเลื่อนหน้าขึ้นเพื่อดูช่องป้อนข้อมูลที่ 3 และปุ่ม "ตกลง" ซึ่งซ่อนอยู่โดยแป้นพิมพ์แบบนิ่มแต่หน้านั้นไม่สามารถเลื่อนได้ ทำไม? จะกำจัดได้อย่างไร? โดยพื้นฐานแล้วฉันต้องการเห็นทุกช่องป้อนข้อมูลและปุ่ม "ตกลง" แม้แต่แป้นพิมพ์แบบนิ่มก็โผล่ขึ้นมา


1
ลบ <ScrollView> LinearLayout ควรเป็นเลย์เอาต์ภายนอกของคุณมันจะใช้งานได้ฉันหวังว่าแม้ว่าซอฟคีย์บอร์ดจะปรากฏขึ้นก็ตาม
Abid A. Chaudhary

1
@pakshaheen นั่นจะไม่สามารถแก้ไขปัญหาได้เมื่อต้องใช้ scrollview
Luten

นี่คือรหัสการทำงาน stackoverflow.com/questions/7417123/…
Venkat

คำตอบ:


126

ฉันแก้ไขปัญหาด้วยการกำหนดคุณลักษณะต่อไปนี้ใน<activity>การAndroidManifest.xml

android:windowSoftInputMode="adjustResize"

12
คุณไม่จำเป็นต้องมี stateVisible ที่จะทำให้คีย์บอร์ดนุ่ม ๆ ปรากฏขึ้นเมื่อเปิดตัวแอพแม้ว่าผู้ใช้จะไม่ได้มุ่งเน้นไปที่ EditText
RajV

มันเปิดแป้นพิมพ์โดยอัตโนมัติแม้ว่าจะไม่มีการแก้ไข
Mr X

37

โอเคฉันได้ค้นหาหลายชั่วโมงแล้วเพื่อหาปัญหาและฉันก็พบแล้ว

ไม่มีการเปลี่ยนแปลงใดที่ชอบfillViewport="true"หรือandroid:windowSoftInputMode="adjustResize"ช่วยฉัน

ฉันใช้ Android 4.4 และนี่เป็นข้อผิดพลาดใหญ่ :

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

อย่างไรก็ตามธีมแบบเต็มหน้าจอจะป้องกันไม่ให้ ScrollViews เลื่อนเมื่อมองเห็น SoftKeyboard

ในขณะนี้ฉันใช้สิ่งนี้แทน:

android:theme="@android:style/Theme.Black.NoTitleBar

ฉันไม่รู้วิธีกำจัดแถบระบบด้านบนพร้อมแสดงเวลาและแบตเตอรี่ แต่อย่างน้อยฉันก็มีปัญหา

หวังว่านี่จะช่วยคนอื่น ๆ ที่มีปัญหาเดียวกัน

แก้ไข:ฉันมีวิธีแก้ปัญหาเล็กน้อยสำหรับกรณีของฉันดังนั้นฉันจึงโพสต์ไว้ที่นี่ :

ฉันไม่แน่ใจว่าวิธีนี้จะได้ผลสำหรับคุณหรือไม่ แต่จะช่วยให้คุณเข้าใจและเคลียร์บางสิ่งได้อย่างแน่นอน

แก้ไข 2: นี่เป็นอีกหนึ่งหัวข้อที่ดีที่จะช่วยให้คุณไปในทิศทางที่ถูกต้องหรือแม้แต่แก้ปัญหาของคุณ


+1 ในกรณีของฉันแถบสถานะถูกซ่อนโดย lib ของบุคคลที่สามในรหัส: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
de.

@qweret ถ้าต้องการทั้งคู่ล่ะ? เต็มหน้าจอและเลื่อน
สรรเสริญ

@Prabs คุณพบวิธีแก้ปัญหาหรือไม่? ฉันยังต้องการทั้งแบบเต็มหน้าจอและแบบเลื่อน
Johny

@Johny Nope. ตอนนี้ฉันใช้แบบเต็มหน้าจอสำหรับทั้งแอปยกเว้นกิจกรรมนั้นด้วยการเลื่อน 3
สรรเสริญ

@Prabs ทางออกเดียวที่ฉันคิดว่ามีแถบสถานะโปร่งใส แต่ในกรณีของฉันมีปัญหาเพราะฉันต้องการรองรับ API> = 16 คุณมีความคิดหรือไม่?
Johny

21

สำหรับฉันสิ่งเดียวที่ได้ผลคือใส่ในกิจกรรมในรายการ atribute นี้:

android:windowSoftInputMode="stateHidden|adjustPan"

เพื่อไม่แสดงแป้นพิมพ์เมื่อเปิดกิจกรรมและอย่าวางซ้อนทับด้านล่างของมุมมอง


14

ใส่สิ่งนี้ไว้ใน Manifest ของคุณเช่นนี้ในโหมดไม่มีเต็มหน้าจอ

android:windowSoftInputMode="stateVisible|adjustPan" 

ในรายการของคุณ

<activity
    android:windowSoftInputMode="stateVisible|adjustPan"
    android:name="com.example.patronusgps.MainActivity"
    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
ฉันได้ลองสิ่งนี้แล้ว แต่โชคดีไม่มีโชคเลย ... อย่างไรก็ตามมุมมองรูทไม่ใช่ a ScrollViewแต่RelativeLayoutมีLinearLayoutซึ่งมี aScrollView
James Heald

11

ในคุณสมบัติManifestกำหนดของคุณwindowSoftInputMode:

<activity android:name=".MyActivity"
          android:windowSoftInputMode="adjustNothing">

2
@JacobRas โปรดตรวจสอบลิงค์นี้: developer.android.com/reference/android/… มีค่า "adjustmentNothing" :)
Mohammad Ersan

2
ฉันมีปัญหาเหมือนกัน แต่ scrollview ใช้ไม่ได้กับการปรับไม่มีอะไร :(
Narendra Singh

8

ตรวจสอบสิ่งนี้

<activity android:name=".Calculator"
    android:windowSoftInputMode="stateHidden|adjustResize" 
    android:theme="@android:style/Theme.Black.NoTitleBar">
</activity>


2

นอกจากนี้หากคุณต้องการทำแบบเป็นโปรแกรมเพียงเพิ่มบรรทัดด้านล่างใน onCreate ของกิจกรรม

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

1

คุณสามารถลองใช้รหัสต่อไปนี้เพื่อแก้ปัญหาของคุณ:

 <activity
     android:name=".DonateNow"
     android:label="@string/title_activity_donate_now"
     android:screenOrientation="portrait"
     android:theme="@style/AppTheme"
     android:windowSoftInputMode="stateVisible|adjustPan">
 </activity>

17
คุณควรรบกวนอธิบายว่าโค้ดของคุณทำอะไรแทนที่จะโพสต์โค้ดแบบแห้งเป็นคำตอบ
Angel Politis

0

คำตอบที่ง่ายที่สุดที่ฉันลองคือเพียงลบรหัสของคุณซึ่งทำให้กิจกรรมเต็มหน้าจอฉันมีรหัสแบบนี้ซึ่งรับผิดชอบในการทำให้กิจกรรมของฉันเต็มหน้าจอ:

ถ้า (Build.VERSION.SDK_INT> = Build.VERSION_CODES.KITKAT) {

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

ฉันเพิ่งลบรหัสของฉันและมันใช้งานได้ดีอย่างสมบูรณ์แม้ว่าคุณต้องการบรรลุสิ่งนี้ด้วยเต็มหน้าจอคุณจะต้องลองใช้วิธีอื่น

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