在viewpager中替换一个片段后,另一个片段显示为空白

时间:2018-03-30 14:24:42

标签: android android-fragments android-viewpager

我在MainActivity中有两个名为homeFragment和TopBlankFragment的片段。 我想将数据从mainActivity传递到homefragment。我使用bundle和replce home片段成功传递了数据。但问题是在替换homefragment后,TopBlankFragment显示为空白。

以下是我如何将数据从主要活动传递到homefragment的代码: -

if (newText.length() > 0) {
                FragmentManager fragmentManager =getSupportFragmentManager();
                FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction();
                HomeFragment homeFragment = new HomeFragment();
                Bundle bundle = new Bundle();
                bundle.putString("searchKey", newText);
                fragmentTransaction.replace(R.id.viewPager, homeFragment);

                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
            }

以下是我在homeFragment中接受数据的代码: -

Bundle bundle = getArguments();

if (bundle != null) {



    String searchKey = bundle.getString("searchKey");

    Toast.makeText(getActivity(), "Searchkey " + searchKey, Toast.LENGTH_SHORT).show();
    textView.setText(searchKey);

}

但主要问题是topBlankFragment显示为空白。 这是我的viewpagerAdapter: -

    public class ViewPagerAdapter extends FragmentStatePagerAdapter {

    ArrayList<Fragment> fragments = new ArrayList<>();
    ArrayList<String> tabTitles = new ArrayList<>();


    public void addFragments(Fragment fragment,String titles)
    {
        this.fragments.add(fragment);
        this.tabTitles.add(titles);
    }


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

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return tabTitles.get(position);
    }



    public void replaceFragment(Fragment fragment) {
        fragments.remove(0);
        fragments.add(0, fragment);
        tabTitles.remove(0);
        tabTitles.add(0,"Home Fragment");

        notifyDataSetChanged();


    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;

    }


}

这是我的Mainactivity.xml: -

    <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="tanvir.testmaterialtablayout.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true">

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:fitsSystemWindows="true"
            app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed">

            <include

                android:id="@+id/tolbarlayoutinmainactivity"
                layout="@layout/toolbar_layout"
                app:layout_collapseMode="parallax" />

            <com.miguelcatalan.materialsearchview.MaterialSearchView
                android:id="@+id/search_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="0dp"
                app:layout_collapseMode="parallax" />


        </android.support.design.widget.CollapsingToolbarLayout>


        <android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabGravity="fill"
            app:tabIndicatorHeight="4dp"
            app:tabMode="fixed"
            app:tabSelectedTextColor="@android:color/white"
            app:tabTextColor="@android:color/black" />


    </android.support.design.widget.AppBarLayout>


    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />


</android.support.design.widget.CoordinatorLayout>

我正在寻找这整天的解决方案。但是没有找到合适的解决方案。

4 个答案:

答案 0 :(得分:0)

也许这个问题与viewpager .. Viewpager有一些选项来creare片段。因此,如果您将view pager设置为offscreenpagelimit 1,那么它将始终创建新的片段。因此,从活动中获取的数据可能会在第二次丢失时显示空白片段。

我建议你也把活动类的代码放进去。

答案 1 :(得分:0)

首先,你在MainActivity中没有homeFragment和TopBlankFragment,你的MainActivity中有tablayout和Viewpager,viewpager有片段homeFragment和TopBlankFragment。现在确保你没有在homeFragment布局中使用相同的资源ID作为TopBlankFragment布局,因为它会导致问题

答案 2 :(得分:0)

我认为问题出在这里,

fragmentTransaction.replace(R.id.viewPager,homeFragment);

您正在使用homeFragment替换viewPager本身。

您应该更新使用片段(包括homeFragment)

来扩展viewpager的适配器

因此,只需用新的homeFragment替换适配器中的homeFragment即可。

答案 3 :(得分:0)

ViewPager的适配器工作正常。也许问题出在其他地方。使用以下技术在片段中传递数据

发送数据

public static HomeFragment newInstance(String arg1) {
    HomeFragment fragment = new HomeFragment();
    Bundle args = new Bundle();
    args.putLong(KEY_OF_DATA_ARG, arg1);
    fragment.setArguments(args);
    return fragment;
}

接收数据

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

    String argData = getArguments().getLong(KEY_OF_DATA_ARG);
}