Làm thế nào tôi có thể có được hướng màn hình hiện tại?


190

Tôi chỉ muốn đặt một số cờ khi hướng của tôi ở chế độ nằm ngang để khi hoạt động được tạo lại trong onCreate () tôi có thể chuyển đổi giữa những gì sẽ tải trong dọc so với ngang. Tôi đã có xml bố cục đất đang xử lý bố cục của mình.

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);
    }

Việc quá tải onConfigurationChanged sẽ ngăn xml bố cục đất của tôi tải theo hướng ngang.

Tôi chỉ muốn nhận định hướng hiện tại của thiết bị của mình trong onCreate (). Làm thế nào tôi có thể nhận được điều này?

Câu trả lời:


474
Activity.getResources().getConfiguration().orientation

8
Điều này chỉ cung cấp hai giá trị ORIENTATION_PORTRAIT và ORIENTATION_LANDSCAPE. Có cách nào để có được tất cả bốn giá trị từ ActivityInfo không? (Đó là LANDSCAPE_REVERSE và PORTRAIT_REVERSE)
HRJ

18
@HRJ bạn có thể sử dụng getWindowManager (). GetDefaultDisplay (). GetRotation ()
MKJParekh

24
getWindowManager (). getDefaultDisplay (). getRotation () trả về phép quay với tham chiếu đến hướng "tự nhiên" của màn hình, tức là đối với máy tính bảng, nó sẽ trả về Surface.ROTATION_0 ở chế độ ngang, trong khi đối với điện thoại di động, nó sẽ trả về cùng giá trị cho Chân dung.
Zoltán

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

Khi cha của thisContext


28

Trong một số thiết bị void onConfigurationChanged()có thể sụp đổ. Người dùng sẽ sử dụng mã này để có được hướng màn hình hiện tại.

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;
}

Và sử dụng

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

1
Xin lưu ý rằng getOrient.getWidth () và getOrient.getHeight () không được dùng nữa.
valerybodak

Nên được đánh dấu là câu trả lời chính xác như cách chi tiết hơn
Zapnologica

1
Nên được đánh dấu là câu trả lời đúng và hoạt động tốt nhất trong mọi điều kiện. Nhưng xin lưu ý như anivaler đã nói getActivity (). GetWindowManager (). GetDefaultDisplay (). GetWidth () và getHeight () không được dùng nữa. Vui lòng sử dụng getSize (Điểm ngoài). Nó có thể được sử dụng như là vượt qua đối tượng điểm mới và điều đó sẽ nhận được các thành viên x và y của nó.
Mahendra Chhimwal

như Point outSize = điểm mới (); getOrient.getSize (outSize); if (outSize.x == outSize.y) trả về SQUARE;
Mahendra Chhimwal

Tôi nghĩ rằng tôi sẽ chỉ ra rằng Cấu hình.ORIENTATION_SQUARE không được dùng nữa và trong khi nó có thể được định nghĩa là 0 vào năm 2013, thì nó được định nghĩa là 3, trong khi Cấu hình.ORIENTIATION_UNDEFINED được định nghĩa là 0. Chúc mừng.
Dave

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

điều này sẽ cho tất cả các định hướng như bình thường và đảo ngược

và xử lý nó như thế nào

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

lệnh này trả về giá trị int 1 cho Portrait và 2 cho Cảnh


4

Trong trường hợp bất kỳ ai cũng muốn có được mô tả định hướng có ý nghĩa (giống như được truyền cho onConfigurationChanged(..)những người đó reverseLandscape, sensorLandscapev.v.), chỉ cần sử dụnggetRequestedOrientation()


1

Trong lớp hoạt động của bạn sử dụng phương pháp dưới đây:

 @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");
        }
    }

Sau đó, để tuyên bố rằng hoạt động của bạn xử lý thay đổi cấu hình, hãy chỉnh sửa phần tử thích hợp trong tệp kê khai của bạn để bao gồm android:configChangesthuộc tính với giá trị đại diện cho cấu hình bạn muốn xử lý. Các giá trị có thể được liệt kê trong tài liệu cho android:configChangesthuộc tính (các giá trị được sử dụng phổ biến nhất là "định hướng" để ngăn khởi động lại khi hướng màn hình thay đổi và "keyboardHidden" để ngăn khởi động lại khi bàn phím thay đổi). Bạn có thể khai báo nhiều giá trị cấu hình trong thuộc tính bằng cách tách chúng bằng một ống | tính cách.

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

Đó là tất cả!!


0

nếu bạn muốn ghi đè phương thức onConfigurationChanged đó và vẫn muốn nó thực hiện các công cụ cơ bản thì hãy xem xét sử dụng super.onConfigyrationChanged () làm câu lệnh đầu tiên trong phương thức overriden.


0

Tôi chỉ muốn đề xuất một lựa chọn khác sẽ liên quan đến một số bạn:

android:configChanges="orientation|keyboardHidden" 

ngụ ý rằng chúng tôi tuyên bố rõ ràng bố trí sẽ được tiêm.

Trong trường hợp chúng tôi muốn giữ tự động tiêm nhờ vào các thư mục bố trí đất và bố cục. Tất cả bạn phải làm là thêm nó vào onCreate:

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

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

Ở đây, chúng tôi hiển thị hay không thanh hành động tùy thuộc vào hướng của điện thoại

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.