使用 setRequestedConfiguration 后,不会调用 onConfigurationChanged

2023-12-28

我已经设置了活动来处理配置更改并且它有效,这意味着onConfigurationChanged()当方向改变时被调用。

该活动有一个按钮可以显式更改方向。点击后,它调用了setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT).

然后方向就被不可撤销地设定并且onConfigurationChanged()不再被调用了。

当用户单击按钮时如何更改方向而不丢失onConfigurationChanged()打回来 ?


我就是这样解决的。我知道它是在重新发明轮子,但它满足了我的要求,但我没有找到使用标准 sdk 工具处理此问题的正确方法。

首先,创建一个OrientationManager监听方向变化的类

public class OrientationManager extends OrientationEventListener{
private static final String TAG = OrientationManager.class.getName();

private int previousAngle;
private int previousOrientation;
private Context context;
private OrientationChangeListener orientationChangeListener;
private static OrientationManager instance;
private OrientationManager(Context context) {
    super(context);
    this.context = context;
}

public static OrientationManager  getInstance(Context context){
    if (instance == null){
        instance = new OrientationManager(context);
    }
    return instance;
}

public int getOrientation(){
    return previousOrientation;
}

public void setOrientation(int orientation){
    this.previousOrientation = orientation;
}


@Override
public void onOrientationChanged(int orientation) {
    if (orientation == -1)
        return;
    if(previousOrientation == 0){
        previousOrientation = context.getResources().getConfiguration().orientation;
        if (orientationChangeListener != null){
            orientationChangeListener.onOrientationChanged(previousOrientation);
        }           
    }
    if (previousOrientation == Configuration.ORIENTATION_LANDSCAPE &&
            ((previousAngle > 10 && orientation <= 10) ||
            (previousAngle < 350 && previousAngle > 270 && orientation >= 350)) ){
        if (orientationChangeListener != null){
            orientationChangeListener.onOrientationChanged(Configuration.ORIENTATION_PORTRAIT);
        }
        previousOrientation = Configuration.ORIENTATION_PORTRAIT;
    }

    if (previousOrientation == Configuration.ORIENTATION_PORTRAIT &&
            ((previousAngle <90 && orientation >= 90 && orientation <270) ||
            (previousAngle > 280 && orientation <= 280 && orientation > 180))   ){
        if (orientationChangeListener != null){
            orientationChangeListener.onOrientationChanged(Configuration.ORIENTATION_LANDSCAPE);
        }
        previousOrientation = Configuration.ORIENTATION_LANDSCAPE;
    }
    previousAngle = orientation;
}

public void setOrientationChangedListener(OrientationChangeListener l){
    this.orientationChangeListener = l;
}

public interface OrientationChangeListener{
    public void onOrientationChanged(int newOrientation);
}
}

然后在你的活动中实施OrientationChangeListener并覆盖onOrientationChanged():

public class MyActivity extends Activity implements OrientationChangeListener{

    private OrientationManager orientationManager;

    @Override
    public void onCreate(Bundle b){
        orientationManager = OrientationManager.getInstance(this);
        orientationManager.setOrientationChangedListener(this);

    }

@Override
public void onOrientationChanged(int newOrientation) {
    orientation = newOrientation;
    if (newOrientation == Configuration.ORIENTATION_LANDSCAPE){
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
        setLandscapeConfig();
    }else{
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setPortraitConfig();
    }
}

所以我不使用onConfigurationChanged不再需要,但在清单中保留以下行: android:configChanges="方向|屏幕大小"

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 setRequestedConfiguration 后,不会调用 onConfigurationChanged 的相关文章

  • Android 架构组件与 Firebase 特别是 Firestore

    我正在经历这个blog https firebase googleblog com 2017 12 using android architecture components html by 道格 史蒂文森 https twitter co
  • java中将函数作为参数传递

    我正在熟悉 Android 框架和 Java 并希望创建一个通用的 NetworkHelper 类 该类将处理大部分网络代码 使我能够从中调用网页 我按照developer android com 上的这篇文章创建了我的网络类 http d
  • POST 请求出现 500 内部服务器错误

    这是我向服务器发送 POST 请求的代码 要发布到服务器的 JSON User Name dog Password 123 我如何创建 JSON 对象 object new JSONObject JSONObject jsonObject
  • 如何在从另一个活动调用一个活动时延迟一些?

    我有一个应用程序 其中我正在接收包含他的位置的短信 收到短信后 它会调用另一个活动来启动并将该位置传递给该活动以将其绘制在地图上 在调用第二个活动之前 它会显示一个类似于通知的吐司在屏幕上 但由于调用第二个活动 吐司没有出现 我的问题是我们
  • Eddystone Beacon 中广播的 MAC ID 会改变吗?

    我将描述我的设置 我制作了一个模拟 Eddystone 信标的 Android 应用程序 我能够使用 PlayStore 中的 Beacon Toy 应用程序检测手机上的 Eddystone 信标 但问题是 自上次检查以来 显示的 MAC
  • 为什么Volley的onResponse没有被调用

    我正在通过 Volley 获取 json 数据 我遇到的问题 那是凌空的onResponse从未被调用 因此不会解析和显示数据 JSON 数据示例 title This is a sample text title title cat or
  • 冲突的 Android 错误消息:指定的子项已经有父项。您必须首先对孩子的父母调用removeView()

    最初我得到了这个错误 指定的子项已经有父项 您必须调用removeView 首先是孩子的父母 at customSection addView customLayout 所以我添加了 LinearLayout customLayout ge
  • 在android中点击地图获取坐标

    我正在尝试做这样的事情 我有一个地图活动 当用户点击地图时 它会显示该位置的坐标 我已经重写了 onclick 方法 但它甚至没有被调用 任何想法 public class MapPoint extends MapActivity impl
  • PinnedHeader Google 加上 GridView?

    背景 Google google 应用程序可以很好地查看 亮点 类别中的图像 对于该屏幕上的每个部分 他们制作了一个标题 其中包含可单击的文本和一个用于选择该部分的所有照片的按钮 对于每个部分 他们还以网格状方式显示照片 它是这样的 这是另
  • Android 时间选择器在分钟滚动时自动更改小时

    例如 当我在 TimePicker 上滚动分钟时 在将分钟滚动到 59 后 小时会自动滚动到 7 因此新时间将为 07 59 同样的方式 如果我有 07 59 并且我将分钟滚动到 00 小时将自动滚动到 8 所以时间将是 08 00 此逻辑
  • 如何删除旧版本的Android Studio

    我必须释放硬盘中的一些空间 并寻找要删除的内容 我发现我有许多引用旧版本的 Android Studio AS 文件夹 我发现文件夹的路径是 C Users mysuername 我想要的是删除旧版本并只保留最新版本的方法 当时是 ASPr
  • Kotlin + Room:java.lang.IllegalArgumentException:void 无法转换为元素

    我试图在我的 Java Kotlin 项目中添加 Room 但是当我尝试编译该项目时 它失败了 app kaptDebugKotlin出现以下错误 e java lang IllegalStateException failed to an
  • 使用 Android Exoplayer 调整 Dash 流音量

    我正在尝试设置一个搜索栏来控制 exoplayer 流式破折号实例的级别 我正在使用的设置是演示项目的修改版本 并且无法确定我应该尝试影响搜索栏输出的哪个元素 即如何正确使用 MSG SET VOLUME 等 任何意见将不胜感激 我正在寻找
  • 等待视图通过 IdleResource 变得可见

    我正在使用 Espresso 2 2 编写仪器测试 我想测试的流程 测试点击的单选按钮 onClick 向 API 发起请求 每次不同时间我收到回复后 积极响应触发活动中调用的接口方法 onRequestSuccess 我正在屏幕上显示名为
  • 如何使用特定选项卡启动活动?

    我已经浏览了许多示例 问题和教程 但我从未见过使用特定选项卡启动活动 启动新意图 我知道可以使用 setCurrentTab切换到选项卡 但这只能从父活动选项卡内部完成 从另一个活动启动一个活动中包含的特定选项卡怎么样 是否可以 如果是这样
  • 尝试在 android 中使用 Google Maps Android API v2 显示 StreetView 但无法使其正常工作

    我很长时间以来一直在尝试在 Android 中显示特定位置的街景 但不幸的是未能成功 我需要的是 如果我向地图提供位置 LAT LONG 它应该显示该特定位置的街景 以下是显示地图 3D 地图 混合地图 卫星视图等的工作代码 但不显示街景
  • logcat 信息出现在 Android Studio 的“运行”选项卡中

    我的 android studio 运行选项卡很简单 然后它变得更难并给我更多信息 例如 logcat 中的信息 如何禁用或删除第二张图片中出现的更多信息并返回到第一张图片中的第一个外观 我只需要正在运行的 flutter 应用程序的日志输
  • 加载带有月份标题的 recyclerview 不同类型适配器

    如果从 api 获取不同的月份名称 则尝试将月份名称显示为标题 在这里 我加载月份标题 但是当我加载标题时 它不会加载其他视图 如果数据不同 我需要将月份加载为标题 并且还加载其他视图持有者 我看到一些例子 他们都在 Model 类中使用
  • Android:适合SystemWindows和换行符干扰bottomSheets

    我发现如果父布局包含android fitsSystemWindows true 当发生与视图相关的操作时 它会干扰我的 BottomSheets 定位 具体来说 我遇到的是 文本视图中的换行符将触发底页偏移系统 通知栏的高度 换行符 fi
  • Oreo:应用程序未运行时不会触发警报

    我有相对简单的设置 应该在一天中的特定时间触发警报并向用户显示通知 这是相关代码 设置闹钟 long inTime expirationTime Calendar getInstance getTimeInMillis 10000 Inte

随机推荐

  • 可扩展列表视图中的 Android 数据绑定

    我有一个非常具体的问题 我正在使用 android 数据绑定库 https developer android com topic libraries data binding index html https developer andr
  • LINQ-实体日期部分[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一种方法可以获取 linq to
  • 模拟:ASP.Net MVC 控制器操作与 Web 表单

    ASP Net MVC 控制器操作与 ASP Net Web 表单之间的模拟有区别吗 在同一个 Web 项目中使用完全相同的代码 当从 Web 表单连接到 SQL Server 时 我能够成功模拟 Windows 用户 但不能从控制器操作连
  • 从独立应用程序运行加特林的正确方法是什么

    我需要从主应用程序启动加特林模拟 用例如下 应用程序读取规范 并根据该规范生成测试用例 测试用例被转换为加特林场景 这些场景在加特林模拟中运行 到目前为止 我设法通过 sbt 插件做到这一点 然而 如果我们想在其他上下文中重用我正在开发的工
  • 视图控制器类的出口应该是弱还是强?操作系统应用程序

    这就是我所做的 制作一个干净的 OSX 项目 转到 main xib 并拖动弹出控制器 这在界面生成器上创建了 2 个可见对象 我去了 appDelegate h 文件并做了 属性 assign IBOutlet NSViewControl
  • 如何使用 `boost::spirit` 将语法解析为 `std::set`?

    TL DR 如何解析 a 的结果boost spirit语法转化为std set 完整的问题陈述 作为学习如何使用的练习boost spirit 我正在为 X 500 LDAP 可分辨名称设计一个解析器 语法可以在 BNF 格式中找到RFC
  • 如何有效地合并两个数据集?

    我正在尝试通过一个通用 ID 合并两个相当大的数据集 但不是大得离谱 360 000 X 4 57 000 X 4 我尝试过常规的merge merge data table and sqldf 每次我总是内存不足 cannot alloc
  • 在二维数组中查找可用的“数字”

    我有这个问题需要以最有效的方式解决 我有一个二维数组 其中包含以下内容 凡是 1 的东西都是一堵 墙 这意味着你无法穿过它 2 是您 进入 阵列或地图 如果您愿意 的入口 3是我们需要找到的东西 这是地图的示例 1111111 1 3131
  • 尝试在 Box 中创建文件夹的共享链接时出现访问被拒绝的错误消息

    所以从我的上一个问题 https stackoverflow com questions 22098865 privileges required to return the list of enterprise users in box关
  • 在类 Test 中实例化类 Test 的成员是否是递归?

    这是递归吗 public class Test Test test new Test public static void main String args new Test 版本怎么样实例初始值设定项 http www programcr
  • db4o 从数据库查询对象的最佳实践

    我正在使用两种不同的方式来查询 db4o 中的对象 我想讨论一下 1 在第一个示例中 我创建了一个 ObjectContainer 实例 打开连接 然后关闭它 ObjectContainer db Db4oEmbedded openFile
  • 为什么 VS 2008 不支持 J#,这种语言已经死了吗?

    MS 放弃 J 了吗 目前我们通过 J 程序集与软件集成 有谁知道2010年是否会得到支持 这是回答您问题的链接 http social msdn microsoft com Forums en US visualjsharpgeneral
  • 根据具体情况填写清单

    我参加了一次面试 面试官给了我一个关于list的问题 例如 原始列表如下 0 1 0 0 2 0 0 1 the 2应该尽可能地填充列表 除非遇到 1 所以输出将是 0 1 2 2 2 2 2 1 一个例子 0 2 1 0 1 2 0 0
  • 按日期对多个数据框中的列求和

    在我看来 这听起来像是应该在本地完成的事情 但我只是无法在 Pandas 中找到执行此操作的函数 是的 我可能只是一个白痴 基本上 我们假设我有 df1 x y date 1 2 1 1 2020 2 3 2 1 2020 3 4 3 1
  • C程序-for循环中的fork命令

    我正在编写一个C程序 使用fork命令并循环10次 同时 每次循环都会显示进程ID 以下是我的代码 include
  • .NET core 在缺少 cookie 时返回 500 而不是 401

    我有一个使用 cookie 身份验证的 NET core API 它由具有自己的登录路由的 PWA SPA 访问 In Startup cs public void ConfigureServices IServiceCollection
  • 通过 WCF 发送实体框架实体:如何防止导航字段序列化?

    我在通过 WCF 发送具有导航属性的实体框架生成的实体时遇到问题 我有一个Securities用于存储财务数据的数据库以及其中的两个表 Stock Id Symbol CompanyName ExchangeName Option Id S
  • 如何在CSS中将span元素居中? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有三个 span 我想要一个接一个
  • 如何在课堂上支持 println?

    我自己制作的类需要支持什么才能println 打印它 例如 我有 public class A 应该对哪些方法进行分类A必须让这段代码工作吗 也许是这样的 public static void main A a new A System o
  • 使用 setRequestedConfiguration 后,不会调用 onConfigurationChanged

    我已经设置了活动来处理配置更改并且它有效 这意味着onConfigurationChanged 当方向改变时被调用 该活动有一个按钮可以显式更改方向 点击后 它调用了setRequestedOrientation ActivityInfo