写在开头:实践了大大的思路–> Android Fragment与Activity之间的数据交换(Fragment从Activity获取数据)
问题:当手机开启自动旋转时,进入Fragment(这里面加载一个网格布局)时,横屏情况下网格布局列数应该是4列,竖屏情况下2列,但是第一次横屏进去时,一直显示2列,这就导致了内容拉伸
解决:
1、判断手机是不是开启了自动旋转
这里引用自–> 安卓手机 自动旋转 功能开启状态获取
感谢CoderUp大大~
Activity中:
int spanCount;
FragmentTransaction ft;
@Override
public void onCreate(Bundle savedInstanceState) {
...
// 创建Fragment(MyFragment是自定义的)
Fragment fragment = new MyFragment(type);
// 手机开启了自动旋转
if (isScreenAutoRotate(getApplicationContext())){
// 横屏情况
if(判断是不是横屏){
// 设置横屏的列数
spanCount = 4;
// 保存数据 - (在Fragment中调用) - 网格布局的列数
Bundle bundle = new Bundle();
bundle.putInt("spanCount",spanCount);
fragment.setArguments(bundle);
}
}
//启动编辑操作-获取到 FragmentTransaction 类的实例
ft = getSupportFragmentManager().beginTransaction();
//替换添加到容器中的现有片段
ft.replace(R.id.View, fragment, "preview");
//提交-FragmentTransaction的最后一步:commit(),不会立即生效
ft.commit();
...
}
/** 判断是否开启了 “屏幕自动旋转”,true则为开启 */
public static boolean isScreenAutoRotate(Context context) {
int gravity = 0;
try {
gravity = Settings.System.getInt(context.getContentResolver(),
Settings.System.ACCELEROMETER_ROTATION);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
return gravity == 1;
}
2、在Fragment中获取
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
...
// 获取Activity中的spanCount
Bundle bundle = getArguments();
if (bundle != null){
list_LayoutManager(bundle.getInt("spanCount"));
}else { }
...
}
//自动旋转且横屏时 - 列表布局管理的列数为在Activity获取的spanCount
public void list_LayoutManager(int spanCount){
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);
}