2011-01-15 46 views
19

Tôi đã thử getOrientation() để nhận giá trị định hướng nhưng giá trị này luôn trả về 0!hướng màn hình android

+7

Hãy thử xoay thiết bị trước. – noelicus

+0

Rolled trở lại bên thứ 3 chỉnh sửa tiêu đề như câu hỏi (và thậm chí nhiều hơn để nó câu trả lời) quan tâm định hướng như là một vấn đề chung hơn là một phương pháp đặc biệt. –

Trả lời

5

getOrientation() không còn được dùng nữa. Thay vào đó, hãy thử getRotation().

+0

Bất kỳ ý tưởng nào tại sao getOrientation không được chấp nhận? Theo như tôi có thể nói, getRotation thực hiện chính xác điều tương tự. –

+1

Nếu bạn phải hỗ trợ API 7, bạn không thể sử dụng 'getRotation', đó là API 8 trở đi. – mxcl

37

Nếu bạn muốn biết nếu nội dung đang hiển thị ở chế độ phong cảnh hoặc chân dung (có thể hoàn toàn độc lập luân chuyển vật lý của điện thoại), bạn có thể sử dụng:

getResources().getConfiguration().orientation

Developer Documentation

định hướng công khai int
Vì: API Cấp 1

Định hướng chung của màn hình. Có thể là một trong ORIENTATION_LANDSCAPE, ORIENTATION_PORTRAIT hoặc ORIENTATION_SQUARE.

+0

Giải pháp tốt khi bạn cần hỗ trợ các phiên bản hệ điều hành cũ hơn. Dường như đáng tin cậy hơn 'getOrientation()'. – azdev

+0

Cho đến nay, đây là giải pháp duy nhất đã hoạt động tốt cho tôi! –

+0

có vẻ như getOrientation() luôn trả về ORIENTATION_UNDEFINED nếu tôi không xoay màn hình kể từ khi tải hoạt động. bằng cách này tránh được vấn đề đó. – Keith

46

getOrientation() không được dùng nữa nhưng điều này không nhất thiết phải là gốc của sự cố của bạn. Đúng là bạn nên sử dụng getRotation() thay vì getOrientation() nhưng bạn chỉ có thể sử dụng nếu bạn đang nhắm mục tiêu Android 2.2 (API cấp 8) trở lên. Một số người và thậm chí cả nhân viên Google dường như quên điều đó.

Ví dụ: trên mong muốn HTC của tôi đang chạy Android 2.2. getOrientation()getRotation() cả báo cáo cùng các giá trị:

  • 0 (mặc định, chân dung),
  • 1 (thiết bị 90 độ ngược chiều kim đồng),
  • 3 (thiết bị 90 độ theo chiều kim đồng)

Báo cáo không báo cáo khi bạn đặt "trên đầu" (xoay 180, đó sẽ là giá trị 2). Kết quả này có thể là thiết bị cụ thể.

Trước hết, bạn nên làm rõ nếu bạn sử dụng trình mô phỏng hoặc thiết bị. Bạn có biết làm thế nào để xoay giả lập? Sau đó, tôi muốn giới thiệu để tạo ra một chương trình thử nghiệm nhỏ với một phương pháp onCreate() như thế này:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
    Display mDisplay = mWindowManager.getDefaultDisplay(); 

    Log.d("ORIENTATION_TEST", "getOrientation(): " + mDisplay.getOrientation()); 

} 

Kiểm tra xem màn hình của điện thoại của bạn đã được khóa trong cài đặt thiết bịCài đặt> Hiển thị> Auto- Xoay màn hình. Nếu hộp kiểm đó không được chọn, Android sẽ không báo cáo thay đổi định hướng cho Hoạt động của bạn. Để rõ ràng: nó sẽ không khởi động lại hoạt động. Trong trường hợp của tôi, tôi chỉ nhận được , như bạn đã mô tả.

Bạn có thể kiểm tra điều này từ chương trình của bạn nếu bạn thêm những dòng này để onCreate()

int sysAutoRotate = 0; 
try { 
     sysAutoRotate = Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION); 
    } catch (SettingNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
Log.d("ORIENTATION_TEST", "Auto-rotate Screen from Device Settings:" + sysAutoRotate); 

Nó sẽ trở lại nếu Auto-Rotate tắt và nếu Auto-Rotate là trên. Một lần thử khác.Trong chương trình ban đầu của bạn, bạn có thể đã đặt trong tệp kê khai

android:screenOrientation="portrait" 

Hiệu ứng tương tự, nhưng lần này chỉ cho hoạt động của bạn. Nếu bạn đã thực hiện chương trình thử nghiệm nhỏ này possibilty sẽ được loại bỏ (đó là lý do tại sao tôi khuyên bạn nên nó).

Lưu ý: Có toàn bộ chủ đề định hướng/xoay vòng thực sự là một chủ đề "thú vị". Hãy thử mọi thứ, sử dụng Log.d(), thử nghiệm, tìm hiểu.

+0

Chỉ có 26 phiếu bầu? Điều này thực sự hữu ích! – Sonhja

1
/* First, get the Display from the WindowManager */ 
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

/* Now we can retrieve all display-related infos */ 
int width = display.getWidth(); 
int height = display.getHeight(); 
int orientation = display.getOrientation(); 
1

Tôi nghĩ bạn cần tạo hai bố cục khác nhau và tăng bố cục khác nhau theo hướng khác nhau. Tôi đang cho bạn một mã mẫu làm việc tốt cho tôi. "ngữ cảnh" bạn có thể chuyển từ hoạt động của mình trong trường hợp bộ điều hợp tùy chỉnh. Nếu bạn đang sử dụng bộ chuyển đổi tùy chỉnh sau đó bạn có thể thử mã này:

@Override 
public View getView(final int position, 
        View convertView, 
        ViewGroup parent) 
{ 
    View rowView = convertView; 
    ViewHolder holder = null; 
    int i = context.getResources().getConfiguration().orientation; 

    if (rowView == null) { 
     LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (i == Configuration.ORIENTATION_PORTRAIT) { 
      rowView = inflater.inflate(R.layout.protrait_layout, null, false); 
     } else { 
      rowView = inflater.inflate(R.layout.landscape_layout, null, false); 
     } 

     holder = new ViewHolder(); 
     holder.button = (Button) rowView.findViewById(R.id.button1); 
     rowView.setTag(holder); 

    } else { 
     holder = (ViewHolder) rowView.getTag(); 
    } 
    return rowView; 
} 

khác khôn ngoan bạn có thể trực tiếp đặt hai bố trí khác nhau trong mã của bạn

int i = context.getResources().getConfiguration().orientation; 

     if (i == Configuration.ORIENTATION_PORTRAIT) { 
        ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.protrait_layout, name); 
     } else { 
        ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.landscape_layout, name); 
     } 
4

Để tránh sử dụng các phương pháp Deprecated sử dụng Configuration Android đã tìm thấy lớp học here. Nó hoạt động kể từ API lvl 1 và vẫn hoạt động trên các thiết bị Android mới nhất. (Không được chấp nhận).

Như và ví dụ xem xét các đoạn mã sau:

Configuration config = getResources().getConfiguration(); 
if (config.orientation == Configuration.ORIENTATION_PORTRAIT) 
{ 
    setContentView(R.layout.portraitStart); 
} 
else 
{ 
    setContentView(R.layout.landscapeStart); 
} 

Best of hy vọng luck- câu trả lời này giúp bất cứ ai chạy vào nó.

+1

Tại sao bạn chuyển đổi theo cách thủ công qua mã? Cấu hình bố cục có nghĩa là cho điều đó./res/layout và/res/layout-land. – afollestad

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