android - OnBackpressed 在 tablayout 上获得空 View

标签 android android-fragments android-viewpager android-adapter android-tablayout

我一直在解决这个问题。我已经使用 TabLayoutViewPager 在 fragment 中设置了选项卡。问题是当我移动到下一个 fragment 然后按下后退按钮时,我得到空标签 View 。

这里附上我的代码:

this is my home fragment when I click on shirt it moves me to next fragment

As I said previous fragment moved me to this product detail fragment. and now when i press back button it gives me empty view

As I said it gives me this empty view

主页.xml

<?xml version="1.0" encoding="utf-8"?>

    <LinearLayout 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"
    android:gravity="center"
    android:orientation="vertical">


    <android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:tabIndicatorColor="@android:color/white"
        app:tabIndicatorHeight="4dp" />

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="fill_parent" />

    </LinearLayout>`

home.java( fragment )

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

    View view = inflater.inflate(R.layout.home, container, false);

    ((Drawer) getActivity()).setActionBarTitle("Home");

    Toast.makeText(getActivity(), "entry count" +    getActivity().getSupportFragmentManager().getBackStackEntryCount(), Toast.LENGTH_SHORT).show();


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

    tabLayout.addTab(tabLayout.newTab().setText("Products"));

    tabLayout.addTab(tabLayout.newTab().setText("Category"));

    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);


    viewPager = (ViewPager) view.findViewById(R.id.pager);
    Pager adapter = new Pager(getActivity().getSupportFragmentManager(), tabLayout.getTabCount());
   tabLayout.getTabCount());

    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    
    viewPager.setAdapter(adapter);

    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(this);
    return view;

}

@Override
public void onTabSelected(TabLayout.Tab tab) {
    viewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(TabLayout.Tab tab) {

}

@Override
public void onTabReselected(TabLayout.Tab tab) {

}

pager.java(适配器)

public class Pager extends FragmentStatePagerAdapter {

int tabCount;

public Pager(FragmentManager fm, int tabCount) {
    super(fm);
    this.tabCount = tabCount;
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            Product tab1 = new Product();
            return tab1;
        case 1:
            Category tab2 = new Category();
            return tab2;
        default:
            return null;
    }
}

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

MainActivity(我在其中设置此选项卡 fragment )

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_drawer);


    getSupportActionBar().setTitle("Home");
    fragment = new home();
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.main, fragment);
    ft.commit();

最佳答案

我在替换 fragment 时遇到了同样的问题,替换的 fragmentTabLayout(即 Inner Fragments)

在研究了这个问题之后:我找到了解决方案

我做了什么:

替换

 ViewPagerAdapter adapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager());

如果您的父级 Activity 正在扩展 AppCompatActivity ,则使用

ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());

如果您的父 Activity 正在扩展 Activity 而不是使用

ViewPagerAdapter adapter = new ViewPagerAdapter(getActivity().getChildFragmentManager());

关于android - OnBackpressed 在 tablayout 上获得空 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39268389/

相关文章:

java - 当前选择的变种 "arm-debug"使用了split apks,但是4个split apks都不兼容当前设备

java - Android 为什么 Fragments 不应该直接相互通信?

android - FragmentTransaction.replace()淡入过渡显示 “ghost” fragment

java - 从工具栏按回时 Viewpager 将无法工作

android - 如果屏幕在工作期间旋转,如何获得加载器的结果?

java - 如何将 Json 字符串转换为 Java 对象?

android - 使用支持库 v4 修订版 11 的嵌套 fragment

android 在所有 Activity 前保持一个 View

android - 如何实现 PagerAdapter 的 View 回收机制?

android - 是否可以使用 32 位 (ARGB_8888) 表面格式的动态壁纸?