使用按钮编程更改屏幕方向

127

我认为这是可行的,因为屏幕旋转行为可以达到应用程序级别。


你尝试过这个吗?:https://dev59.com/_2Up5IYBdhLWcg3w_rrT - Sayed Jalil Hassan
8个回答

262

是的,它可以实现!

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


谢谢。但是这个函数需要在已经root的设备上运行吗?它似乎在我的手机上无法工作,但在我已经root的平板电脑上可以。 - Sam
不是这样的...实际上在发布之前我测试了那个链接中的代码...它在我的设备上运行良好.. - Hariharan
好的,是的,你说得对。我刚刚测试了另一个设备,它运行良好。但是我的三星Galaxy Nexus不工作。不知道为什么。 - Sam
6
谢谢你的回答。但是这种锁定模式会导致用户旋转设备时屏幕无法旋转。 - Eco4ndly
2
如果我像这个答案一样通过编程设置方向为横向,那么用户就不能通过旋转设备来改变方向了。有什么方法可以解决这个问题吗?我想实现这个答案中所教的内容,但是当用户旋转设备时它仍然会改变方向。 - Soon Santos
显示剩余2条评论

45

是的,您可以随时使用以下方式以编程方式设置屏幕方向

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

分别适用于横向和纵向模式。setRequestedOrientation()方法适用于Activity类,因此可以在您的Activity内部使用。

以下是如何获取当前屏幕方向并根据其当前状态设置适当方向的方法:

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

3
ه»؛è®®ن½؟用getRequestedOrientation()èژ·هڈ–ه½“ه‰چه±ڈه¹•و–¹هگ‘ï¼ڑhttps://dev59.com/questions/NXA65IYBdhLWcg3wuhMR#21909327 - a.ch.
当您启动应用程序时,getRequestedOrientation()会给您返回UNSPECIFIED。因此,使用上述监听器不会更改屏幕方向,如果您将UNSPECIFIED添加到switch中,则应首先将屏幕放置在纵向/横向位置之一。 - mortalis

25

请尽可能不要使用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);

21

使用此选项可设置屏幕方向:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

或者
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

不要忘记将此添加到您的清单(manifest)中:

android:configChanges = "orientation"

2
你需要同时使用 "orientation|screenSize",请参考:https://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange - Benny

13

一个可用的代码:

private void changeScreenOrientation() {
    int orientation = yourActivityName.this.getResources().getConfiguration().orientation;
    if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        showMediaDescription();
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        hideMediaDescription();
    }
    if (Settings.System.getInt(getContentResolver(),
            Settings.System.ACCELEROMETER_ROTATION, 0) == 1) {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
            }
        }, 4000);
    }
}

在您的按钮点击事件中调用此方法


1

Android-Kotlin:

如何使 X 轴旋转:

binding.btnRotateHorizontal.setOnClickListener {
     requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
}

使其Y轴旋转:
binding.btnRotateVertical.setOnClickListener {
     requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
}

0

是的,Hariharan 的答案很好。但你应该在 activity 标签中添加以下行到 AndroidManifest.xml 文件中:

android:screenOrientation="fullSensor"
android:configChanges="orientation|screenSize"

如果不添加上面的一行代码,Hariharan的答案将无法正常工作。

感谢Benny


0

我的工作是用以下代码实现的:

setLandscapeIcon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            setLandscapeIcon.setVisibility(View.GONE);
            setPortraitIcon.setVisibility(View.VISIBLE);
        }
    });

setPortraitIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
                setLandscapeIcon.setVisibility(View.VISIBLE);
                setPortraitIcon.setVisibility(View.GONE);
            }
        });

在清单文件中

android:configChanges = "orientation|screenSize"
android:screenOrientation="portrait"

注意:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)在我的设备上无法工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接