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