android configChanges属性

给对应的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还没有执行就被销毁的,此处???我也不知道为什么

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值