2012-04-25 122 views
2

有复选框与下面的代码:冻结屏幕方向

CheckBox cb = (CheckBox)findViewById(R.id.freezer); 
    cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked) { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 
      } else { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 
      } 
     } 
    }); 

所以,当我检查了,屏幕旋转到系统默认的方向(横向为我的平板电脑)。

我需要冻结CURRENT方向。如果您将设备转为纵向并切换CheckBox,则必须重新启动设备旋转,直到取消选中CheckBox。

Display.getRotation()是不是一个解决方案,因为每个设备都有它自己的Surface.ROTATION

回答

6

所以,这是我的解决方案。

private int getCurentOrientation() { 
    Display d = ((WindowManager) getSystemService(WINDOW_SERVICE)) 
      .getDefaultDisplay(); 
    boolean isWide = d.getWidth() >= d.getHeight(); 
    switch (d.getRotation()) { 
    case Surface.ROTATION_0: 
     return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE 
       : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
    case Surface.ROTATION_90: 
     return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE 
       : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
    case Surface.ROTATION_180: 
     return isWide ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE 
       : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
    case Surface.ROTATION_270: 
     return isWide ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE 
       : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
    } 
    return -1; 
} 

private void lockOrientation(boolean lock) { 
    if (lock) { 
     setRequestedOrientation(getCurentOrientation()); 
    } else { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 
    } 
} 

在4个设备(2个智能手机和2个平板电脑)上,它的工作原理如下。

1

既然你知道如何让当前的方向,只写

if(isChecked){ 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} else { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
} 
+0

你知道如何正确定位吗? – styanton 2012-04-25 06:00:33

+0

'Display display =((WindowManager)getSystemService(WINDOW_SERVICE))。getDefaultDisplay(); int orientation = display。getOrientation();'// portrait = 1;景观= 2; – Pallavi 2012-04-25 06:29:10

+0

@styanton接受正确的答案/哪些适合你。 – Pallavi 2012-04-25 06:48:15

1

创建memeber变量并保存当前的设置状态。 short is_landscape = -1;

oncheckedchange监听器,您可以永久设置您的状态并保存它。

if (is_landscape == -1) { 
    Configuration config_screen = getResources().getConfiguration(); 
    int orientation = config_screen.orientation; 
    if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE); 
     is_landscape = 0; 
    } else { 
     setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT); 
     is_landscape = 1; 
    } 
} 

问题是,只要你旋转你的设备,它就会重新创建你的活动,这样你就失去了你的状态。所以只保存你的is_landscape变量

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    oustate.putExtra("last_state", is_landscape); 
    super.onSaveInstanceState(outState); 
} 

you can restore your position on on restore instance 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    is_landscape = savedInstanceState.getShort("last_state"); 
    if (is_landscape == 0) { 
     setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE); 
    } else if (is_landscape == 1) { 
     setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT); 
    } 
    super.onRestoreInstanceState(savedInstanceState); 
} 

如果你不想保存和恢复实例,那么你可以使用。

机器人:configChanges =“方向”

在menifest文件时,它不会允许在改变你的设备的方向重新创建活动。

希望它能为你工作。

如果要检测相反的状态也可以使用

INT状态=(窗口管理器)getSystemService(WINDOW_SERVICE))getDefaultDisplay()getRotation()。

如果状态是Surface.ROTATION_0那么这将是肖像 如果状态是Surface.ROTATION_90那么这将是景观 如果状态是Surface.ROTATION_180那么这将是相反的肖像 如果状态是Surface.ROTATION_270那么它将成为反转景观

在Surface.ROTATION_0和Surface.ROTATION_180的情况下设置纵向。 在Surface.ROTATION_90和Surface.ROTATION_270的情况下设置横向。

您还可以设置旋转而不是方向,以便您的设备将处于旋转状态而不是定向状态。

+0

您的代码在REVERSE_LANDSCAPE和REVERSE_PORTRAIT方向上会失败 – styanton 2012-04-25 06:01:56

+0

如果它在横向和纵向上工作,那么您可以使其工作我已经给出了您的想法,只需要检测reverse_landscape和reverse_portrai模式并保存其状态并将其恢复即可 – 2012-04-25 06:38:32

+0

我已经给出你想你现在可以保存你的逆向状态,并恢复它onrestoreinstance剩下的事情是你只需要检测reverse_landscape和reverse_portrait并保存它。 – 2012-04-25 06:44:35