我正在尝试改善我的Android应用程序。我在GridView 3x3中有主应用程序菜单(可能的操作)。我决定添加ViewPager来分隔网格。在添加ViewPager之前,我只有一个带有GridView的Activity。在我的onCreate方法中,我使用DisplayMetrics计算了窗口高度,以了解我的GridView项目应使用什么高度。
现在,我尝试将ViewPager与Fragments一起使用。我的活动与ViewPager和2个片段一起。每个Fragment具有相同的布局(LinearLayout中的GridView)。我正在尝试通过这种方式将屏幕高度传递给Fragment:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_grid_layout);
pageHeight = getHeight();
Log.d("HEIGHT", "Page height: "+pageHeight);
ViewPager viewPager;
viewPager = findViewById(R.id.main_menu_viewpager);
src = new ArrayList<MainPageTableFragment>();
/*Определяем количество страниц меню*/
int pagesCount = 2;
for (int i = 0; i < pagesCount; i++) {
src.add(MainPageTableFragment.newInstance(i, pageHeight));
}
FragmentPagerAdapter adapter = new ScreenSlidePagerAdapter(getSupportFragmentManager(), src);
viewPager.setAdapter(adapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabDots);
tabLayout.setupWithViewPager(viewPager, true);
}
因此,每次启动onCreate方法都应重新创建Fragments。
在Fragment中,我的身高是这样的:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.activity_main_grid_fragment, container, false);
gridView = rootView.findViewById(R.id.main_menu_grid);
//PROBLEM IS HERE...
height = this.getArguments().getInt("containerHeight");
pageNum = this.getArguments().getInt("pageNumber");
populateGridItems(); //method to load items in gridview
return rootView;
}
问题是:当我旋转设备时,所有方法都被调用,但是
height = this.getArguments().getInt("containerHeight");
使用旧值。例如,在第一次启动(垂直屏幕方向)时,它是690。当我旋转设备时,在onCreate中,我计算了新的高度(382),但是我的Fragment使用了旧值(690)。
我试图调用getArguments()在几个地方(onAttach,onCreate,onActivityCreated),但没有帮助。
谁能解释我,问题出在哪里,我该怎么办?
谢谢!
UPD: MainPageTableFragment的代码
public static MainPageTableFragment newInstance(int pageNumber, int height) {
Bundle args = new Bundle();
args.putInt("pageNumber", pageNumber);
args.putInt("containerHeight", height);
MainPageTableFragment fragment = new MainPageTableFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.activity_main_grid_fragment, container, false);
gridView = rootView.findViewById(R.id.main_menu_grid);
height = getArguments().getInt("containerHeight");
Log.d("HEIGHT", "Fragment height in onCreateView: "+height);
pageNum = getArguments().getInt("pageNumber");
populateGridItems();
return rootView;
}
private void populateGridItems() {
/*adding items in GridView*/
gridView.setAdapter(new MenuGridAdapter(this.getContext(), items, height));
}
}
答案 0 :(得分:1)
我不确定,但是我认为是由于supportFragmentManager
和pagerAdapter
造成的。
第一次在instantiateItem
中创建片段的名称,在destroyItem
中它只是分离片段。
然后,在instantiateItem
中旋转后,它会按名称找到片段,并使用旧实例代替新实例。我认为是为了优化等等。
作为解决方案,您可以根据需要从supportFragmentManager
中除去所有碎片,或覆盖instantiateItem/destroyItem
以除去碎片。
答案 1 :(得分:0)
我找到了另一种方法。在我的Activity中,我创建了用于计算高度的公共方法,在Fragment中的onCreateView中,我将此方法称为。有用。
但是对我来说,这是一个未知的问题:为什么片段的重现需要旧包中的参数值。