首页 > 解决方案 > 嵌套的浏览器:让外部滑动而不是内部

问题描述

简而言之:

我有一个ViewPager,vpOuter显示有另一个ViewPager,的片段vpInner

用户应该能够在片段之间滑动,vpOuter但显示的片段vpInner只能以编程方式交换。

现在,向上滑动vpInner没有任何作用,而向外滑动则在's 的片段vpInner之间切换。vpOuter

我怎样才能使刷卡vpInner被识别为在 之间刷卡vpOuter

(两人ViewPager互不相识)

完整的故事:

好的,所以我有一个具有三个片段的视图寻呼机的活动。

我们称它们为 A、B 和 C。

现在用户可以在它们之间滑动或使用底部导航。

A是我们的“查看器片段”,如果有要显示的内容,它会显示一些内容,如果没有要显示的内容,它会显示任何内容,但它一次只会显示一个内容。

A包含一个不可滑动的视图寻呼机。

这背后的原因是我们想要显示文本和图像以及谁知道什么,我们为我们想要显示的每种媒体类型创建一个视图片段。所以当我们有一些东西要显示时,我们检查那个东西是什么,切换到相应的片段并用数据填充它。

结果,A 将如下所示:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <[...].android.ui.widgets.NonswipableViewPager
            android:id="@+id/view_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

    <!--irrrelevant floating action button here-->

</android.support.design.widget.CoordinatorLayout>

在哪里

/**A view pager that disables swiping to switch between pages.
 * Switching must happen programmatically.*/
class NonswipableViewPager:ViewPager{
    constructor(context:Context):super(context)
    constructor(context: Context,attributeSet: AttributeSet):super(context,attributeSet)

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        return false
    }

    override fun onTouchEvent(ev: MotionEvent?): Boolean {
        return false
    }
}

让我们假设只有我们想要显示的文本内容。

然后我们有两个片段:

class NoContentView : AbstractContentView() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val fragmentView = inflater.inflate(R.layout.fragment_A_component_text_view, container, false)
        fragmentView.content.text = Html.fromHtml(getString(R.string.A_nothingToShow))
        return fragmentView
    }

    //more irrelevant stuff here
}

当我们没有可显示的内容时,我们会显示它,并且

class TextContentView:AbstractContentView(){
    @Volatile private var displayedData:String? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_A_component_text_view, container, false)
        displayedData?.let { view.content.text = it }
        return view
    }

    override fun display(c: IDisplayableContent) {
        displayedData = String(c.data, Charsets.UTF_8)
        content?.text = displayedData
    }
}

他们都夸大了这里的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.widget.LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    >

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        android:layout_gravity="center"
        android:fillViewport="true"
        >
        <TextView
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAlignment="center"
            android:gravity="center"
            tools:text="PLACEHOLDER" />
    </ScrollView>
</android.widget.LinearLayout>

如果有TextContentView显示,一切正常,我可以在片段之间滑动,A没有问题。BC

但是,当NoContentView正在显示时,我需要有意识地避免滑动时的文本内容,否则它不会做任何事情。

我怎样才能让它总是表现得好像不可滑动的视图寻呼机不存在一样?

标签: javaandroidandroid-fragmentskotlinandroid-viewpager

解决方案


这里的问题是由于外部 ViewPager 感应到它具有可以向同一方向滚动的可滚动内容,因此外部 ViewPager 拒绝向该方向滚动。

这可以通过canScrollHorizontally(int direction)在内部 ViewPager 中重写以返回 false 来解决。


推荐阅读