【问题标题】:Fragments in ViewPager is not displayer after popBackStackViewPager 中的片段在 popBackStack 后不显示
【发布时间】:2017-12-27 03:58:04
【问题描述】:

我有问题:使用popBackStack 从另一个片段返回后,片段未重新附加到其托管 ViewPager。

一个 Activity 托管一个 Fragment,其布局包含一个 ViewPager。 ViewPager 由 FragmentStateViewPagerAdapter 填充。分页器中托管的 Fragment 可以打开子页面列表,其中包含一组新页面。只要不按下后退按钮,一切都可以正常工作。一旦用户关闭其中一个子页面,就会重新创建前一个页面,但没有先前显示的页面(带有空白页面的空页面)。我已搜索但仍未解决我的问题。

TestProject的完整代码可以在Github找到

MainActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val ft = supportFragmentManager.beginTransaction()
        ft.add(R.id.frameLayout, HomeFragment.newInstance())
        ft.commit()
    }
}

HomeFragment

public class HomeFragment extends Fragment {


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_home, container, false);

        TabLayout tabLayout = v.findViewById(R.id.tabLayout);

        ViewPager viewPager = v.findViewById(R.id.viewPager);
        VPAdapter adapter = new VPAdapter(getFragmentManager());

        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager);

        return v;
    }

    public static Fragment newInstance() {
        return new HomeFragment();
    }
}

VPAdapter:

public class VPAdapter extends FragmentStatePagerAdapter{


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

    @Override
    public Fragment getItem(int position) {
        return TabFragment.newInstance(position);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "TAB " + position;
    }

    @Override
    public int getCount() {
        return 2;
    }
}

标签片段:

public class TabFragment extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e("TAB", "onCreate");
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Log.e("TAB", "onCreateView");
        return inflater.inflate(R.layout.fragment_tab, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Bundle args = getArguments();
        if (args != null) {
            int tabIndex = args.getInt("tab_index", 0);
            TextView tv = view.findViewById(R.id.textView);
            tv.setText(String.format(Locale.getDefault(), "TAB FRAGMENT INDEX %d", tabIndex));
        }

        Button button = view.findViewById(R.id.button);
        button.setText("Open Next Fragment");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.frameLayout, LastFragment.newInstance());
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
            }
        });
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("TAB", "onDestroy");
    }

    public static Fragment newInstance(int index) {
        Bundle args = new Bundle();
        args.putInt("tab_index", index);
        TabFragment tab = new TabFragment();
        tab.setArguments(args);
        return tab;
    }
}

最后一个片段:

public class LastFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_last, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        view.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getFragmentManager().popBackStack();
            }
        });
    }

    public static Fragment newInstance() {
        return new LastFragment();
    }
}

【问题讨论】:

标签: android android-fragments android-viewpager fragmentstatepageradapter


【解决方案1】:

你必须使用getChildFragmentManager() Viewpager 来适应 Popback 功能。

VPAdapter adapter = new VPAdapter(getChildFragmentManager());

You Can Refer this Documentation on ChildFragmentManager()

【讨论】:

  • 您还需要使用getActivity().getSupportFragmentManager().beginTransaction(); 更新 TabFragment 以获得活动的 FragmentManager 而不是父级的 childFragmentManager
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多