Android: ฉันจะป้องกันไม่ให้แป้นพิมพ์นุ่มผลักดันมุมมองของฉันได้อย่างไร


386

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

มีใครอีกที่เจอปัญหานี้ไหม รู้วิธีการแก้ไขหรือไม่


1
สวัสดีฉันมีปัญหาเดียวกันกับที่ธงคุณใช้ในไฟล์รายการคุณช่วยฉันด้วยได้ไหม
Nixit Patel

1
คำถามนี้มีการทำซ้ำที่นี่: stackoverflow.com/questions/5516216/…
WonderWorker

คำตอบ:


656

คุณก็สามารถเปลี่ยนกิจกรรมของwindowSoftInputModeธงadjustPanของคุณในAndroidMainfest.xmlแฟ้มที่อยู่ภายในแท็กกิจกรรมของคุณ

ตรวจสอบเอกสารอย่างเป็นทางการสำหรับข้อมูลเพิ่มเติม

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

43
ฉันไม่ต้องการให้มุมมองการแพนฉันต้องการให้มันคงที่มันอยู่ที่ไหนและเพียงแค่มีแป้นพิมพ์ครอบคลุมสิ่งที่มันจะปกปิด
Christopher Perry

5
การแพนหมายถึงมุมมองนั้นจะถูกเลื่อนเพื่อให้มองเห็นมุมมองที่คุณกำลังพิมพ์อยู่ กล่าวอีกนัยหนึ่งหากแป้นพิมพ์ที่ปรากฏไม่ได้ครอบคลุมมุมมองที่มุ่งเน้นจะยังคงอยู่
Alexander Oleynikov

18
ฉันกำลังเผชิญกับปัญหาเดียวกัน ทำให้ windowSoftInputMode ตั้งค่าสถานะเป็น "adjustPan" ในไฟล์ manifeast แต่ไม่ทำงาน วิธีแก้ปัญหา
Subrat

20
ไม่ช่วยในกรณีของฉันมีแถวของปุ่มที่ด้านล่างของหน้าจอและ ScrollView เหนือพวกเขา ปุ่มถูกกดขึ้นไม่ว่าค่าใดจะอยู่ใน windowSoftInputMode
Artem Russakovskii

3
ไม่ทำงานในส่วน ทำอย่างไรในส่วน?
Prashanth Debbadwar

175

ไม่มีคำตอบใดที่เหมาะกับฉัน แต่สิ่งนี้ได้หลอกลวง:

android:windowSoftInputMode="adjustNothing"

6
สิ่งนี้ทำให้แป้นพิมพ์ปรากฏเนื้อหาที่ซ้อนทับโดยไม่ทำให้โครงร่างคำนวณใหม่ความสูง
เพิ่มอีก

13
สิ่งนี้จะช่วยแก้ปัญหาของคีย์บอร์ดที่ผลักดันเนื้อหาให้สูงขึ้นซึ่งเป็นสิ่งที่ฉันและ OP ต้องการที่จะประสบความสำเร็จ
Daniel Douglas

8
การยืมจาก @Dom คุณสามารถใช้getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);เพื่อตั้งค่านี้โดยทางโปรแกรม
Bron Davies

1
อันนี้ใช้ได้ผลกับฉันไม่เหมือนคำตอบอื่น ๆ (jelly bean 4.1)
Virus721

ที่สมบูรณ์แบบ! มันยังทำงานในกรณีของฉัน ฉันกำลังแสดงกล่องโต้ตอบที่มี edittext อยู่ข้างใน ทันทีที่เปิดกล่องโต้ตอบแป้นพิมพ์ก็ปรากฏขึ้น ฉันได้ลอง "adjustPan" แต่มันปิดกั้นแป้นพิมพ์ปรากฏขึ้นคุณสมบัติ ดังนั้น "adjustNothing" จึงทำงานได้ดีขึ้นในกรณีของฉัน
sembozdemir

85

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

ผมสามารถที่จะหลีกเลี่ยงแถวด้านล่างของฉันของปุ่มได้รับการผลักดันขึ้นโดยแป้นพิมพ์อ่อนโดยการตั้งค่าandroid:isScrollContainer="false"ในScrollViewที่ตั้งอยู่บนปุ่ม


2
แต่ในกรณีนี้คีย์บอร์ดนุ่มครอบคลุมบางส่วนของหน้าจอและไม่มีทางเลื่อนลง ดูเหมือนว่ามีเพียงวิธีหนึ่งที่จะป้องกันไม่ให้แผงด้านล่างจะแสดงขึ้นที่ด้านบนของคีย์บอร์ด - ซ่อนมันเมื่อแป้นพิมพ์จะเปิด ...
Dmitry

1
นี่ไง! การตั้งค่านี้เป็นความคิดของฉันที่น่าสนใจมากที่จะพูดตามเป็นวิธีเดียวที่ฉันได้พบเพื่อให้บรรลุผลของทรัพย์สินที่ขาดหายไป "adjustNothing"!
rupps

ฉันจะใช้มันกับ TextView ทำงาน TNX ดี
นิล Chaudhary

2
@Artem Russakovskii ฉันไม่รู้ว่าคุณเป็นใคร แต่ฉันรักคุณสำหรับวิธีการแก้ปัญหานี้ ขอบคุณมาก.
เลฟ

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

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 คุณพูดถูก! นี่เป็นโซลูชันที่กำหนดเองที่ฉันใช้สำหรับปัญหาของฉันเอง
เปโตร

7
เฮ้นี่ยอดเยี่ยมมาก อย่างไรก็ตามอินสแตนซ์ของแป้นพิมพ์ถูกปิดมีระยะเวลาสั้น ๆ (มิลลิวินาที) ที่มุมมองถูกเปลี่ยนเป็นมองเห็นได้ ดังนั้นแทนที่จะตั้งค่าการมองเห็นโดยตรงฉันใช้view.post(Runnable runnable)และตั้งค่าการมองเห็นจากที่นั่น มันกลับกลายเป็นสิ่งที่ดีสำหรับฉัน
daisura99

9

เพียงบรรทัดเดียวที่จะเพิ่ม ...

เพิ่มในกิจกรรมที่คุณต้องการandroid:windowSoftInputMode="stateHidden|adjustPan"manifest file

ฉันเพิ่งได้รับการแก้ไข :) :)


8

สำหรับผู้ใช้ xamarin ให้เพิ่มรหัสนี้ในแอตทริบิวต์กิจกรรมของคลาส MainActivity

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

หรือคุณสามารถเพิ่มรหัสนี้Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)ไปยังวิธี OnCreate ของคลาส MainActivity



7

จนถึงตอนนี้คำตอบก็ไม่ได้ช่วยฉันเพราะฉันมีปุ่มและฟิลด์ textInput (เคียงข้างกัน) ใต้ textView ซึ่งถูกซ่อนอยู่โดยคีย์บอร์ด แต่สิ่งนี้ได้แก้ไขปัญหาของฉันแล้ว:

android:windowSoftInputMode="adjustResize"

7

เพิ่มรหัสต่อไปนี้ไปที่ 'กิจกรรม' ของไฟล์ Manifest

android:windowSoftInputMode="adjustResize"

มันใช้งานได้ดี อย่างไรก็ตามเพียงเพื่อให้คำแนะนำมันไม่ทำงานได้ดีเมื่อคุณใช้เปอร์เซ็นต์ เพราะมันปรับองค์ประกอบบางอย่าง ดังนั้นถ้าคุณมีองค์ประกอบข้อ จำกัด ที่มีเปอร์เซ็นต์คุณจะมีปัญหา ใช้ wrap_content แทนและมันจะทำงานได้ดีมาก
Thiago Silva



4

ฉันได้ดูคำตอบเหล่านี้แล้ว แต่ในกรณีของฉันฉันพบปัญหาเดียวกันและหลบภัยผ่านโซลูชันที่มีประโยชน์และง่ายที่สุดที่เกี่ยวข้องกับการใส่แอตทริบิวต์ผู้บริสุทธิ์น้อยมากในแท็ก Scrollview ที่อยู่ในไฟล์ xml ของคุณ นั่นคือ

android:isScrollContainer="false"

โชคดี!



2

สำหรับการเลื่อนดู:

ถ้าหลังจากเพิ่มandroid:windowSoftInputMode="stateHidden|adjustPan"ในรายการ Android ของคุณและยังคงไม่ทำงาน

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

ตรวจสอบ xml ของคุณว่าปุ่มของคุณอยู่ที่ไหนและตรวจสอบให้แน่ใจว่าอยู่ภายใต้วงเล็บมุมมองการเลื่อนของคุณและไม่ออก

หวังว่านี่จะช่วยได้ : D


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

รวมไว้ในไฟล์ Manifest ของคุณภายใต้กิจกรรมที่คุณต้องการแสดง แต่อย่าใช้กิจกรรมเต็มหน้าจอ

android:windowSoftInputMode="adjustPan"


1

ฉันแก้ไขปัญหาด้วยการเพิ่ม

 android:windowSoftInputMode="adjustNothing" 

ในรายการไฟล์เพิ่ม

และทำให้ข้อ จำกัด ของ Recyclerviews isScrollContainer เป็นเท็จ

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