【问题标题】:Accessing fragment view on orientation change访问有关方向更改的片段视图
【发布时间】:2016-08-10 09:51:04
【问题描述】:

我正在使用 FragmentStatePagerAdapter 实现 ViewPager。代码示例如下。

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {

    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        Log.d("--GetItem", "---");

        switch (position) {

            case 0:
                return ScreenSlidePageFragment.newInstance(b1);
            case 1:
                return ScreenSlidePageFragment.newInstance(b2);
            case 2:
                return ScreenSlidePageFragment.newInstance(b3);
            default:
                return null;
        }

    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Log.d("--InstItem", "--");
        return super.instantiateItem(container, position);

    }

    @Override
    public int getCount() {
        return NUM_PAGES; //set as 3
    }


}

ScreenSlidePageFragment如下。

public class ScreenSlidePageFragment extends Fragment implements View.OnClickListener{


    Bundle b;

    public ScreenSlidePageFragment() {

    }


    @Override
    public void onCreate(Bundle savedInstanceState) {

        Log.d("----onCreateFrgmnt--", "11");

        super.onCreate(savedInstanceState);



    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        Log.d("----onCreateViewFrgmnt-", "11");

        ViewGroup rootView = (ViewGroup) inflater.inflate(
                R.layout.fragment_screen_slide_page, container, false);

        return rootView;

    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

        super.onViewCreated(view, savedInstanceState);

        Log.d("----onViewCreatedFrgmnt", "11");


        b = getArguments();

        TextView tv_city = (TextView) view.findViewById(R.id.city_field);
        TextView tv_update = (TextView) view.findViewById(R.id.updated_field);
        TextView tv_day = (TextView) view.findViewById(R.id.day);

        tv_day.setText("DAY " + String.valueOf(b.getInt("day")));
        tv_city.setText(b.getString("city"));

        tv_update.setText("Last update on : " + b.getString("date"));

    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    public static ScreenSlidePageFragment newInstance(Bundle myBundle) {

        ScreenSlidePageFragment f = new ScreenSlidePageFragment();
        f.setArguments(myBundle);
        return f;
    }
}

MainActivity 中,我正在尝试处理方向更改。我使用以下代码。

if (savedInstanceState != null) {

    setContentView(R.layout.activity_main);

    myViewPager = (MyCustomViewPager) findViewById(R.id.pager);


    b1 = savedInstanceState.getBundle("Fragment1");
    b2 = savedInstanceState.getBundle("Fragment2");
    b3 = savedInstanceState.getBundle("Fragment3");



    myViewPager.setOffscreenPageLimit(NUM_PAGES - 1);

    myPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());

    myViewPager.setAdapter(myPagerAdapter);

}

碎片在方向改变时重新创建。 onCreateViewonViewCreated 正在被调用(检查 LogCat)。当我尝试更新片段中的视图时出现问题。对于更新,我使用以下代码:

FragmentStatePagerAdapter adapter = (FragmentStatePagerAdapter) myViewPager.getAdapter();

ScreenSlidePageFragment fragment1 = (ScreenSlidePageFragment) adapter.instantiateItem(myViewPager, 0);
ScreenSlidePageFragment fragment2 = (ScreenSlidePageFragment) adapter.instantiateItem(myViewPager, 1);
ScreenSlidePageFragment fragment3 = (ScreenSlidePageFragment) adapter.instantiateItem(myViewPager, 2);

但是当我调用 fragment1.getView() 时,它返回 null。但是,当我不改变方向时,相同的代码运行良好。

如何获取有关方向更改的片段视图?我检查了一些他们说将片段保存在数组中的解决方案,但这些对我不起作用。我输入的代码是否无法完成任务?谢谢。

【问题讨论】:

    标签: android android-viewpager fragment orientation-changes


    【解决方案1】:

    只要您不更新片段(仅在方向更改时发生),您的代码就可以正常运行。

    但是,您的更新代码将始终为 getView() 返回 null,因为尚未创建视图。 instantiateItem() 将在调用时创建一个新的 Fragment,它尚未添加到您的应用程序中,并且尚未调用所有生命周期回调(包括 onCreateView(...)onViewCreated(...))。

    由于正确更新ViewPager 的片段的复杂性,我将向您推荐优秀的existing answer。您也可以在this question找到更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多