文章目录
- 前言
- Reference,感谢!!
- 一、获取方向配置的改变
- 二、遇到的问题
- 总结
前言
转动手机,方向改变,Fragment中某一数值改变
Reference,感谢!!
fragment在横竖屏切换(屏幕旋转)时候崩溃的问题 该篇提到使用onConfigurationChanged()方法,可以通过该方法去实时获取方向的变化
如继续了解可看这篇文章onConfigurationChanged方法介绍及问题解决
一、获取方向配置的改变
Fragment中:
// 网格布局管理器
GridLayoutManager manager;
// 列数
int spanCount;
// 初始化屏幕方向
int currentOrientation = Configuration.ORIENTATION_PORTRAIT;
/** 方向配置发生变化时系统调用的方法 */
/** 屏幕方向发生改变时 - 需要在清单中配置android:configChanges="orientation|screenSize*/
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// 方向改变为横屏情况下,全局变量spanCount设置为6
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
spanCount = 6;
setRc_list_LayoutManager();
}
// 方向改变为竖屏情况下,全局变量spanCount设置为3
else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
spanCount = 3;
setRc_list_LayoutManager();
}
currentOrientation = newConfig.orientation;
}
/**列表-网格布局管理方法*/
public void setRc_list_LayoutManager(){
manager = new GridLayoutManager(getContext(), spanCount);
//网格布局管理器-设置item占据几个位置
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
//判断是标题时占spanCount个位置
if (mData2.get(position).isTitle()){ return spanCount; }
//非标题占1个位置
else return 1;
}
});
rc_list.setLayoutManager(manager);
}
/** 初始化显示界面方法 */
private void initView(View view){
// 横屏情况下网格布局显示6列
if (AlbumDataHelper.getInstance().currentOrientation == Configuration.ORIENTATION_LANDSCAPE){ spanCount = 6; setRc_list_LayoutManager(); }
// 竖屏情况下网格布局显示3列
else if (AlbumDataHelper.getInstance().currentOrientation == Configuration.ORIENTATION_PORTRAIT){ spanCount = 3;setRc_list_LayoutManager(); }
}
二、遇到的问题
当把手机拿着的时候旋转方向的改变是正确的,但是当旋转一遍之后把手机平放在桌面的时候,他的旋转是不正确的!
假设此时我将手机旋转成横屏,然后放在桌面上,此时列数加载的是3而不是6!
!!此时不知道为什么会重新走initView()方法,全局变量默认的方向是竖屏的,于是此时变成了3;此时的解决方法是
将Fragment中设置的全局变量提取到别的可以被当前fragment获取数值的类中去
我这里是放到了这个类里面
//AlbumDataHelper
public class AlbumDataHelper{
...
private volatile staticDataHelper instance;
/** 初始化方向 */
public int currentOrientation = ORIENTATION_PORTRAIT;
/** 获取单例对象 */
public static DataHelper getInstance() {
if (instance == null) {
synchronized (AlbumDataHelper.class) {
if (instance == null) {
instance = new DataHelper();
}
}
}
return instance;
}
}
那么在使用currentOrientation这个变量的地方
Fragment类中onConfiguration方法中去替换
原来
currentOrientation = newConfig.orientation;
现在
AlbumDataHelper.getInstance().currentOrientation = newConfig.orientation;由此上,问题解决!不会再走initView(),旋转方向正确。
总结
当需要在Fragment中实时监听手机方向改变时,可使用onConfigurationChanged()方法,写个常量保存onConfigurationChange中的方向改变