ฉันจะวางแนวหน้าจอปัจจุบันได้อย่างไร


190

ฉันต้องการตั้งค่าสถานะบางอย่างเมื่อการวางแนวของฉันอยู่ในแนวนอนเพื่อให้เมื่อกิจกรรมถูกสร้างใหม่ใน onCreate () ฉันสามารถสลับระหว่างสิ่งที่ต้องโหลดในแนวตั้งและแนวนอน ฉันมีเลย์เอาต์ xml ที่จัดการเลย์เอาต์ของฉันอยู่แล้ว

public void onConfigurationChanged(Configuration _newConfig) {

        if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            this.loadURLData = false;
        }

        if (_newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            this.loadURLData = true;
        }

        super.onConfigurationChanged(_newConfig);
    }

การกำหนดค่าที่มากกว่าการขี่เกินจะป้องกันไม่ให้ xml ของเค้าโครงที่ดินของฉันโหลดในแนวนอน

ฉันแค่ต้องการวางแนวปัจจุบันของอุปกรณ์ของฉันใน onCreate () ฉันจะได้รับสิ่งนี้ได้อย่างไร

คำตอบ:


475
Activity.getResources().getConfiguration().orientation

8
สิ่งนี้มีเพียงสองค่า ORIENTATION_PORTRAIT และ ORIENTATION_LANDSCAPE มีวิธีรับค่าทั้งสี่จาก ActivityInfo หรือไม่ (นั่นคือ LANDSCAPE_REVERSE และ PORTRAIT_REVERSE เช่นกัน)
HRJ

18
@HRJ คุณสามารถใช้ getWindowManager (). getDefaultDisplay (). getRotation ()
MKJParekh

24
getWindowManager (). getDefaultDisplay (). getRotation () คืนค่าการหมุนโดยอ้างอิงการวางแนว "ธรรมชาติ" ของหน้าจอเช่นสำหรับแท็บเล็ตมันจะส่งคืน Surface.ROTATION_0 ในโหมดแนวนอนในขณะที่โทรศัพท์มือถือจะคืนค่าเดียวกันสำหรับ ภาพเหมือน
Zoltán

65
int orientation = this.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    // code for portrait mode
} else {
    // code for landscape mode
}

เมื่อซูเปอร์คลาสของthisคือContext


28

ในบางอุปกรณ์void onConfigurationChanged()อาจมีปัญหา ผู้ใช้จะใช้รหัสนี้เพื่อรับการวางแนวหน้าจอปัจจุบัน

public int getScreenOrientation()
{
    Display getOrient = getActivity().getWindowManager().getDefaultDisplay();
    int orientation = Configuration.ORIENTATION_UNDEFINED;
    if(getOrient.getWidth()==getOrient.getHeight()){
        orientation = Configuration.ORIENTATION_SQUARE;
    } else{ 
        if(getOrient.getWidth() < getOrient.getHeight()){
            orientation = Configuration.ORIENTATION_PORTRAIT;
        }else { 
             orientation = Configuration.ORIENTATION_LANDSCAPE;
        }
    }
    return orientation;
}

และการใช้งาน

if (orientation==1)        // 1 for Configuration.ORIENTATION_PORTRAIT
{                          // 2 for Configuration.ORIENTATION_LANDSCAPE
   //your code             // 0 for Configuration.ORIENTATION_SQUARE
}

1
โปรดทราบว่า getOrient.getWidth () และ getOrient.getHeight () เลิกใช้แล้วในขณะนี้
valerybodak

ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้องตามที่เป็นรายละเอียดมากขึ้น
Zapnologica

1
ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้องและทำงานได้ดีที่สุดในทุกสภาวะ แต่โปรดทราบว่าผู้ใช้ anivaler พูดว่า getActivity (). getWindowManager (). getDefaultDisplay (). getWidth () และ getHeight () เลิกใช้แล้ว โปรดใช้ getSize (จุดเกินมาตรฐาน) มันสามารถใช้เป็นผ่านวัตถุจุดใหม่และที่จะได้รับสมาชิก x และ y
Mahendra Chhimwal

เช่น Point outSize = new point (); getOrient.getSize (outSize) ถ้า (outSize.x == outSize.y) ส่งคืน SQUARE;
Mahendra Chhimwal

คิดว่าฉันจะชี้ให้เห็นว่า Configuration.ORIENTATION_SQUARE นั้นเลิกใช้แล้วและในขณะที่มันอาจถูกกำหนดเป็น 0 ในปี 2013 มันถูกกำหนดเป็น 3 ในขณะที่ Configuration.ORIENTIATION_UNDEFINED ถูกกำหนดเป็น 0 ไชโย
เดฟ

26
int rotation =  getWindowManager().getDefaultDisplay().getRotation();

สิ่งนี้จะทำให้การวางแนวทั้งหมดเหมือนปกติและกลับด้าน

และจัดการเหมือน

int angle = 0;
switch (rotation) {
    case Surface.ROTATION_90:
        angle = -90;
        break;
    case Surface.ROTATION_180:
        angle = 180;
        break;
    case Surface.ROTATION_270:
        angle = 90;
        break;
    default:
        angle = 0;
        break;
}

final int angle = (rotation == Surface.ROTATION_90) ? 90 : (rotation == Surface.ROTATION_180) ? 180 : (rotation == Surface.ROTATION_270) ? 270 : 0;
Andrey Syrokomskiy

12
getActivity().getResources().getConfiguration().orientation

คำสั่งนี้ส่งคืนค่า int 1 สำหรับแนวตั้งและ 2 สำหรับแนวนอน


4

ในกรณีที่ทุกคนต้องการที่จะได้รับมีความหมายคำอธิบายการปฐมนิเทศ (เช่นเดียวกับที่ส่งผ่านไปonConfigurationChanged(..)กับคนreverseLandscape, sensorLandscapeและอื่น ๆ ) ให้ใช้เพียงgetRequestedOrientation()


1

ในคลาสกิจกรรมของคุณใช้วิธีการด้านล่าง:

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

            setlogo();// Your Method
            Log.d("Daiya", "ORIENTATION_LANDSCAPE");

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

            setlogoForLandScape();// Your Method
            Log.d("Daiya", "ORIENTATION_PORTRAIT");
        }
    }

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

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

นั่นคือทั้งหมด !!


0

ถ้าคุณต้องการแทนที่เมธอด onConfigurationChanged และยังต้องการให้ทำสิ่งพื้นฐานให้พิจารณาใช้ super.onConfigyrationChanged () เป็นคำสั่งแรกในเมธอด overriden


0

ฉันแค่ต้องการเสนอทางเลือกอื่นที่จะเกี่ยวข้องกับคุณบางคน:

android:configChanges="orientation|keyboardHidden" 

หมายความว่าเราประกาศรูปแบบที่จะฉีดอย่างชัดเจน

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

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        getSupportActionBar().hide();

    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        getSupportActionBar().show();
    }

ที่นี่เราจะแสดงหรือไม่แถบการกระทำขึ้นอยู่กับทิศทางของโทรศัพท์

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