ฉันจะระบุเค้าโครงที่แตกต่างกันสำหรับแนวตั้งและแนวนอนได้อย่างไร


142

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

เป็นไปได้หรือไม่ที่จะระบุรูปแบบที่แตกต่างกันสำหรับขนาดหน้าจอที่แตกต่างกัน? ถ้าเป็นเช่นนั้นจะทำอย่างไร?

คำตอบ:


203

สร้างlayout-landไดเรกทอรีและวางเวอร์ชันแนวนอนของไฟล์ XML เลย์เอาต์ของคุณในไดเรกทอรีนั้น


3
นั่นหมายความว่ากิจกรรมทั้งหมดจำเป็นต้องกำหนดทั้งแนวนอนและแนวตั้งหากฉันทำสิ่งนี้?
Jay Askren

20
ไม่ถ้าไม่มีการกำหนดที่ดิน - ที่ดินมันแค่ใช้เค้าโครง XML ในไดเรกทอรีเค้าโครงมาตรฐาน
Mark B

ในกรณีของฉันเลย์เอาต์แลนด์ไม่ทำงานเมื่อฉันใช้, android: configChanges = "การวางแนว | keyboardHidden | screenSize"
Tushar Pandey

9
ลบการวางแนวจาก Android: configChanges = "การวางแนว | keyboardHidden | screenSize"
Ushal Naidoo

60

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

ข้อมูลเพิ่มเติมที่นี่:

http://developer.android.com/guide/practices/screens_support.html

ภายใต้ "ตัวระบุไดเรกทอรีทรัพยากรสำหรับขนาดหน้าจอและความหนาแน่น"


ใช้งานได้กับระบบปฏิบัติการเวอร์ชัน 1.6 ขึ้นไปเท่านั้น หากคุณต้องการสนับสนุน 1.5 คุณต้องมีลิงค์นี้: developer.android.com/guide/practices/screens-support-1.5.html
Scott Biggs

2
@Silvio Donnini - ลิงก์ไม่มีข้อมูลที่จำเป็นอีกต่อไป
itsaboutcode

2
@itsaboutcode ใช่: ลงไปที่ "กำลังใช้ตัวระบุการกำหนดค่า"
Danation

27

สำหรับคนรักเม้าส์! ฉันว่าคลิกขวาที่โฟลเดอร์ทรัพยากรและAdd new resource fileและจากตัวระบุที่มีให้เลือกorientation:

ป้อนคำอธิบายรูปภาพที่นี่


แต่คุณยังสามารถทำได้ด้วยตนเองโดยเพิ่มโฟลเดอร์ย่อย "layout-land" ลงใน

"คุณโครงการไดเรกทอรี \ แอป \ src \ Main \ Res"

ตั้งแต่นั้นไฟล์ layout.xml ใด ๆ ภายใต้โฟลเดอร์ย่อยนี้จะใช้งานได้เฉพาะในโหมดแนวนอนโดยอัตโนมัติโดยอัตโนมัติ

ใช้ "layout-port" สำหรับโหมดแนวตั้ง


1
สิ่งนี้ใช้ได้สำหรับฉัน ฉันเพิ่มไฟล์เลย์เอาต์ใหม่ตามคำแนะนำที่มีชื่อเดียวกันกับเวอร์ชั่นแนวตั้ง Android Studio สร้างโฟลเดอร์สำหรับเลย์เอาต์นั้นโดยอัตโนมัติ หนึ่งเลย์เอาต์สำหรับแนวตั้งและอีกอันสำหรับแนวนอน เลย์เอาต์ใหม่จะแสดงโดยอัตโนมัติเมื่อหมุนหน้าจอ
Smitty-Werben-Jager-Manjenson

23

เพียงเตือนความจำ:

ลบออกorientationจากandroid:configChangesแอตทริบิวต์ของกิจกรรมในxmlไฟล์รายการถ้าคุณกำหนดไว้:

android:configChanges="orientation|screenLayout|screenSize"

1
จะทำอย่างไรถ้าฉันต้องการมี Android: configChanges = "ปฐมนิเทศ | screenLayout | screenSize" ในรายการของฉันเนื่องจากชิ้นส่วนของฉันบางอย่างอาจอยู่ในทั้งการวางแนวและบางคนก็ทำไม่ได้ แต่ยังคงต้องการโครงร่างแยกต่างหาก สามารถเปลี่ยนการวางแนวแบบไดนามิก?
natansalda

9

วิธีที่เร็วที่สุดสำหรับ Android Studio 3.xx และ Android Studio 4.xx

1. ไปที่แท็บออกแบบของเค้าโครงกิจกรรม

2. ด้านบนคุณควรกดปุ่มวางแนวเพื่อดูตัวอย่างมีตัวเลือกในการสร้างเลย์เอาต์แนวนอน (ตรวจสอบรูปภาพ) โฟลเดอร์ใหม่จะถูกสร้างเป็นไฟล์เลย์เอาต์ XML ของคุณสำหรับการวางแนวนั้น

ป้อนคำอธิบายรูปภาพที่นี่


4

ฉันคิดว่าวิธีที่ง่ายที่สุดใน Android รุ่นล่าสุดคือไปที่โหมดการออกแบบของ XML (ไม่ใช่ข้อความ)

จากนั้นจากเมนูให้เลือกตัวเลือก - สร้างรูปแบบภูมิทัศน์ สิ่งนี้จะสร้างภูมิทัศน์ xml โดยไม่ต้องยุ่งยากในเวลาไม่กี่วินาที Android Studio เวอร์ชันล่าสุดช่วยให้คุณสร้างมุมมองแนวนอนได้ทันที

ป้อนคำอธิบายรูปภาพที่นี่

ฉันหวังว่าสิ่งนี้จะได้ผลสำหรับคุณ


3

สร้างไดเรกทอรีใหม่layout-landแล้วสร้างxmlไฟล์ที่มีชื่อเดียวกันใน layout-landขณะที่มันเป็นlayoutไดเรกทอรีและจัดมีเนื้อหาของคุณสำหรับโหมดแนวนอน

โปรดทราบว่า id ของเนื้อหาในทั้งสองxmlเหมือนกัน


3

บรรทัดสุดท้ายด้านล่างเป็นตัวอย่างสำหรับการใช้สองตัวนับ: หน้าจอแนวนอนและความกว้างน้อยที่สุด (600dp) อัปเดต 600dp ตามที่คุณต้องการ

res/layout/main_activity.xml                # For handsets
res/layout-land/main_activity.xml           # For handsets in landscape
res/layout-sw600dp/main_activity.xml        # For 7” tablets
res/layout-sw600dp-land/main_activity.xml   # For 7” tablets in landscape

ข้างต้นนำไปใช้กับ dimens เช่นกัน

res/values/dimens.xml                # For handsets
res/values-land/dimens.xml           # For handsets in landscape
res/values-sw600dp/dimens.xml        # For 7” tablets
res/values-sw600dp-land/dimens.xml   # For 7” tablets in landscape

ตัวชี้วัดอุปกรณ์ที่มีประโยชน์: https://material.io/tools/devices/


2

หรือใช้สิ่งนี้:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            android:scrollbars="vertical" 
            android:layout_height="wrap_content" 
            android:layout_width="fill_parent">

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

     <!-- Add your UI elements inside the inner most linear layout -->

  </LinearLayout>
</ScrollView>

0
  1. คลิกขวาที่โฟลเดอร์ res
  2. ใหม่ -> ไฟล์ทรัพยากร Android
  3. ในตัวระบุที่มีให้เลือกการวางแนว
  4. เพิ่มใน Chosen Qualifier
  5. ในการวางแนวหน้าจอเลือกแนวนอน
  6. กดตกลง

สตูดิโอที่ใช้ Android 3.4.1 จะไม่สร้างlayout-landโฟลเดอร์ มันจะสร้างโฟลเดอร์และวางไฟล์สองไฟล์ไว้ด้วยกัน

ป้อนคำอธิบายรูปภาพที่นี่


2
ไม่ถูกต้อง คุณไม่ได้ใช้โหมดมุมมองโฟลเดอร์ (เช่น "โครงการ") คุณอาจใช้โหมดมุมมอง "Android" ซึ่งจัดกลุ่มไฟล์ด้วยกันเช่นในภาพหน้าจอของคุณในโฟลเดอร์เสมือน แต่โครงสร้างโฟลเดอร์จริงยังคงเหมือนที่ทุกโพสต์อื่น ๆ ที่นี่อธิบาย
monK_
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.