2017-08-06 48 views
1

问题片段内ViewPager内部的ViewGroup

如下面的图所示,我有两个选项卡称为被以相同的方式(参见mainFragment)创建的“温度”。在这两个选项卡中,我有一个视图来获取先前的图形(05年8月,04年8月,...)。 第一个标签运行良好,但在第二个标签中没有任何显示。在调试时,我可以看到在两种情况下都创建了片段。只有在问题出现的第二个标签上。更重要的是,当滑动到左侧或右侧时,我可以看到viewpager正在工作。 我从几个小时开始就在寻找,我不明白问题在哪里。为什么片段不出现? 我正在使用适配器的android.support.v13.app.FragmentStatePagerAdapter。

这里是一个短片,借以说明问题: https://www.dropbox.com/s/vf8qlrd75mdwijp/device-2017-08-06-214510.mp4?dl=0

enter image description here

代码

MainFragment

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); 
} 

} 

main_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()); 
     } 
    } 
} 
} 
+0

您是否尝试过记录以查看片段是否正确测量?考虑到您的可展开布局以折叠状态开始,检查布局边界以查看您的视图是否真的可见。关于setPrimaryItem下的空检查,我不确定它为什么在那里。如果你期望它是空的,你可能需要处理它,如果它。如果你不希望它是空的,看看是否有这种情况。您的布局高度也都是wrap_content,所以如果没有提供任何数据,则不会显示任何内容。 –

+0

可展开布局的片段尺寸相同,测量良好。 如果我检查布局边界,我们可以看到它们很好显示:http://hpics.li/f7f188c 最后,在函数setPrimaryItem中,我刚从Internet复制了一个代码。看过之后,它似乎被称为两次。第二次,它是一个空元素。我必须更深入地检查,但这不是解决方案的一部分。 事实上,正如你所提到的,如果我将wrap_content更改为150dp,并评论“setPrimaryItem”函数,问题仍然相同(请参阅http://hpics.li/5afaec3)。 Thx对你的帮助很大! – renaudyes

回答

0

好的,经过一个晚上的研究和阅读API我找到了它。我不明白一切,但似乎v13和v4库有冲突。

要覆盖它,首先:

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

最后,奖励:

enter image description here

我希望这会有所帮助。