android configChanges属性

2023-11-08

给对应的Activity配置

android:configChanges="orientation|screenSize"

横竖屏切换就不会重新创建Activity。
学习到这个属性,是因为一个bug,activity上有tablayout+viewpager显示,在viewpager里用fragment填充,fragment的onCreateView里请求数据,在请求数据完成后,刷新完成更新界面。诶,这里感觉没什么问题,挺丝滑的

public class MyFragment extends Fragment {
    @BindView(R.id.tv_content)
    TextView tvContent;
    Unbinder unbinder;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Log.d("test", this + "onCreateView");
        View inflate = inflater.inflate(R.layout.fragment_my, container, false);
        unbinder = ButterKnife.bind(this, inflate);
        tvContent.setText(getArguments().getString("name"));

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                tvContent.setText("delay" + tvContent.getText().toString());
            }
        }, 2000);
        return inflate;
    }

    public static MyFragment newInstance(String name) {
        Bundle args = new Bundle();
        args.putString("name", name);
        MyFragment fragment = new MyFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d("test", this + "onDestroyView");
        unbinder.unbind();
    }
}
public class MainActivity extends AppCompatActivity {

    @BindView(R.id.tab_layout)
    TabLayout tabLayout;
    @BindView(R.id.view_pager)
    ViewPager viewPager;
    private List<MyFragment> fragmentList;
    private String[] titleArr = {"第一", "第二", "第三", "第四", "第五"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("test", this + "onCreate");
//        强制竖屏
//        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        ButterKnife.bind(this);
        fragmentList = new ArrayList<>();
        fragmentList.add(MyFragment.newInstance(titleArr[0]));
        fragmentList.add(MyFragment.newInstance(titleArr[1]));
        fragmentList.add(MyFragment.newInstance(titleArr[2]));
        fragmentList.add(MyFragment.newInstance(titleArr[3]));
        fragmentList.add(MyFragment.newInstance(titleArr[4]));
        viewPager.setAdapter(new MyFragmentPagerAdapter());
        tabLayout.setupWithViewPager(viewPager);
        viewPager.setOffscreenPageLimit(4);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d("test", this + "onConfigurationChanged");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("test", this + "onDestroy");
    }

    class MyFragmentPagerAdapter extends FragmentPagerAdapter {

        public MyFragmentPagerAdapter() {
            super(getSupportFragmentManager());
        }

        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return titleArr[position];
        }

        @Override
        public int getCount() {
            return fragmentList.size();
        }
    }
}

姿势一

但当,进入MainActivity界面由竖屏转横屏,会出现tvContent空指针。
由于进入MainActivity横屏,MainActivity会重新创建,在MyFragment的onDestoryView里有unbinder.unbind();导致tvContent空指针,日志如下

com.sign.fragmentdemo.MainActivity@e6a79aonCreate
MyFragment{6df5d84 #0 id=0x7f0d0075 android:switcher:2131558517:0}onCreateView
MyFragment{5123633 #1 id=0x7f0d0075 android:switcher:2131558517:1}onCreateView
MyFragment{3b6cdf0 #2 id=0x7f0d0075 android:switcher:2131558517:2}onCreateView
MyFragment{f34ff69 #3 id=0x7f0d0075 android:switcher:2131558517:3}onCreateView
MyFragment{398edee #4 id=0x7f0d0075 android:switcher:2131558517:4}onCreateView
MyFragment{6df5d84 #0 id=0x7f0d0075 android:switcher:2131558517:0}onDestroyView
MyFragment{5123633 #1 id=0x7f0d0075 android:switcher:2131558517:1}onDestroyView
MyFragment{3b6cdf0 #2 id=0x7f0d0075 android:switcher:2131558517:2}onDestroyView
MyFragment{f34ff69 #3 id=0x7f0d0075 android:switcher:2131558517:3}onDestroyView
MyFragment{398edee #4 id=0x7f0d0075 android:switcher:2131558517:4}onDestroyView
com.sign.fragmentdemo.MainActivity@e6a79aonDestroy
com.sign.fragmentdemo.MainActivity@8b438abonCreate
MyFragment{f87f376 #0 id=0x7f0d0075 android:switcher:2131558517:0}onCreateView
MyFragment{7bfede4 #1 id=0x7f0d0075 android:switcher:2131558517:1}onCreateView
MyFragment{98bf24d #2 id=0x7f0d0075 android:switcher:2131558517:2}onCreateView
MyFragment{8f7d102 #3 id=0x7f0d0075 android:switcher:2131558517:3}onCreateView
MyFragment{cbeca13 #4 id=0x7f0d0075 android:switcher:2131558517:4}onCreateView

姿势二

我们这里添加一个启动页面,点击启动页面会跳转到MainActivity,并且将这两个Activity都设置为强制竖屏,将手机横着拿,跳转到MainActivity,结果还是空指针了(此处,竖着拿,不会空指针)

public class WelcomeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);
//        强制竖屏
//        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        findViewById(R.id.tv_welcome).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
            }
        });
    }
}

日志如下:

com.sign.fragmentdemo.MainActivity@d426b08onCreate
MyFragment{8f7d102 #0 id=0x7f0d0075 android:switcher:2131558517:0}onCreateView
MyFragment{c800450 #1 id=0x7f0d0075 android:switcher:2131558517:1}onCreateView
MyFragment{9b26649 #2 id=0x7f0d0075 android:switcher:2131558517:2}onCreateView
MyFragment{195fb4e #3 id=0x7f0d0075 android:switcher:2131558517:3}onCreateView
MyFragment{bc1f46f #4 id=0x7f0d0075 android:switcher:2131558517:4}onCreateView
MyFragment{8f7d102 #0 id=0x7f0d0075 android:switcher:2131558517:0}onDestroyView
MyFragment{c800450 #1 id=0x7f0d0075 android:switcher:2131558517:1}onDestroyView
MyFragment{9b26649 #2 id=0x7f0d0075 android:switcher:2131558517:2}onDestroyView
MyFragment{195fb4e #3 id=0x7f0d0075 android:switcher:2131558517:3}onDestroyView
MyFragment{bc1f46f #4 id=0x7f0d0075 android:switcher:2131558517:4}onDestroyView
com.sign.fragmentdemo.MainActivity@d426b08onDestroy
com.sign.fragmentdemo.MainActivity@323688bonCreate
MyFragment{5702e44 #0 id=0x7f0d0075 android:switcher:2131558517:0}onCreateView
MyFragment{9bbf862 #1 id=0x7f0d0075 android:switcher:2131558517:1}onCreateView
MyFragment{882cdf3 #2 id=0x7f0d0075 android:switcher:2131558517:2}onCreateView
MyFragment{763eab0 #3 id=0x7f0d0075 android:switcher:2131558517:3}onCreateView
MyFragment{b2cbd29 #4 id=0x7f0d0075 android:switcher:2131558517:4}onCreateView

过程:MainActivity创建后->加载完fragment->fragment销毁->MainActivity销毁->MainActivity新建
终于可以照应标题了,给MainActivity配置

android:configChanges="orientation|screenSize"

横竖屏切换就不会重新创建Activity。
Activity不会重新创建,fragment也就不会被销毁,也就不会空指针了。
日志如下:

D/test: com.sign.fragmentdemo.MainActivity@7bb487onCreate
D/test: MyFragment{9b26649 #0 id=0x7f0d0075 android:switcher:2131558517:0}onCreateView
D/test: MyFragment{bc1f46f #1 id=0x7f0d0075 android:switcher:2131558517:1}onCreateView
D/test: MyFragment{6e9157c #2 id=0x7f0d0075 android:switcher:2131558517:2}onCreateView
D/test: MyFragment{fb21e05 #3 id=0x7f0d0075 android:switcher:2131558517:3}onCreateView
D/test: MyFragment{da7e5a #4 id=0x7f0d0075 android:switcher:2131558517:4}onCreateView
D/test: com.sign.fragmentdemo.MainActivity@7bb487onConfigurationChanged

(但其实不加unbinder.unbind();也不会空指针,我们还是要保持探索科学的态度)
然后,却有一个我解释不了的问题,走过路过的大神还望指点一二。

姿势三

我们把上个步骤的android:configChanges属性去掉,将WelcomeActivity中的强制横屏代码注掉,将手机横着拿,跳转到MainActivity,此处不会出现空指针,对比姿势二,我们只是把WelcomeActivity的强制横屏注掉了
日志如下:

com.sign.fragmentdemo.MainActivity@9d3b797onCreate
com.sign.fragmentdemo.MainActivity@9d3b797onDestroy
com.sign.fragmentdemo.MainActivity@992ae9eonCreate
MyFragment{fb21e05 #0 id=0x7f0d0075 android:switcher:2131558517:0}onCreateView
MyFragment{6700d68 #1 id=0x7f0d0075 android:switcher:2131558517:1}onCreateView
MyFragment{83b9581 #2 id=0x7f0d0075 android:switcher:2131558517:2}onCreateView
MyFragment{bb22626 #3 id=0x7f0d0075 android:switcher:2131558517:3}onCreateView
MyFragment{9de0267 #4 id=0x7f0d0075 android:switcher:2131558517:4}onCreateView

我们发现和姿势二日志的对比,就是MainActivity在创建完就销毁了,并且MyFragment的onCreateView还没有执行就被销毁的,此处???我也不知道为什么

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

android configChanges属性 的相关文章

  • Kotlin Android Firebase 数据库哈希映射转换为类

    我正在尝试从 firebase 数据库获取数据 断点显示它正在获取数据 但看起来我没有正确地将其分配给我的班级 这会导致此异常 java lang ClassCastException 无法将 java util HashMap 转换为 班
  • 如何以编程方式判断蓝牙设备是否已连接?

    我了解如何获取已配对设备的列表 但如何判断它们是否已连接 这一定是可能的 因为我看到它们列在我手机的蓝牙设备列表中 并且它说明了它们的连接状态 将蓝牙权限添加到您的AndroidManifest中
  • 清晰的图标 清晰的 Android 应用程序

    你好 下午好 关于如何提高图标的 png 质量 有什么想法吗 我使用了 Android 开发者页面上的套件 但我无法获得清晰的图像 我的意思是非常清晰 我是否需要以不同的方式加载此图标 而不仅仅是拖入我的布局 谢谢 我使用这个布局
  • 在 Android 市场中以编程方式检查我的应用程序版本

    目前 我正在启动时检查应用程序版本代码 并将其与我的服务器上的最新版本代码进行匹配 并根据此匹配 我发送用户从 Android 市场获取最新更新 它运行良好 但我的问题是我必须手动更改服务器上的最新版本代码 并且我不知道新版本何时发布APK
  • 不使用eclipse安装Android模拟器

    如何在没有eclipse的电脑上安装android模拟器 android模拟器无需安装eclipse 只需下载 android sdk 并安装即可 安装android SDK之前必须先安装JDK 完成后安装成功 您将获得两个应用程序 SDK
  • 无法接收UsbManager.ACTION_USB_DEVICE_ATTACHED/UsbManager.ACTION_USB_DEVICE_DETACHED的广播Intent

    我最近正在编写一个 USB 主机应用程序 但它被卡住了 因为我无法检测到设备连接 分离事件 我遵循了编码说明http developer android com guide topics connectivity usb host html
  • Android 音乐播放器应用程序:如何为服务中运行的媒体播放器设置完整的侦听器?

    我正在编写一个音乐播放器应用程序 我在服务中有 MediaPlayer 对象 问题是 我不知道如何从服务更新用户界面 例如 我想更新当前歌曲的剩余时间 但是 因为 MediaPlayer 正在服务 我无法设置 MediaPlayer 对象的
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • 何时调用 glMatrixMode()

    我所关注的大多数 Android OpenGL ES 教程都有其 onSurfaceChanged 函数 如下所示 public void onSurfaceChanged GL10 gl int width int height gl g
  • 片段活动中的 commitAllowingStateLoss()

    我的应用程序使用片段活动 它仅处于纵向模式 无法旋转屏幕 最初我使用的是commit 方法 但现在我计划不加区别地将这些更改为commitAllowingStateLoss 对于碎片活动 是否有任何理由不不加区别地执行此操作而不重新评估我使
  • Android中如何使用intent加载本地html页面?

    我的 asset 目录中有一个 html 文件 我必须使用 Intent 将其加载为浏览器应用程序 这是我的代码 但它不起作用 startActivity new Intent Intent ACTION VIEW Uri parse fi
  • 本地管理的广播接收器泄漏?

    当应用程序被系统杀死时 本地 即使用 LocalBroadcastManager 管理 BroadcastReceiver 是否有可能泄漏 我需要它的具体用例是我想在活动的 onCreate onDestroy 中注册 注销 Broadca
  • Fresco:滚动 RecyclerView 后图像消失

    我有一个 Horizo ntal RecyclerView 每个项目都有一个使用 Facebook Fresco 图像库加载到其中的图像 然而 虽然正确的图像最初是在屏幕上滚动一点时加载的 但当 RecyclerView 进一步滚动时 它就
  • 如何在Room的数据库迁移中正确添加索引?

    我在迁移 Room 数据库时遇到问题 在更新的数据库中 我必须将一个字段从整数更改为双精度值 我读到它并不像听起来那么容易 为了做到这一点 我必须使用这个更改后的属性创建新的临时表 复制前一个表中的所有值 删除旧的值 最后重命名临时表 我的
  • 有没有办法创建 PWA(渐进式 Web 应用程序)的 Android 桌面小部件?

    我正在构建一个渐进式 Web 应用程序 有没有办法创建 Android 桌面小部件 None
  • 如何让surfaceview透明

    大家好 我想让我的 DrawingSurface 视图透明 我尝试了很多东西 但它不起作用 这是我的 xml 代码 使我的表面视图透明
  • Android:从 PhoneGap 应用打开 Play 商店链接

    我想从我的phonegap 3 4 应用程序打开一个指向Google Play 商店的链接 呼唤market details id com google android apps maps导致 ActivityNotFoundExcepti
  • 如何获取Android中的所有主屏幕?

    我是安卓开发新手 我知道每个主屏幕都是启动器中的一个工作区 我想获取屏幕上所有应用程序图标的所有位置信息 那么有没有办法获取这些屏幕对象及其图标信息的列表 ADD 我更期待的是应用程序图标和屏幕之间的关系 例如 我想要某个应用程序图标的位置
  • Android:选择 EditField 上焦点上的所有文本

    我试图让 Android 在获得焦点时选择 EditText 字段中的所有文本 我在布局中使用此属性 在两个字段上 android selectAllOnFocus true 我不确定这是否相关 但为了将光标移动到第一个可编辑字段 前面 还
  • Android Webview隐私浏览

    我在我的 Android 应用程序中使用 webview 从多个站点获取一些网页 我对 webview 行为有一些疑问 webview 是否存储历史记录 cookie 表单自动填充信息 如果是的话 我们可以阻止它这样做吗 如果 Webvie

随机推荐

  • jmeter——生成多样的接口自动化html报告

    jmeter 生成多样的接口自动化html报告 一 实现目的 二 实现效果 1 jmter自带的HTML报告 2 jmeter ant报告优化 3 批量执行jmeter工具 4 jmeter allure生成测试报告 三 实现方案 1 jm
  • 数据结构与算法——线性表

    个人主页 bit 系列专栏 Linux Ubuntu 入门必看 C语言刷题 目录 2 1线性表的定义和特点 2 2 案例引入 2 3 线性表的定义 2 1线性表的定义和特点 线性表是具有相同特新的数据元素的一个有限序列 列如 同一线性表中的
  • 解决:Error [ERR_REQUIRE_ESM]: require() of ES Module C:\Users\辰之星\AppData\Roaming\npm\node_modules\n

    解决 Error ERR REQUIRE ESM require of ES Module C Users 辰之星 AppData Roaming npm node modules nrm node modules open index j
  • 特征工程是什么?

    特征工程是指对原始数据进行预处理和转换 以提取出对机器学习算法建模有用的特征的过程 特征工程是机器学习中非常重要的一步 它可以显著影响模型的性能 下面是一些常见的特征工程技术和方法 数据清洗 处理缺失值 异常值和重复值 确保数据的质量和完整
  • taro请求工具封装

    taro框架是一个跨端兼容的开发框架 自带了请求相关的API 虽然灵活 但是封装程度并不高 会导致比较多的代码冗余 因此封装了一个请求相关的工具 思路如下 1 请求和响应需要拦截器 针对不同的情况做不同的处理 2 开发中分为开发 测试 生成
  • Ajax跨域问题

    什么是跨域问题 跨域问题来源于JavaScript的 同源策略 即只有 协议 主机名 端口号 如存在 相同 则允许相互访问 也就是说JavaScript只能访问和操作自己域下的资源 不能访问和操作其他域下的资源 跨域问题是针对JS和ajax
  • ELK多个日志文件创建多个项目索引

    一 背景 我的elk架构是filebeat redis logstash elasticsearch kibana 我的想法是 我一台服务器多个程序有多个日志文件 在kibana里面想创建不通项目索引 指定不同日志文件 二 问题及解决思路
  • python环境安装和激活

    开始学习python了 环境的安装对与新手来说就变的比较麻烦 这里就会为大家介绍pycharm和python解释器的安装 python解释器的安装 这里介绍windows安装方式 mac安装方法类似 python解释器下载地址 https
  • STL源码阅读-traits与迭代器

    迭代器模式 提供一种方法 使之能够依序访问容器的各个元素 而又无需暴露容器的内部表述方式 STL设计的中心思想在于将数据容器和算法分离开 容器和算法分开设计 迭代器则是两者之间的胶着剂 一般迭代器的设计与容器细节相关 所以一般交给容器的设计
  • 《Effective C++》 全书内容提炼总结

    个人博客地址 https cxx001 gitee io 本文阅读说明 孔子云 取乎其上 得乎其中 取乎其中 得乎其下 取乎其下 则无所得矣 对于读书求知而言 这句古训教我们去读好书 最好是好书中的上品 经典书 Effective C 就是
  • 通过CSS实现 文字渐变色 的两种方式

    主要实现文字渐变色有两种方式 background 属性 mask 属性 1 background 属性 效果图如下 span 这 span
  • 一个30岁光棍的内心独白

    人已三十开外 至今独赏天籁 好想有个太太 为我洗衣做菜 现实却很无奈 让我继续等待 也因寂寞难耐 谈过几次恋爱 谁知屡战屡败 轻轻松松被踹 其实我也奇怪 为啥总遭淘汰 历尽打击伤害 总算知道大概 嫌我不讲穿戴 嫌我长的不帅 熊猫长的不帅 却
  • 代价函数(Cost Function)

    基本概念 代价函数也被称作平方误差函数 有时也被称为平方误差代价函数 我们之所以要求出误差的平方和 是因为误差平方代价函数 对于大多数问题 特别是回归问题 都是一个合理的选择 还有其他的代价函数也能很好地发挥作用 但是平方误差代价函数可能是
  • 腾讯云服务器开通root用户

    01 开通root用户 sudo passwd root 输入 root 的密码 按Enter 重复输入 root 的密码 按Enter 返回如下信息 即表示 root 密码设置成功 passwd password updated succ
  • 信号完整性之差分对

    差分传输 差分互连方式中 使用两条传输线来传输信号 差分驱动器有两个输出端 这两个输出端同时输出信号 理想情况下两个信号边沿对齐 但是翻转方向相反 如下图所示 两个信号沿着各自的传输线传输 到达接收器时 接收器对两个信号进行差分检测 从两个
  • CodeForces 920C Swap Adjacent Elements

    题目大意 题目链接 给定一个序列 这个序列可以理解为一个1 n的全排列 再给出一个01串 1表示可以将索引i和i 1进行交换 且交换可以发生任意次 0表示不可以 问最后能不能将序列升序排列 题解 几乎 秒杀 因为简单 判断每个索引处的数能不
  • 数据库——关系数据库规范化习题

    对以下的关系模式 分别写出 1 码 主属性 非主属性 2 函数依赖 3 属于第几范式 为什么 4 有什么问题 5 如何分解 分解后能否达到几范式 原问题是否解决 ps 函数依赖的方法 1 先找出码 再写出码函数依赖 码 其他属性 2 再写出
  • 电脑宝马,大量宝马车电脑通病故障检修方法

    车型 宝马X5 X6 N55发动机 故障现象 报电子节气门故障 解决方法 检测那个芯片更换即可 车型 宝马E60 E66 E65 故障现象 天使眼不亮 解决方法 刷此程序即可 故障现象 手刹不好用 报内部故障 解决方法 将此处焊接即可 车型
  • 【git】2、gitlab CICD 模型部署自动化

    文章目录 一 GitLab 二 GitLab CI CD 2 1 gitlab ci yml 2 1 1 基础概念 2 1 2 创建 yml 文件 2 1 3 yml 文件中的关键字 2 2 GitLab Runner 一 GitLab G
  • android configChanges属性

    给对应的Activity配置 android configChanges orientation screenSize 横竖屏切换就不会重新创建Activity 学习到这个属性 是因为一个bug activity上有tablayout vi