2012-02-29 34 views
18

Đây là mã giả để phát hiện sự kiện xoay màn hình và quyết định giữ lại hoặc thay đổi hướng màn hình.Android xác định hướng màn hình khi chạy

public boolean onOrientationChanges(orientation) { 
    if(orientation == landscape) 
    if(settings.get("lock_orientation")) 
     return false; // Retain portrait mode 
    else 
     return true; // change to landscape mode 

    return true; 
} 

Làm cách nào để tạo những thứ tương tự trong Android?

EDIT: Tôi đang thực sự tìm kiếm câu trả lời trên ở đâu để xử lý định hướng thay đổi. Tôi không muốn sửa định hướng bằng cách thêm screenOrientation = "portrait".

Tôi cần một cái gì đó, tương tự như onConfigurationChanges(), nơi tôi có thể xử lý hướng, nhưng không cần tôi phải vẽ lại chế độ xem theo cách thủ công.

+0

Bạn không cần phải để đánh chặn các yêu cầu và sau đó cho phép hoặc từ chối nó. Bạn có thể khóa hoặc tự do định hướng trước. Ngoài ra còn có nhiều tùy chọn hơn với phương pháp này, chẳng hạn như có cho phép xoay 180 độ khi bị khóa hay không. Vui lòng đọc câu trả lời của tôi bên dưới, thay vì câu trả lời được chọn. –

Trả lời

42

Bạn cần một ví dụ Display trước hết:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

Sau đó, định hướng có thể được gọi như thế này:

int orientation = display.getOrientation(); 

Kiểm tra định hướng như theo cách của bạn và sử dụng để định hướng thay đổi:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Tôi hy vọng nó giúp.

Cập nhật:

Được rồi, chúng ta hãy nói rằng bạn đã là một var oAllow đó là Boolean và giá trị mặc định là False.

public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
    int orientation = display.getOrientation(); 
    switch(orientation) { 
     case Configuration.ORIENTATION_PORTRAIT: 
      if(!oAllow) { 
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
      } 
      break; 
     case Configuration.ORIENTATION_LANDSCAPE: 
      if(!oAllow) { 
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
      } 
      break; 
    } 
} 

Bạn có thể thêm nhiều lựa chọn hơn.

Tôi đã không thử mẫu này, nhưng ít nhất là cho bạn biết một số manh mối về cách giải quyết. Cho tôi biết nếu bạn có bất kỳ lỗi nào.

CẬP NHẬT

getOrientation() đã bị phản đối see here. Thay vào đó hãy sử dụng getRotation().Để kiểm tra xem điện thoại đang ở chế độ phong cảnh bạn có thể làm một cái gì đó như thế này:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)) 
     .getDefaultDisplay(); 

int orientation = display.getRotation(); 

if (orientation == Surface.ROTATION_90 
     || orientation == Surface.ROTATION_270) { 
    // TODO: add logic for landscape mode here    
} 
+0

cảm ơn nhưng tôi nên đặt mã ở đâu? Tôi có nghĩa là sự kiện/chức năng nào được kích hoạt khi định hướng được thay đổi? –

+0

@kenyi Đơn giản bạn muốn làm gì? Cung cấp thêm chi tiết. Bạn chỉ cần xử lý định hướng hay cái gì? Tôi sẽ nâng cấp câu trả lời của mình. –

+0

Trước khi thiết bị thay đổi hướng, tôi cần phải xác định xem chế độ nằm ngang có được phép hay không, trong thời gian chạy. Giả sử người dùng đã tắt chế độ ngang thì ứng dụng sẽ vẫn ở chế độ dọc. –

17

Thử chạy

getResources().getConfiguration().orientation 

Từ đối tượng hoàn cảnh của bạn để tìm ra các hướng màn hình khi chạy, các giá trị có thể là những gì là tài liệu here

để bắt sự kiện thay đổi định hướng, bạn có thể tìm thấy câu trả lời trong Dev Guide Android: Handling the Configuration Change Yourself

Từ hướng dẫn:

Ví dụ, mã manifest sau tuyên bố một hoạt động mà xử lý cả hai sự thay đổi hướng màn hình và bàn phím có sẵn thay đổi:

< hoạt động android: name =
"MyActivity." android: configChanges = "định hướng | keyboardHidden"
android: label = "@ string/app_name" >

Bây giờ, khi một trong những conf igurations thay đổi, MyActivity không khởi động lại. Thay vào đó, MyActivity nhận được một cuộc gọi đến onConfigurationChanged(). Phương thức này được chuyển qua một đối tượng Cấu hình chỉ định cấu hình thiết bị mới. Bằng cách đọc các trường trong Cấu hình, bạn có thể xác định cấu hình mới và thực hiện các thay đổi thích hợp bằng cách cập nhật các tài nguyên được sử dụng trong giao diện của bạn. Vào thời điểm phương thức này được gọi, đối tượng Tài nguyên của hoạt động của bạn được cập nhật để trả về tài nguyên dựa trên cấu hình mới, vì vậy bạn có thể dễ dàng đặt lại các thành phần của giao diện người dùng mà không cần hệ thống khởi động lại hoạt động của bạn.

...

+0

Xin chào, tôi đã cập nhật câu hỏi của mình. Tôi biết cách lấy lại hướng màn hình, tôi cần biết WHERE để xử lý nó ở đâu. –

+0

Xin chào, hãy xem liên kết cuối cùng trong câu trả lời của tôi ... [Tự mình thay đổi cấu hình] (http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange). Tôi đã chỉnh sửa câu trả lời của mình với một số thông tin khác – Talihawk

2
if (this.getWindow().getWindowManager().getDefaultDisplay() 
    .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { 
    // portrait mode 
} else if (this.getWindow().getWindowManager().getDefaultDisplay() 
      .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { 
    // landscape 
} 
1

Bạn không cần phải ngăn chặn sự kiện và sau đó ghi đè lên nó. Chỉ cần sử dụng:

// Allow rotation 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER); 
// Lock rotation (to Landscape) 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE); 

Điểm cần lưu ý ở đây, nếu trên Jellybean và cao hơn điều này sẽ cho phép xoay 180 độ khi bị khóa. Ngoài ra khi mở khóa, điều này chỉ cho phép xoay nếu cài đặt chính của người dùng là cho phép xoay vòng. Bạn có thể cấm quay 180 độ và ghi đè cài đặt chính và cho phép xoay vòng và nhiều hơn thế nữa, vì vậy hãy xem các tùy chọn trong ActivityInfo

Ngoài ra, nếu bạn đã đặt trước là không có xoay vòng thì hoạt động sẽ không bị phá hủy và sau đó khởi động lại, chỉ để bạn có thể thiết lập hướng quay trở lại sẽ khiến hoạt động được khởi động lại; Vì vậy, việc thiết lập những gì bạn muốn trước có thể là hiệu quả hơn nhiều.

Sử dụng trước Jellybean ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE - không xoay 180 độ với điều này.

0

Kiểm tra hướng màn hình android của bạn tại Runtime:

ListView listView = (ListView) findViewById(R.id.listView1); 
if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { 
    //do work for landscape screen mode. 
    listView.setPadding(0, 5, 0, 1); 
} else if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { 
    //Do work for portrait screen mode. 
    listView.setPadding(1, 10, 1, 10); 
} 
Các vấn đề liên quan