【问题标题】:Replace Fragment with another in ViewPager在 ViewPager 中将 Fragment 替换为另一个 Fragment
【发布时间】:2016-07-17 18:12:47
【问题描述】:

当我尝试在 ViewPager 中将一个 Fragment 替换为另一个 Fragment 时遇到了一些问题。

  • 我有一个有 5 页的 ViewPager,每一页都是一个片段。在第一页,我有一个回收站视图。当我单击该 recyclerview 的一个项目时,我使用 addOnItemTouchListener 方法来处理该事件。
  • 点击recyclerview项目时,我想用另一个Fragment(“sub_category”)替换Fragment(categoryFragment)。

代码

ShopPanel Activity(包含 ViewPager 和 TabLayout)

ShopPanel.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
tools:context="com.hyperfresh.sorooshpardaz.hyperfreshcustomer.ShopPanel">
<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:background="@drawable/toolbarshop">
</android.support.v7.widget.Toolbar>
<android.support.v4.view.ViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"/>
<android.support.design.widget.TabLayout
    android:id="@+id/tab_layout"
    style="@style/AppTabLayout"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:background="@color/white"
    app:tabGravity="fill"/></LinearLayout>

ShopPanel.java

public class ShopPanel extends AppCompatActivity {

private TabLayout mTabLayout;

private int[] mTabsIcons = {
        R.drawable.menux,
        R.drawable.search,
        R.drawable.favorites,
        R.drawable.gift,
        R.drawable.home
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shop_panel);


    final ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
    final MyPagerAdapter pagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
    if (viewPager != null)
        viewPager.setAdapter(pagerAdapter);
    //  viewPager.setCurrentItem(pagerAdapter.PAGE_COUNT-2,false);
    mTabLayout = (TabLayout) findViewById(R.id.tab_layout);


    if (mTabLayout != null) {
        mTabLayout.setupWithViewPager(viewPager);

        for (int i = 0; i < mTabLayout.getTabCount(); i++) {
            TabLayout.Tab tab = mTabLayout.getTabAt(i);
            if (tab != null)
                tab.setCustomView(pagerAdapter.getTabView(i));
        }

        mTabLayout.getTabAt(0).getCustomView().setSelected(true);
    }

    viewPager.post(new Runnable() {
        @Override
        public void run() {
            viewPager.setCurrentItem(0);

        }
    });

}
private class MyPagerAdapter extends FragmentPagerAdapter {

    public final int PAGE_COUNT = 5;

    private final String[] mTabsTitle = {"Menu","Search","Favorites","Gift","Home"};

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

    public View getTabView(int position) {
        // Given you have a custom layout in `res/layout/custom_tab.xml` with a TextView and ImageView
        View view = LayoutInflater.from(ShopPanel.this).inflate(R.layout.custom_tab, null);
        TextView title = (TextView) view.findViewById(R.id.title);
        title.setText(mTabsTitle[position]);
        ImageView icon = (ImageView) view.findViewById(R.id.icon2);
        icon.setImageResource(mTabsIcons[position]);
        return view;
    }

    @Override
    public Fragment getItem(int pos) {
        switch (pos) {

            case 0:
                categoryFragment category = new categoryFragment();
                return category;
            case 1:
                searchFragment search = new searchFragment();
                return search;
            case 2:
                favoritesFragment favorites = new favoritesFragment();
                return favorites;
            case 3:
                giftFragment gift = new giftFragment();
                return gift;
            case 4:
                homeFragment home = new homeFragment();
                return home;
        }
        return null;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return mTabsTitle[position];
    }


}}

categoryFragment 第一个片段

public class categoryFragment extends Fragment {
private static final String REGISTER_URL = "http://torshiforoosh.ir/service/category.php";
List<categoryModel> categoryModelList;
AutofitRecyclerView re;
private final static String TAG = "categoryFragment";

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.category, container, false);
    re = (AutofitRecyclerView) view.findViewById(R.id.re);
    //StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
    //GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(),2);
    re.addItemDecoration(new MarginDecoration(getActivity()));
    re.setHasFixedSize(true);
    re.setItemAnimator(new DefaultItemAnimator());
    updatelist();
    re.addOnItemTouchListener(new RecyclerItemClickListener(getContext(), new RecyclerItemClickListener.OnItemClickListener() {
        @Override public void onItemClick(View view, int position) {
            //startActivity(new Intent(getActivity(), delivery.class));
            //sub_category sub_category = new sub_category();
            FragmentManager fragMgr = getFragmentManager();
            FragmentTransaction ft = fragMgr.beginTransaction();
            ft.addToBackStack(null);
            ft.replace(R.id.view_pager, new sub_category(), TAG);
            ft.commit();
        }
    }));
    return view;
}

private void updatelist() {
    StringRequest stringRequest = new StringRequest(Request.Method.GET, REGISTER_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    categoryModelList = categoryParser.parseFeedCategory(response);
                    categoryAdapter categoryAdapter = new categoryAdapter(categoryModelList,getActivity().getApplicationContext());

                    re.setAdapter(categoryAdapter);
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            Toast.makeText(getActivity(),"اینترنت خود را چک کنید",Toast.LENGTH_SHORT).show();
        }
    });
    RequestQueue queue = Volley.newRequestQueue(getActivity());
    queue.add(stringRequest);
}}

当我点击 recyclerview 项目时,第一页出现白色视图。

【问题讨论】:

    标签: android android-fragments android-viewpager android-fragmentactivity android-tablayout


    【解决方案1】:

    您可以在片段布局中添加 frameLayout 并替换

            FragmentManager fragMgr = getFragmentManager();
            FragmentTransaction ft = fragMgr.beginTransaction();
            ft.addToBackStack(null);
            ft.replace(R.id.view_pager, new sub_category(), TAG);
            ft.commit();
    

    与:

    getChildFragmentManager().beginTransaction().add(*frameLayout ID* , new sub_category(), tag).commit();
    

    【讨论】:

    • 我创建了 framelayout,但是当单击 recyclerview 项目停止应用程序并给出以下错误: 致命异常:main java.lang.IllegalArgumentException:未找到 id 0x7f0d00ad 的视图(com.hyperfresh.sorooshpardaz.hyperfreshcustomer:id /root_frame) 用于片段 sub_category{53e4dfec #0 id=0x7f0d00ad categoryFragment}
    • id/root_frame 在哪个布局里面?
    • 我单独设计了布局。
    • 所以你不需要做的就是放入 R.layout.category &lt;FrameLayout android:id="@+id/**someID88" android:layout_width="match_parent" android:layout_height="match_parent"/&gt; 并在 categoryFragment 中调用:getChildFragmentManager().beginTransaction().add(R.id.someID88 , new sub_category(), tag).commit();
    • 上面的代码不工作......我得到 java.lang.IllegalStateException: Fragment has not been attach yet.
    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 2011-12-05
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多