滚动

时间:2015-12-26 11:31:59

标签: android android-layout android-viewpager android-tablayout

我想要和活动来显示一些统计信息。在这个活动中,我想输入开始和结束日期,并与它们一起显示一些统计数据和一些图形。为此,我创建了一个活动,其中我选择输入日期的顶部是固定的。然后我有一个TablLayout和一个viewpager,我在其中显示统计信息和图形。 所有这些似乎工作正常,这是result on the activity。但是,我的问题是双重的: 一方面,我无法自动调整viewpager的大小以适应活动高度并正确显示片段的内容。如果我将viewpager设置为wrap_content并将片段设置为match_parent,则不会显示任何内容。但是,如果我手动填充viewpager高度,那么我可以看到viewpager工作(但没有正确调整活动高度)。 另一方面,当我能够看到viewpager内容时,我只想滚动viewpager的内容。但是,如果我插入scrollview或nestedscrollview,则整个活动会滚动,这是我不想要的。 这是我希望将所有这些组合在一起的活动布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.app.asaak.activities.InformesActivity"
    tools:showIn="@layout/activity_informes">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_margin="10dp"
        >
        <!-- ================ LAYOUT BOTONES ================ -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            android:weightSum="2"
            >
            <!-- ================ BOTON DESDE ================ -->
            <Button
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:id="@+id/informes_boton_desde"
                android:text="DESDE"
                android:layout_weight="1"
                />
            <!-- ================ BOTON HASTA ================ -->
            <Button
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:id="@+id/informes_boton_hasta"
                android:text="HASTA"
                android:layout_weight="1"
                />
        </LinearLayout>
        <!-- ================ LAYOUT TEXT ================ -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:weightSum="2"
            >
            <!-- ================ TEXTVIEW DESDE ================ -->
            <com.app.asaak.textViews.CTextViewName
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="dd/mm/aaaa"
                android:id="@+id/informes_text_desde"
                android:textSize="20sp"
                android:textAlignment="center"
                />
            <!-- ================ TEXTVIEW HASTA ================ -->
            <com.app.asaak.textViews.CTextViewName
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="dd/mm/aaaa"
                android:id="@+id/informes_text_hasta"
                android:textSize="20sp"
                android:textAlignment="center"
                />
        </LinearLayout>

        <!--        VIEWPAGER               -->
        <android.support.design.widget.TabLayout
            android:id="@+id/tabs_informes"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />

            <!--  VIEWPAGER -->
            <android.support.v4.view.ViewPager
                android:id="@+id/pager_informes"
                android:layout_width="match_parent"
                android:layout_height="1000dp"
                android:layout_below="@id/tabs_informes"
                />

    </LinearLayout>
</RelativeLayout>

这是我想要放在标签信息或标签图形上的两个内容的示例。

标签图片:

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

    <!-- GRAPHICS AND INFORMATION HERE THAT DOESN'T FIT THE ACTIVITY SO MUST BE SCROLLED -->

</LinearLayout>

正如你可以看到viewpager高度是强制的,如果我把wrap_content我看不到任何东西。

我该怎么做?谢谢!

5 个答案:

答案 0 :(得分:0)

试试这个

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.app.asaak.activities.InformesActivity"
    tools:showIn="@layout/activity_informes">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_margin="10dp"
        >
        <!-- ================ LAYOUT BOTONES ================ -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            android:weightSum="2"
            >
            <!-- ================ BOTON DESDE ================ -->
            <Button
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:id="@+id/informes_boton_desde"
                android:text="DESDE"
                android:layout_weight="1"
                />
            <!-- ================ BOTON HASTA ================ -->
            <Button
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:id="@+id/informes_boton_hasta"
                android:text="HASTA"
                android:layout_weight="1"
                />
        </LinearLayout>
        <!-- ================ LAYOUT TEXT ================ -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:weightSum="2"
            >
            <!-- ================ TEXTVIEW DESDE ================ -->
            <com.app.asaak.textViews.CTextViewName
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="dd/mm/aaaa"
                android:id="@+id/informes_text_desde"
                android:textSize="20sp"
                android:textAlignment="center"
                />
            <!-- ================ TEXTVIEW HASTA ================ -->
            <com.app.asaak.textViews.CTextViewName
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="dd/mm/aaaa"
                android:id="@+id/informes_text_hasta"
                android:textSize="20sp"
                android:textAlignment="center"
                />
        </LinearLayout>

        <!--        VIEWPAGER               -->
        <android.support.design.widget.TabLayout
            android:id="@+id/tabs_informes"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            />

            <!--  VIEWPAGER -->
            <android.support.v4.view.ViewPager
                android:id="@+id/pager_informes"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@id/tabs_informes"
                />

    </LinearLayout>
</RelativeLayout>

linearlayout外部高度更改为match_parent。 将TabLayout高度更改为0dp且权重为1。 将ViewPager身高更改为match_parent

答案 1 :(得分:0)

将Tablayout和viewpager更改为:

<!--        TABLAYOUT               -->
        <android.support.design.widget.TabLayout
            android:id="@+id/tabs_informes"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />


            <!--  VIEWPAGER -->
            <android.support.v4.view.ViewPager
                android:id="@+id/pager_informes"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@id/tabs_informes"
                />

并且每个tab_layout的宽度和高度= match_parent我现在能够看到填充的标签。但是,我仍然遇到问题我无法滚动viewpager的内容,因此我只能看到完整内容的一部分。

答案 2 :(得分:0)

实际上我最终遇到了同样的情况。我得到了一个解决方案。

可以通过扩展ViewPager类来实现。创建一个类

public class WrapContentHeightViewPager extends ViewPager {

    /**
     * Constructor
     *
     * @param context the context
     */
    public WrapContentHeightViewPager(Context context) {
        super(context);
    }

    /**
     * Constructor
     *
     * @param context the context
     * @param attrs   the attribute set
     */
    public WrapContentHeightViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        // find the first child view
        View view = getChildAt(0);
        if (view != null) {
            // measure the first child view with the specified measure spec
            view.measure(widthMeasureSpec, heightMeasureSpec);
        }

        setMeasuredDimension(getMeasuredWidth(), measureHeight(heightMeasureSpec, view));
    }

    /**
     * Determines the height of this view
     *
     * @param measureSpec A measureSpec packed into an int
     * @param view        the base view with already measured height
     * @return The height of the view, honoring constraints from measureSpec
     */
    private int measureHeight(int measureSpec, View view) {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        if (specMode == MeasureSpec.EXACTLY) {
            result = specSize;
        } else {
            // set the height from the base view if available
            if (view != null) {
                result = view.getMeasuredHeight();
            }
            if (specMode == MeasureSpec.AT_MOST) {
                result = Math.min(result, specSize);
            }
        }
        return result;
    }
}

此类确保视图寻呼机的高度与内部视图相同。

创建类之后,只需使用您创建的自定义视图寻呼机替换布局中的ViewPager。喜欢:

<com.your.packagename.WrapContentHeightViewPager
                android:id="@+id/pager_informes"
                android:layout_width="match_parent"
                android:layout_height="1000dp"
                android:layout_below="@id/tabs_informes"
                />

希望这会奏效!

答案 3 :(得分:0)

在尝试建议的解决方案后,我添加了一个Scrollview:

<ScrollView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                <!--  VIEWPAGER -->
                <com.app.asaak.support.HeightAdaptableViewPager
                    android:id="@+id/pager_informes"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="20dp"
                    android:layout_marginBottom="20dp"
                    android:layout_below="@id/tabs_informes"
                    />

                </ScrollView>

现在它正在为第一个标签工作,但当我改为第二个标签时(我在其中有这个标签:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:layout_marginTop="10dp"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <com.jjoe64.graphview.GraphView
        android:layout_width="match_parent"
        android:layout_height="200dip"
        android:id="@+id/grafico_turnos" />

    <com.jjoe64.graphview.GraphView
        android:layout_width="match_parent"
        android:layout_height="200dip"
        android:layout_marginTop="10dp"
        android:id="@+id/grafico_reservas" />

</LinearLayout>

即使我在其标签上上下滚动,我也看不到它们。看起来图形在某处,但我无法滚动,因为我无法滚动。

另一个奇怪的事情是,即使我在片段中插入边距,当我显示统计边距时,也不会考虑底部边距,因此标签末尾的边距未正确显示。

答案 4 :(得分:0)

事实证明它比我想象的要容易!经过大量尝试并在您的帮助下,我找到了解决方案。只需使用常规viewPager并使height = match_parent。然后在两个选项卡的布局中插入一个高度= wrap_content的Scrollview,就这样,按预期工作!

谢谢你们!