2017-08-06 86 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

我希望這會有所幫助。