当前位置: 首页 > 知识库问答 >
问题:

检测Android主屏幕的旋转

唐俊楚
2023-03-14

我有一个应用程序小部件,当它更新时,获取具有与小部件匹配的维度的图像,并将该图像放入ImageView(通过远程视图)。它工作得很好。

但是对于支持主屏幕旋转的设备(我不是说基于设备方向的活动的旋转,而是主屏幕本身的旋转),当从横向到纵向,小部件的尺寸和纵横比会发生一些变化,反之亦然。。。i、 e.不保持固定尺寸。

因此,我的小部件需要能够检测主屏幕何时旋转,并获取新图像(或者至少加载不同的预取图像)。

我一辈子都搞不清楚这是否可能以及如何可能。有什么线索吗?


共有3个答案

焦宁
2023-03-14

检查此代码是否有效:

 myButton.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {

    int rotation = getWindowManager().getDefaultDisplay()
      .getRotation();
    // DisplayMetrics dm = new DisplayMetrics();
    // getWindowManager().getDefaultDisplay().getMetrics(dm);
    int orientation;
    CharSequence text;

    switch (rotation) {
    case Surface.ROTATION_0:
     text = "SCREEN_ORIENTATION_PORTRAIT";
     break;
    case Surface.ROTATION_90:
     text = "SCREEN_ORIENTATION_LANDSCAPE";
     break;
    case Surface.ROTATION_180:
     text = "SCREEN_ORIENTATION_REVERSE_PORTRAIT";
     break;
    case Surface.ROTATION_270:
     text = "SCREEN_ORIENTATION_REVERSE_LANDSCAPE";
     break;
    default:
     text = "SCREEN_ORIENTATION_PORTRAIT";
     break;
    }

    // CharSequence text = String.valueOf(orientation);
    Toast toast = Toast.makeText(getApplicationContext(), text,
      Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.CENTER | Gravity.CENTER, 10, 0);
    toast.show();

   }
  });
朱毅
2023-03-14

您可以收听广播ACTION_CONFIGURATION_CHANGED,当当前设备配置(方向,区域设置等)发生变化时,由Android系统发送。根据留档:

操作\u配置\u已更改:

广播操作:当前设备配置(方向、区域设置等)已更改。当这种变化发生时,UI(视图层次结构)将需要根据这些新信息进行重建;在大多数情况下,应用程序不需要担心这一点,因为系统将负责停止和重新启动应用程序,以确保它看到新变化。一些无法重新启动的系统代码需要注意此操作并适当处理。

您不能通过清单中声明的组件来接收此消息,只能通过向上下文显式注册来接收。registerReceiver()。

这是一个受保护的意图,只能由系统发送。

public class YourWidgetProvider extends AppWidgetProvider {

        @Override
        public void onEnabled(Context context) {
            super.onEnabled(context);
            context.registerReceiver(mOrientationChangeReceiver,new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED));
        }

        @Override
        public void onDisabled(Context context) {
            context.unregisterReceiver(mOrientationChangeReceiver);
            super.onDisabled(context);
        }

        public BroadcastReceiver mOrientationChangeReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent myIntent) {
                if ( myIntent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
                    if(context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
                        // landscape orientation
                        //write logic for building remote view here
                        // buildRemoteViews();
                    }
                    else {
                        //portrait orientation
                        //write logic for building remote view here
                        // buildRemoteViews();
                    }
                }
            }
        };
    }
谭建章
2023-03-14

使用以下代码检测方向:-

    View view = getWindow().getDecorView();
    int orientation = getResources().getConfiguration().orientation;

    if (Configuration.ORIENTATION_LANDSCAPE == orientation) {
       relativeLayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.log_landscape));
        imageview_Logo.setImageResource(R.drawable.log_landscape_2);
        Log.d("Landscape", String.valueOf(orientation));
        //Do SomeThing; // Landscape
    } else {
       relativeLayout.setBackgroundDrawable( getResources().getDrawable(R.drawable.login_bg) );
       imageview_Logo.setImageResource(R.drawable.logo_login);
        //Do SomeThing;  // Portrait
        Log.d("Portrait", String.valueOf(orientation));
    }
 类似资料:
  • 我发现下面的问题屏幕覆盖检测时,在Motog3Marshmallow移动点击权限。 我在到处的互联网搜索中找到了许多解决方案,您可以查看以下内容: > 删除esfile资源管理器 https://www.youtube.com/watch?v=QHidevTDrYI 检测到屏幕覆盖阻止Android权限 https://android.stackexchange.com/questions/148

  • 我想在模拟器上测试手机的旋转,我看到我们必须使用CtrlF11的所有地方,但它只旋转模拟器的图像,不会启动配置更改事件或重新绘制活动。 下面是我用CtrlF11得到的: 那么,我必须用什么来模拟真实的旋转呢?

  • 运行我的android应用程序时出现以下错误: 检测到屏幕覆盖: 要更改此权限设置,您首先必须从设置中关闭屏幕覆盖 我的应用程序没有列在显示的列表中。 如何解决这个错误?

  • 在屏幕旋转后,虽然我在super.onCreate(null);,中传递null,但我得到了object返回的nullPointerException异常。我知道在传递savedInstanceState=null的同时必须销毁并重新创建活动,这意味着活动应该在旋转后开始,因为它是第一次开始,为什么在旋转后会出现此异常? onCreate()代码段,其中名为historyText的对象 Logca

  • 实现在竖屏的NavigationController中push一个横屏的UIViewController,模拟器测试兼容5.0、6.0系统。实现程序中手动旋转屏幕的效果。 [Code4App.com]

  • 我注意到我的新手机上的Android应用程序有一个奇怪的问题。SDK 23权限弹出窗口(如外部存储)被下面的附加警报阻止。我最初以为这与我的手机有关,但它似乎不影响我安装的任何其他应用程序。 这个问题可能与安装了调试版本有关,还是我的权限处理有问题?我以为它可能与我正在使用的广告平台之一有关,但我尝试禁用它们,它仍然出现 我已经粘贴了下面生成此权限请求的图像保存功能。我正在使用Dexter来节省编