2015-02-18 23 views
7

Trong documentation for the Android manifest, có nhiều cách khác nhau để xác định screenOrientation:fallbacks Manifest cho hướng màn hình

  • landscape
  • sensorLandscape bổ sung trong API 9
  • userLandscape bổ sung trong API 18

Làm thế nào tôi có thể chỉ định userLandscape, nhưng trên các phiên bản cũ hơn của Android, có nó dự phòng để sensorLandscape và thậm chí trên các phiên bản cũ hơn rơi trở lại landscape? Tôi không thể tìm thấy cách làm điều này trong tài liệu.

Trả lời

8

Tôi không nghĩ rằng có cách để triển khai cơ chế dự phòng trong bản kê khai.

Tôi khuyên bạn nên chỉ định một trong số {userLandscape, sensorLandscape, landscape} trong tệp kê khai. Sau đó, kiểm tra phiên bản tại thời điểm chạy và ứng biến.

Giả sử, bạn quyết định đi với android:screenOrientation="userLandscape" trong tệp kê khai.

Trong của hoạt động của bạn onCreate(Bundle), trước khi thiết lập nội dung:

int sdkInt = Build.VERSION.SDK_INT; 

// if we're running on some API level within [9, 18), use `sensorLandscape` 
if (sdkInt >= Build.VERSION_CODES.GINGERBREAD /* 9 */ 
     && sdkInt < Build.VERSION_CODES.JELLY_BEAN_MR2 /* 18 */) { 
    setRequestedOrientation(
      ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
} else if (sdkInt < Build.VERSION_CODES.GINGERBREAD /* 9 */) { 
    setRequestedOrientation(
      ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
} 

// API 18 or above - handled in manifest 

setContentView(R.layout.whatever); 

Hy vọng rằng một người nào đó đi lên với một giải pháp tốt hơn thế này. Điều này có vẻ như bạo lực.

Edit:

Cố gắng một cách tiếp cận khác nhau - từ những gì tôi biết (và tôi có thể là sai ở đây), enums như userLandscape, sensorLandscape vv sẽ không thay đổi giá trị. Khi họ đang đứng:

<attr name="screenOrientation"> 
    <enum name="unspecified" value="-1" /> 
    <enum name="landscape" value="0" /> 
    <enum name="portrait" value="1" /> 
    <enum name="user" value="2" /> 
    <enum name="behind" value="3" /> 
    <enum name="sensor" value="4" /> 
    <enum name="nosensor" value="5" /> 
    <enum name="sensorLandscape" value="6" /> 
    <enum name="sensorPortrait" value="7" /> 
    <enum name="reverseLandscape" value="8" /> 
    <enum name="reversePortrait" value="9" /> 
    <enum name="fullSensor" value="10" /> 
    <enum name="userLandscape" value="11" /> 
    <enum name="userPortrait" value="12" /> 
    <enum name="fullUser" value="13" /> 
    <enum name="locked" value="14" /> 
</attr> 

Vì vậy, nếu bạn đã xác định một integer như:

<!-- `0` for `landscape` -- defined in values/integers.xml --> 
<integer name="customScreenOrientation">0</integer> 

<!-- `6` for `sensorLandscape` -- defined in values-v9/integers.xml --> 
<integer name="customScreenOrientation">6</integer> 

<!-- `11` for `userLandscape` -- defined in values-v18/integers.xml --> 
<integer name="customScreenOrientation">11</integer> 

Sau đó, bạn có thể sử dụng @integer/customScreenOrientation làm giá trị cho android:screenOrientation trong thẻ của hoạt động của bạn.

Không cần phải nói rằng nó là hack tốt nhất. Nếu ai đó có thể xác nhận trạng thái ổn định của giá trị enum cho screenOrientation, đây có thể là cách giải quyết khả thi - thích hợp hơn để bao gồm mã từ đề xuất trước đây của tôi trong nhiều hoạt động.

Tuy nhiên, một biên tập:

Cách tiếp cận thứ hai tôi đã đề cập trước đó có thể được cải thiện khi:

Thay vì nhiều integers.xml file, tạo ra 3 styles.xml tập tin. Tôi đoán bạn đã có một - values/styles.xml. Tạo values-v9/styles.xml & values-v18/styles.xml.

<!-- values/styles.xml --> 
<style name="AppTheme" parent="@style/BaseTheme"> 
    <item name="android:screenOrientation">landscape</item> 
</style> 

<!-- values-v9/styles.xml --> 
<style name="AppTheme" parent="@style/BaseTheme"> 
    <item name="android:screenOrientation">sensorLandscape</item> 
</style> 

<!-- values-v18/styles.xml --> 
<style name="AppTheme" parent="@style/BaseTheme"> 
    <item name="android:screenOrientation">userLandscape</item> 
</style> 

Sau này, tạo values/integers.xml (một tập tin) và xác định một số nguyên customScreenOrientation:

<integer name="customScreenOrientation">?android:attr/screenOrientation</integer> 

Bạn hoạt động của thẻ sẽ trông giống như:

<activity 
    .... 
    android:theme="@style/AppTheme" 
    android:screenOrientation="@integer/customScreenOrientation"/> 

Ưu điểm của phương pháp này so với thứ hai là chúng ta có thể sử dụng enums thay cho các giá trị mã hóa cứng. Một lần nữa, hai phương pháp này tương đương nhau nếu các giá trị enum được đặt trong đá. Nếu họ thay đổi, cách tiếp cận thứ hai sẽ thất bại trong khi tiếp cận thứ ba tiếp tục.

+0

Tác phẩm này hoạt động. Tôi sẽ quan tâm đến việc nhìn thấy một giải pháp thanh lịch hơn, nhưng có lẽ không có một. – Tenfour04

+0

@ Tenfour04 Tôi đã chơi xung quanh với điều này một số chi tiết và tìm thấy một workaround - nó không thanh lịch theo ý kiến ​​của tôi, nhưng không cung cấp một giải pháp với mã ít hơn. – Vikram

+0

@ Tenfour04 Thêm một cách khác (cuối cùng tôi hy vọng) cách thực hiện cơ chế dự phòng. – Vikram

Các vấn đề liên quan