Câu trả lời:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Được gọi trên một hoạt động, sẽ khóa nó ở chế độ ngang. Tìm các cờ khác trong lớp ActivityInfo. Bạn có thể khóa nó về chế độ dọc hoặc làm cho nó điều khiển bằng cảm biến / thanh trượt.
Thông tin thêm tại đây: http://www.devx.com/wireless/Article/40792
Hãy cẩn thận về sự khác biệt giữa những gì getConfiguration trả về và những gì setRequestedOrientation muốn - cả hai đều là int, nhưng chúng đến từ các định nghĩa hằng số khác nhau.
Đây là cách khóa hướng hiện tại, đồng thời cho phép lật 180 độ
int currentOrientation = getResources().getConfiguration().orientation;
if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
Tính năng này hoạt động trên các thiết bị có chế độ dọc và ngang ngược.
Định hướng khóa:
int orientation = getActivity().getRequestedOrientation(); int rotation = ((WindowManager) getActivity().getSystemService( Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); switch (rotation) { case Surface.ROTATION_0: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_90: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_180: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; default: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; } getActivity().setRequestedOrientation(orientation);
Mở khóa định hướng:
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
Tôi dường như đã có một trường hợp tương tự. Tôi muốn hỗ trợ bất kỳ định hướng nào, nhưng tôi cần duy trì định hướng hiện tại sau một thời điểm nhất định trong quy trình làm việc. Giải pháp của tôi là:
Khi nhập dòng công việc được bảo vệ:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
Khi thoát khỏi quy trình làm việc được bảo vệ:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
Thay thế cho câu trả lời @pstoppani với sự hỗ trợ cho máy tính bảng (Cũng như câu trả lời @pstoppani, điều này sẽ chỉ hoạt động trên các thiết bị> 2.2) -
Đã kiểm tra trên Samsung Galaxy SIII
vàSamsung Galaxy Tab 10.1
public static void lockOrientation(Activity activity) {
Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
int tempOrientation = activity.getResources().getConfiguration().orientation;
int orientation = 0;
switch(tempOrientation)
{
case Configuration.ORIENTATION_LANDSCAPE:
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
else
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
break;
case Configuration.ORIENTATION_PORTRAIT:
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
else
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
activity.setRequestedOrientation(orientation);
}
||
trong rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90
và với rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270
. Vì vậy, tôi có 2 nghi ngờ :::: đầu tiên, Tại sao ROTATION_0
thay vì ROTATION_180
trong trường hợp thứ hai và khác tại sao kiểm tra 0 độ với 90 không phải 180 ??
||
kiểm tra khác nhau đang xử lý hai hướng mặc định có thể có dựa trên phong cảnh báo cáo thiết bị so với dọc.
Đây là mã của tôi, bạn có thể khóa màn hình của mình bằng một trong các phương pháp này và sau khi hoàn thành nhiệm vụ, hãy mở khóa bằng unlockOrientation:
/** Static methods related to device orientation. */
public class OrientationUtils {
private OrientationUtils() {}
/** Locks the device window in landscape mode. */
public static void lockOrientationLandscape(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
/** Locks the device window in portrait mode. */
public static void lockOrientationPortrait(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
/** Locks the device window in actual screen mode. */
public static void lockOrientation(Activity activity) {
final int orientation = activity.getResources().getConfiguration().orientation;
final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
// Copied from Android docs, since we don't have these values in Froyo 2.2
int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;
// Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
if (!BuildVersionUtils.hasGingerbread()) {
SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90){
if (orientation == Configuration.ORIENTATION_PORTRAIT){
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else if (orientation == Configuration.ORIENTATION_LANDSCAPE){
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270)
{
if (orientation == Configuration.ORIENTATION_PORTRAIT){
activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
}
else if (orientation == Configuration.ORIENTATION_LANDSCAPE){
activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
}
}
}
/** Unlocks the device window in user defined screen mode. */
public static void unlockOrientation(Activity activity) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
}
}
Đây là chuyển đổi Xamarin của câu trả lời của @pstoppani ở trên.
LƯU Ý: đây là cho một Fragment, thay thế Activity. với cái này. nếu được sử dụng trong một hoạt động.
public void LockRotation()
{
ScreenOrientation orientation;
var surfaceOrientation = Activity.WindowManager.DefaultDisplay.Rotation;
switch (surfaceOrientation) {
case SurfaceOrientation.Rotation0:
orientation = ScreenOrientation.Portrait;
break;
case SurfaceOrientation.Rotation90:
orientation = ScreenOrientation.Landscape;
break;
case SurfaceOrientation.Rotation180:
orientation = ScreenOrientation.ReversePortrait;
break;
default:
orientation = ScreenOrientation.ReverseLandscape;
break;
}
Activity.RequestedOrientation = orientation;
}
public void UnlockRotation()
{
Activity.RequestedOrientation = ScreenOrientation.Unspecified;
}
Điều này chưa được kiểm tra như đã xảy ra với một cách tiếp cận khác trước khi sử dụng nó, nhưng có thể được sử dụng.