gpt4 book ai didi

安卓 : ViewPager with a dynamic height within a ScrollView

转载 作者:搜寻专家 更新时间:2023-11-01 09:45:15 24 4
gpt4 key购买 nike

我有一个 ScrollView,它承载一个 ViewPager,它承载动态高度的 fragment 。由于滚动处理,ScrollView 和 ViewPager 不能很好地结合在一起,我使用了来自 here 的自定义解决方案之一。 .但我目前得到的结果非常异常。 ViewPager 中的第一个 fragment 的高度始终为 0。此外,有时 fragment 不显示其内容,但当我来回滚动并返回到该 fragment 时,内容可能会显示。

一些代码供您查看:

自定义 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));
}
}
}

寻呼机适配器:

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

根据我的观察,我在上面提到的链接和我正在使用的链接的代码中发现的唯一区别是,该链接使用支持库 v4 中的 FragmentPagerAdapter,而我使用的是 v13(无法更改此到 v4,由于一些其他限制)。就我的使用方式而言,这两个版本的支持库之间的主要区别是什么?

最佳答案

这可能看起来真的很愚蠢,我不确定为什么它能正常工作!如果有人知道为什么,请回答。

ViewPager 崩溃的问题在于它只是在每个 Fragment 中包含一个 WebView。我努力寻找解决方案并编写更多自定义 ViewPagersScrollViews。就在我要放弃的时候,我将 WebView 包裹在 LinearLayout 中,而 Fragment 位于 0 位置不崩溃。它现在工作顺利。

因此,如果有人在尝试此解决方案或类似解决方案时遇到空白页,请尝试将其包装在 LinearLayout 或其他内容中。

希望这对某人有帮助!

关于安卓 : ViewPager with a dynamic height within a ScrollView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38349809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com