美好的一天,我有一个小问题,我似乎无法理解它。我有一个包含3个片段的ViewPager,这个ViewPager包含在FrameLayout中。我想要做的是,对于每个片段,FrameLayout的背景图像都会发生变化。
我的FragmentActivity是:
pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), fragments);
pager = (ViewPager)findViewById(R.id.viewpager);
pager.setAdapter(pagerAdapter);
在我的MyPagerAdapter中,我在getItem()方法中实例化片段:
@Override
public Fragment getItem(int position) {
return MyFragment.newInstance(position);
}
现在我可以使用位置
正确设置片段中视图的值 public static MyFragment newInstance(int position){ //Add arraylist of hashmaps to populate it here.
MyFragment my_fragment = new MyFragment();
Bundle bundle = my_fragment.getArguments();
if(bundle == null){
bundle = new Bundle();
}
bundle.putInt(FRAGMENT_POSITION, position);
my_fragment.setArguments(bundle);
return my_fragment;
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Bundle args = getArguments();
if(args != null){
position = args.getInt(FRAGMENT_POSITION);
}
//do other operations and Methods on views based on position.
然后在某个时候,我调用一个方法`((MyFragmentActivity)getActivity())。setLayoutBackground(resId),它在容器Activity中设置FrameLayout的背景。我的麻烦在于,由于ViewPagers将所有片段加载在一起的性质,我似乎无法区分调用哪个片段,并且我一直为ViewPager中的所有片段获得相同的背景。
在MyFragmentActivity中,我尝试在PageChangeListener中更改它,但没有运气,我注意到我一直传递相同的值,所以继续得到相同的东西。
public void setLayoutBackground(int resId){
layoutResId = resId;
pager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int pos) {
app.setBackground(layout, layoutResId)
//Log.d(TAG, "i am resId" + layoutResId);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
我需要做的是将片段的位置传递给FragmentActivity,以便加载正确的背景,但似乎无法弄明白。 (可绘制的背景是基于一个逻辑,所以我不能从一开始就定义它)任何想法如何我可以去做这个或我可能做错了因为它已经处理了我的周末到目前为止...: )非常感谢提前。
答案 0 :(得分:0)
不要让Fragment直接设置布局背景,而是在Activity中添加一个HashMap<Integer, Integer> fragmentBackgrounds;
字段变量,并将方法调用替换为((MyFragmentActivity)getActivity()).setLayoutBackground(resId)
((MyFragmentActivity)getActivity()).setFragmentBackground(position, resId)
,其中Activity将放入resId使用表示位置的键和表示resId的值进入fragmentBackgrounds
映射。在PageChangeListener的onPageSelected()
方法中,使用它为您提供的位置在地图中查找该片段所需的片段,并设置当时的布局背景(除非键不存在或者当然值为null或0。
您还应该考虑不以您的方式调用setFragmentBackground,因为这假设托管活动始终是MyFragmentActivity
的实例,而应该定义一个setFragmentBackground
的接口方法并使Activity实现该接口。然后,在Fragment中重写onAttach
,检查附加了Fragment的Activity是否实现了instanceof
的接口,并将Activity分配给Fragment中名为listener
的字段变量。在onDetach()
中,将侦听器设置为null,并在调用侦听器之前始终检查侦听器是否为null。