文章目录

  • 前言
  • 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中的方向改变