2

私は動的高さの断片をホストするViewPagerをホストするScrollViewを持っています。スクロール操作のためにScrollViewとViewPagerがうまくいっていないので、hereのカスタムソリューションの1つを使用しました。しかし、私は現在、本当に異常な結果を得ています。 ViewPagerの最初のフラグメントは常に0の高さになります。また、フラグメントの内容が表示されない場合がありますが、前後にスクロールしてそのフラグメントに戻ると、コンテンツが表示されることがあります。Android:ViewPager、ScrollView内の動的な高さ

あなたが見てのためにいくつかのコード:

カスタム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(); 
    } 
} 

カスタムScrollView:

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

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

あたりとして私のOBS前述のリンクと私が使用しているリンクのコードで見つけることのできる唯一の違いは、v13から使用している間にリンクがサポートライブラリv4のFragmentPagerAdapterを使用していることです(これをv4に変更することはできませんその他の制限事項)。どのように私はそれを使用しているサポートライブラリの2つのバージョンの主な違いは何ですか?

+0

コンテンツが膨大になっている場合、またはコンテンツを取得するためのネットワークコールを行っているときに、コンテンツがフラグメントですぐに利用できるかどうかを確認します。 –

+0

これらのフラグメントではネットワークコールがありません。彼らは私がそれらを提供するデータのみを表示します。 2つのフラグメントには単純なWebViewしか含まれていないので、HTMLでフォーマットされたテキストを与えます。そこにはネットワークはありません。 –

+0

ああ! WebViewの高さを測定する際に問題が生じる可能性があります。サンプルHTMLを投稿できますか?サンプルアプリで試してみます。 –

答えて

0

これは本当にばかげたように思えるかもしれませんが、なぜこれが正確に機能するのかわかりません!理由を知っている人は誰でも答えてください。

ViewPagerが崩壊している問題は、単にFragmentWebViewが含まれていたことでした。私は解決策を見つけようと熱心に努力し、より多くの習慣を書くことはViewPagersScrollViewsです。私があきらめようとしていたときに、私はLinearLayoutWebViewをラップし、0Fragmentは崩壊しませんでした。今はスムーズに動作します。

だから、誰かがこのようなやり方で空白のページを取得している場合は、LinearLayoutなどでラップしようとしてください。

これが誰かを助けることを願っています!

+0

"super.onMeasure(widthMeasureSpec、heightMeasureSpec)"ステートメントで新しい高さを返す場合は、onMeasure()コードをチェックインします。基本的にheightMeasureSpecに新しい高さが必要です。これは私が直面した同様の問題を解決するのに役立ちました。 – Govind

関連する問題