2017-03-14 5 views
0

Ich habe hier gesucht, aber meine Lösung nicht gefunden. Ich poste also mein Problem, es funktioniert gut, wenn wir auf Tabs tippen, aber es funktioniert nicht perfekt, wenn wir ViewPager scrollen. Es gibt ein Problem mit der dynamischen Höhe. Einige Inhalte werden nicht angezeigt.Tabs mit dynamischer Höhe in Fragment

meine Xml ist

<my_packagename.ViewPager_Height 
      android:id="@+id/pager" 
      android:layout_width="match_parent" 
      android:nestedScrollingEnabled="false" 
      android:layout_height="wrap_content" /> 

und jetzt meine Java-Datei ist wie

public class ViewPager_Height extends ViewPager { 

private View mCurrentView; 

public ViewPager_Height(Context context) { 
    super(context); 
} 

public ViewPager_Height(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    if (mCurrentView == null) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     return; 
    } 
    int height = 0; 
    mCurrentView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
    int h = mCurrentView.getMeasuredHeight(); 
    if (h > height) height = h; 
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); 

    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 

public void measureCurrentView(View currentView) { 
    mCurrentView = currentView; 
    requestLayout(); 
} 

public int measureFragment(View view) { 
    if (view == null) 
     return 0; 

    view.measure(0, 0); 
    return view.getMeasuredHeight(); 
} 

}

und Hauptklasse ist

final ViewPager_Height viewPager = (ViewPager_Height) findViewById(R.id.pager); 
     TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 

     tabLayout.addTab(tabLayout.newTab().setText(about_us)); 
     tabLayout.addTab(tabLayout.newTab().setText(listing)); 
     tabLayout.addTab(tabLayout.newTab().setText(contact)); 

     DynamicheightTabsAdapter adapter; 
     adapter = new DynamicheightTabsAdapter(getSupportFragmentManager(), "TASK"); 
     viewPager.setAdapter(adapter); 
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 

     tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @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) { 

      } 
     }); 


    } 
} 

und schließlich meine Adapter Klasse wie

public class DynamicheightTabsAdapter extends FragmentPagerAdapter { 

private List<Fragment> fragments; 
private int mCurrentPosition = -1; 

public DynamicheightTabsAdapter(FragmentManager fm, String takidetifier) { 
    super(fm); 
    this.fragments = new ArrayList<>(); 

    switch (takidetifier){ 
     case "Task": 
      fragments.add(new MyFirstFragment()); 
      fragments.add(new MySecondFragment()); 
      fragments.add(new MyThirdFragment()); 
      break; 


    } 



} 

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

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

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

}

+0

Use 'android: weightSum' für die lineare Layout und ‚android: layout_weight 'andere Elemente im linearen Layout. Beispiel: Sie müssen weightSum als 100 festlegen und die Summe der layout_weight aller untergeordneten Elemente sollte 100 sein. –

Antwort

0

Anruf adapter.notifyDataSetChanged() in OnTabSelected So ist der neue Code wäre,

public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); adapter.notifyDataSetChanged() }

Verwandte Themen