2013-08-16 122 views
59

我认为这是可以实现的,因为屏幕旋转行为可以上升到应用程序级别。以编程方式使用按钮更改屏幕方向

+0

你试过吗? :http://stackoverflow.com/questions/14873755/change-screen-orientation-in-android-without-reloading-the-activity –

回答

133

是的,它是可以实现的!

ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

ActivityInfo

http://developer.android.com/reference/android/content/pm/ActivityInfo.html

请参考 链接:

Button buttonSetPortrait = (Button)findViewById(R.id.setPortrait); 
Button buttonSetLandscape = (Button)findViewById(R.id.setLandscape); 

buttonSetPortrait.setOnClickListener(new Button.OnClickListener(){ 

    @Override 
    public void onClick(View arg0) { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } 

}); 

buttonSetLandscape.setOnClickListener(new Button.OnClickListener(){ 

    @Override 
    public void onClick(View arg0) { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    } 

}); 

http://android-er.blogspot.in/2011/08/set-screen-orientation-programmatically.html

+0

谢谢。但是,这个功能是否需要在根设备上运行?它似乎不适用于我的手机,但在我的根源平板电脑上。 – Sam

+0

不,它不是那样..事实上,我在发布前测试了该链接中的代码。它在我的设备中工作。 – Hariharan

+0

好的,是的,你说得对。我只是测试了另一个设备,它运行良好。好吧,我的三星Galaxy Nexus不起作用。不知道为什么。 – Sam

24

是的,你可以设置屏幕方向编程,只要你愿意使用:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
分别为

风景和肖像模式。 setRequestedOrientation()方法可用于活动类,因此它可以在您的活动中使用。

这是你怎么能获得当前的屏幕方向并设置adequatly根据其当前的状态:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
final int orientation = display.getOrientation(); 
// OR: orientation = getRequestedOrientation(); // inside an Activity 

// set the screen orientation on button click 
Button btn = (Button) findViewById(R.id.yourbutton); 
btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 

       switch(orientation) { 
        case Configuration.ORIENTATION_PORTRAIT: 
         setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
         break; 
        case Configuration.ORIENTATION_LANDSCAPE: 
         setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
         break;     
       } 
      } 
    }); 

从这里摘自:http://techblogon.com/android-screen-orientation-change-rotation-example/

编辑

而且,您可以使用以下屏幕方向获取屏幕方向:Configuration

Activity.getResources().getConfiguration().orientation 
+2

我会建议使用'getRequestedOrientation()'获取当前的屏幕方向:http://stackoverflow.com/a/21909327/1037294 –

+0

详尽的答案。 – pdegand59

14

使用此设置屏幕的方向:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

,不要忘记将它添加到您的清单:

android:configChanges = "orientation" 
+2

你需要''orientation | screenSize“',看这里:https://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange – Benny

+0

api 27,它是越野车,不使用清单选项 – Mike

12

只要有可能请不要使用SCREEN_ORIENTATION_LANDSCAPE或SCREEN_ORIENTATION_PORTRAIT。改为使用:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 

这些允许用户将设备分别定向到横向或纵向。如果你曾经玩过充电电缆进入你的肚子,那么你就知道为什么这两种方向对用户来说都很重要。

注意:对于手机,至少有几个我检查过,它只允许“右侧”肖像模式,但是,SENSOR_PORTRAIT可以在平板电脑上正常工作。

注:此功能是在API级别9中引入,所以如果你必须支持8或更低(不太可能在这一点),然后改用:

setRequestedOrientation(Build.VERSION.SDK_INT < 9 ? 
         ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : 
         ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
setRequestedOrientation(Build.VERSION.SDK_INT < 9 ? 
         ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : 
         ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);