【问题标题】:Fragment inside ViewPager inside ViewGroupViewGroup 中的 ViewPager 中的 Fragment
【发布时间】:2017-08-06 19:41:20
【问题描述】:

问题

如下图所示,我有两个名为“température”的选项卡,它们的创建方式相同(参见 mainFragment)。在这两个选项卡中,我有一个查看器来获取以前的图形(8 月 5 日,8 月 4 日,...)。 第一个选项卡运行良好,但在第二个选项卡中,什么也没有出现。调试时,我可以看到在这两种情况下都创建了片段。它仅在问题所在的第二个选项卡上。更重要的是,当滑动到左端或右端时,我可以看到 viewpager 工作。 我从几个小时开始就在寻找,我不明白问题出在哪里。为什么碎片没有出现? 我正在使用 android.support.v13.app.FragmentStatePagerAdapter 作为适配器。

这是一个展示问题的短片: https://www.dropbox.com/s/vf8qlrd75mdwijp/device-2017-08-06-214510.mp4?dl=0

代码

主片段

public class MainFragment extends Fragment implements BTListener {


// the different ID for the views.
private final static int ID_TEMPERATURE = 1;

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

    final View rootView = inflater.inflate(R.layout.main,container,false);

    final ViewGroup mainContainer = (ViewGroup) rootView.findViewById(R.id.main_container);

    createTemperatureTab(mainContainer);
    createTemperatureTab(mainContainer);

    return rootView;
}

private void createTemperatureTab(ViewGroup mainContainer){

    //inflate the view
    ViewGroup view = (ViewGroup) LayoutInflater.from(getActivity()).inflate(R.layout.main_list,mainContainer,false);
    ((TextView)view.findViewById(R.id.title_main_list)).setText("Température");
    ((TextView)view.findViewById(R.id.information_main_list)).setText("°C");
    final ExpandableLayout expandableLayout = (ExpandableLayout) view.findViewById(R.id.expandable_layout);

    CustomPager viewPager = (CustomPager) view.findViewById(R.id.viewpager);
    LinearGraphAdapter linearGraphAdapter = new LinearGraphAdapter(getChildFragmentManager());
    viewPager.setAdapter(linearGraphAdapter);
    viewPager.setCurrentItem(linearGraphAdapter.getCount());

    expandableLayout.setExpanded(false);
    expandableLayout.setDuration(500);
    expandableLayout.setInterpolator(new DecelerateInterpolator());

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(expandableLayout.isExpanded()) {
                expandableLayout.collapse();
            }
            else {
                expandableLayout.expand();
            }
        }
    });
    mainContainer.addView(view);
}

}

ma​​in_list

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/title_main_list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/information_main_list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="80dp"
        android:textSize="20sp" />
</LinearLayout>

<net.cachapa.expandablelayout.ExpandableLayout
    android:id="@+id/expandable_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <com.example.renaud.aquariumslinding.adapter.CustomPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </com.example.renaud.aquariumslinding.adapter.CustomPager>

</net.cachapa.expandablelayout.ExpandableLayout>


</LinearLayout>

LineGraphFragment

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

    lineChart = (LineChart) rootView.findViewById(R.id.linear_graph);
    initiateChart(lineChart); // not important for this case
    drawChart(lineChart,dayOfYear); // not important for this case

    return rootView;
}

linear_graph_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
    android:id="@+id/linear_graph_date"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:elevation="4dp"
    android:textColor="#fff" />
<com.github.mikephil.charting.charts.LineChart
    android:id="@+id/linear_graph"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

LinearGraphAdapter

public class LinearGraphAdapter extends FragmentStatePagerAdapter {

public static int MAXIMUM_COUNT_PAGER = 7;
private int mCurrentPosition = -1;

public LinearGraphAdapter(FragmentManager fragmentManager){
    super(fragmentManager);
}
@Override
public Fragment getItem(int position) {
    Bundle bundle = new Bundle();
    bundle.putInt(Constant.CUSTOM_PAGER_NUMBER,MAXIMUM_COUNT_PAGER-position);
    Fragment fragment = new LinearGraphFragment();
    fragment.setArguments(bundle);

    return fragment;
}

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

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
    super.setPrimaryItem(container, position, object);
    if (position != mCurrentPosition) {
        Fragment fragment = (Fragment) object;
        CustomPager pager = (CustomPager) container;
        if (fragment != null && fragment.getView() != null) {
            mCurrentPosition = position;
            pager.measureCurrentView(fragment.getView());
        }
    }
}
}

【问题讨论】:

  • 您是否尝试过记录以查看碎片是否被正确测量?鉴于您的可展开布局以折叠状态开始,如何检查布局边界以查看您的视图是否实际可见。关于您在 setPrimaryItem 下的空检查,我不确定它为什么存在。如果您希望它为空,那么您可能需要处理它。如果您不希望它为空,请查看是否存在这种情况。您的布局高度也都是 wrap_content 所以如果没有给出任何数据将是不可见的
  • 两种可扩展布局的片段大小相同,测量良好。如果我检查布局边界,我们可以看到它们很好地出现:hpics.li/f7f188c 最后,在函数 setPrimaryItem 中,我只是从互联网上复制了一段代码。进去看了下,好像被调用了两次。第二次,它是一个空元素。我必须更深入地检查,但这不是解决方案的一部分。实际上,正如您所提到的,如果我将 wrap_content 更改为 150dp,并注释“setPrimaryItem”函数,问题仍然存在(请参阅hpics.li/5afaec3)。感谢您的大力帮助!

标签: android android-fragments view android-viewpager viewgroup


【解决方案1】:

好的,经过一夜的研究和阅读 API,我想通了。我什么都不懂,但是 v13 和 v4 库似乎有冲突。

要覆盖它,首先:

  • 确保调用 getChildFragmentManager() 而不是 getFragmentManager()
  • 为您拥有的所有不同的 viewpager 创建一个不同的 ID。这些 ID 必须至少有 4 位数字。当然,最好在 R.String 中有那些
  • 通过调用 setID() 在每个 viewpager 中设置您的 ID
  • 如果它不起作用,请清理并重建您的项目。

最后,奖励:

我希望它会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多