单击按钮时,在 setRequestedOrientation 后自动旋转不起作用

Posted

技术标签:

【中文标题】单击按钮时,在 setRequestedOrientation 后自动旋转不起作用【英文标题】:Auto rotate doesn't work after setRequestedOrientation when button is clicked 【发布时间】:2017-12-04 00:03:06 【问题描述】:

我有这个视频视图。它有一个全屏按钮作为控制器。自动旋转一开始正常,但是当点击全屏按钮时,屏幕旋转为横向,当我尝试自动旋转时,它不会自动旋转为纵向。

这是我的视频视图和控制器的屏幕截图。

这是我的全屏按钮 onClickEvent 代码

mFullScreen.setOnClickListener(new View.OnClickListener() 

        @Override
        public void onClick(View v) 

            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) 
                //To fullscreen
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                mFullScreen.setImageResource(R.drawable.fullscreen);
                toolbar.setVisibility(View.VISIBLE);
                updateMetadata(false);

             else 

                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                getSupportActionBar().hide();
                mFullScreen.setImageResource(R.drawable.normal_screen);
                toolbar.setVisibility(View.INVISIBLE);
                updateMetadata(true);
            
        
    );

这是我的 onConfiguration 更改方法

@Override
public void onConfigurationChanged(Configuration newConfig) 
    super.onConfigurationChanged(newConfig);

    getSupportActionBar().show();
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
        getSupportActionBar().hide();
        toolbar.setVisibility(View.INVISIBLE);
        try 
            channelNameText.setVisibility(View.GONE);
            channelImage.setVisibility(View.GONE);
         catch (NullPointerException ne) 
            ne.printStackTrace();
        

        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
        
        updateMetadata(false);

     else 

        Logger.e("Orientation", "ORIENTATION_POTRAIT");

        try 
            channelNameText.setVisibility(View.VISIBLE);
            channelImage.setVisibility(View.VISIBLE);
         catch (NullPointerException ne) 
            ne.printStackTrace();
        

        mFullScreen.setImageResource(R.drawable.fullscreen);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
        getWindow().clearFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
        
        updateMetadata(true);
    

只有当我们按下全屏按钮时才会调用 onConfiguration 方法。如何在 setRequestedOrientation 之后启用自动旋转?

【问题讨论】:

您是否检查过您的设备是否开启了自动旋转功能? 是的,自动旋转已打开,起初自动旋转有效,但在按下全屏后,调用 setRequestOrientation() 自动旋转不起作用。 【参考方案1】:

如果您想根据您的要求随时更改活动的方向模式,那么下面是执行相同操作的 java 代码。正如我们在上面讨论的所有 android 屏幕方向模式一样,我们可以随时从 java 代码中设置任何模式。下面是横向和纵向模式的示例。但是您可以以相同的方式设置所有可用模式。将以下代码行放在您要更改活动屏幕方向的活动 java 文件中的任何位置。例如,如果要在显示屏幕之前设置特定方向,则可以在活动的 onCreate() 函数中添加代码。

横向模式

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

纵向模式

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

注意:添加此代码时,不要忘记导入包 import android.content.pm.ActivityInfo; 到您的代码中。

有时,您想在运行时以编程方式获取当前屏幕的屏幕方向。为了得到同样的结果,你可以在你的 activity.java 文件中尝试下面的 java 代码。

//Get current screen orientation
        Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
        int orientation = display.getOrientation(); 
         switch(orientation) 
            case Configuration.ORIENTATION_PORTRAIT:
                setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                break;
            case Configuration.ORIENTATION_LANDSCAPE:
                setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                break;                  
        

注意:不要忘记为上面的代码导入下面的包。

import android.view.Display;
import android.content.res.Configuration;
import android.view.WindowManager;

【讨论】:

以上是关于单击按钮时,在 setRequestedOrientation 后自动旋转不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在使用更新过程在按钮单击时加载图像时,它允许单击其他按钮

如何在单击按钮时暂停读取文本文件并在 mfc vc++ 中的单击按钮时恢复它?

按钮图像在单击时不会改变,直到我快速单击另一个按钮

单击提交按钮时如何传递单击按钮的值?

每当我在任何按钮(即 UISegmentedControl 按钮)之外单击时,都会单击该按钮。谁能告诉我为啥会这样?

单击时如何更改按钮的颜色,并在下次单击时恢复为默认颜色?