2

Ich habe eine ScrollView, die einen ViewPager beherbergt, der Fragmente dynamischer Höhe beherbergt. Da ScrollView und ViewPager aufgrund der Scroll-Handhabung nicht gut zusammenpassen, habe ich eine der benutzerdefinierten Lösungen von here verwendet. Aber ich bekomme derzeit wirklich abnormale Ergebnisse. Das erste Fragment im ViewPager erhält immer eine Höhe von 0. Manchmal zeigen die Fragmente auch nicht ihren Inhalt, aber wenn ich hin und her blättern und zu diesem Fragment zurückkehren werde, könnte Inhalt angezeigt werden.Android: ViewPager mit einer dynamischen Höhe innerhalb einer ScrollView

Einige Code für Sie sehen:

der Brauch ViewPager:

import android.content.Context; 
import android.support.v4.view.ViewPager; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 

/** 
* Created by Narayan Acharya on 12/07/2016. 
*/ 
public class DynamicHeightWrappingViewPager extends ViewPager { 
    private View mCurrentView; 

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

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

    @Override 
    protected 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); 
     Log.d("ViewPager Measure", h + ":" + heightMeasureSpec); 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 

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

Die benutzerdefinierte Scroll:

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.widget.ScrollView; 

/** 
* Created by Narayan Acharya on 12/07/2016. 
*/ 
public class ChildrenHeightAdaptingScrollView extends ScrollView { 
    private GestureDetector mGestureDetector; 

    public ChildrenHeightAdaptingScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mGestureDetector = new GestureDetector(context, new YScrollDetector()); 
     setFadingEdgeLength(0); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     return super.onInterceptTouchEvent(ev) 
       && mGestureDetector.onTouchEvent(ev); 
    } 

    // Return false if we're scrolling in the x direction 
    class YScrollDetector extends GestureDetector.SimpleOnGestureListener { 
     @Override 
     public boolean onScroll(MotionEvent e1, MotionEvent e2, 
           float distanceX, float distanceY) { 
      return (Math.abs(distanceY) > Math.abs(distanceX)); 
     } 
    } 
} 

Die PagerAdapter:

import android.app.Fragment; 
import android.app.FragmentManager; 
import android.support.v13.app.FragmentPagerAdapter; 
import android.util.Log; 
import android.view.ViewGroup; 

/.. Some more project specific imports here../ 
/** 
* Created by Narayan Acharya on 22/06/2016. 
*/ 
public class EventsPagerAdapter extends FragmentPagerAdapter { 

    private Event event; 
    private int PAGE_COUNT = 2; 
    private int mCurrentPosition = -1; 
    private String tabTitles[] = new String[]{"INFO", "FAQs"}; 

    public EventsPagerAdapter(FragmentManager fm, Event event) { 
     super(fm); 
     this.event = event; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return EventInfoFragment.getInstance(event); 
      case 1: 
       return EventFAQsFragment.getInstance(event); 
      default: 
       return null; 
     } 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     // Generate title based on item position 
     return tabTitles[position]; 
    } 

    @Override 
    public void setPrimaryItem(ViewGroup container, int position, Object object) { 
     super.setPrimaryItem(container, position, object); 
     if (position != mCurrentPosition) { 
      Fragment fragment = (Fragment) object; 
      DynamicHeightWrappingViewPager pager = (DynamicHeightWrappingViewPager) container; 
      if (fragment != null && fragment.getView() != null) { 
       mCurrentPosition = position; 
       pager.measureCurrentView(fragment.getView()); 
       Log.d("Requested Measure for", position + " " + fragment.getClass().getSimpleName()); 
      } 
     } 
    } 
} 

Per mein obs Der einzige Unterschied, den ich in dem Code von dem oben erwähnten Link und dem, den ich verwende, ist, dass der Link FragmentPagerAdapter von der Support-Bibliothek v4 verwendet, während ich von der Version 13 verwende (kann aufgrund einiger nicht zu v4 geändert werden) andere Einschränkungen). Was sind die Hauptunterschiede zwischen den beiden Versionen der Support-Bibliothek für meine Verwendung?

+0

Sind die Inhalte im fragmentierten Bereich verfügbar, wenn sie aufgebläht sind, oder führen Sie Netzwerkaufrufe durch, um den Inhalt abzurufen? –

+0

Kein Netzwerk ruft diese Fragmente auf. Sie zeigen nur Daten an, die ich ihnen zur Verfügung stelle. Die zwei Fragmente enthalten nur einfache WebViews und ich gebe ihnen Text, der in HTML formatiert ist. KEIN Netzwerk ruft dort rein. –

+0

Ah! Es könnte einige Probleme mit der Messung von WebView-Höhe geben. Können Sie ein Beispiel-HTML posten? Ich werde es mit meiner Beispiel-App ausprobieren. –

Antwort

0

Das mag wie wirklich dumm und ich bin mir nicht sicher, warum das genau funktioniert! Wenn jemand weiß warum, bitte antworte.

Das Problem mit der ViewPager Zusammenbruch war, dass es einfach eine WebView in jedem Fragment enthielt. Ich mühte mich ab, hart zu versuchen, Lösungen zu finden und mehr benutzerdefinierte ViewPagers und ScrollViews schreiben. Gerade als ich aufgeben wollte, wickelte ich die WebView in eine LinearLayout und die Fragment an der Position 0 kollabierte nicht. Es funktioniert jetzt reibungslos.

Wenn jemand beim Versuch, diese oder ähnliche Lösungen zu bekommen, leere Seiten erhält, versuchen Sie es bitte in eine LinearLayout oder so.

Hoffe das hilft jemandem!

+0

Einchecken onMeasure() - Code, wenn Sie eine neue Höhe in der Anweisung "super.onMeasure (widthMeasureSpec, heightMeasureSpec)" zurückgeben .. im Grunde sollte heightMeasureSpec die neue Höhe haben. Dies half mir, ähnliche Probleme zu lösen. – Govind

Verwandte Themen