如何使FrameLayout填充其父级的高度,以便整个页面一起滚动?

Kei*_*ith 6 android

我有一个FrameLayout加载Fragments通过点击一个标签TabWidget.我无法弄清楚如何使高度FrameLayout与其内容一样高,以便整个包含ScrollView将一起滚动而不是单独的滚动视图.

这是这个Fragment结构的一个直观的例子:

在此输入图像描述

正如您所看到的,帧布局可见高度仅显示片段的一行,而实际上有一些.我可以在其中滚动FrameLayout以查看现在的其他行,但这不是我想要的.该FrameLayout由一个LinearLayout包含GridView与他们的layout_heightS设定到wrap_content.

我尝试将其高度硬编码为FrameLayout类似于500dp的东西,除了它不再动态调整大小外,它的效果很好.FrameLayout每次将新图像加载到内部内容中时,是否需要以编程方式调整大小?是否有我可以设置的布局属性,因此它会拉伸其高度以匹配其内部内容?

这是我的布局xml文件:

<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<LinearLayout
    android:orientation="vertical"

    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="200dp">
        <!-- CONTAINS USER INFO AND STATS -->
    </RelativeLayout>
    <android.support.v4.app.FragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#ffffff">
            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="60dp"
                android:weightSum="2">
            </TabWidget>
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                >
            </FrameLayout>
        </LinearLayout>
    </android.support.v4.app.FragmentTabHost>
</LinearLayout>
</ScrollView>
Run Code Online (Sandbox Code Playgroud)

谢谢!


既然我要为此设置赏金,我想我会分享到目前为止我已经想到的东西.

在缩略图中,onSuccess当每个图像被加载时,我正在调用一个函数,该函数GridLayout包含计算图像的图像并设置图像的高度GridLayout.这很好用,虽然看起来效率有点低.

我在做什么是设置GridLayout高度,然后调用requestLayout,并invalidate在它和它的父(S).这有效,但不是图像加载.奇怪的是,如果我去另一个标签并返回缩略图,它会起作用.这让我觉得我没有在正确的时间或正确的对象上进行更新.

无论如何,那说.有谁知道如何使GridLayout扩展的高度保持其内容(而不是滚动)所以我可以滚动整个页面(包括顶部)?


我还应该添加GridView布局:

<GridView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/grid"
android:stretchMode="columnWidth"
android:gravity="center"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false"
android:fastScrollAlwaysVisible="false"
android:fastScrollEnabled="false"
android:numColumns="3"
android:choiceMode="none">
</GridView>
Run Code Online (Sandbox Code Playgroud)

Nav*_*een 4

我也遇到过类似的情况,但我有一个 ListView 而不是 GridView。当您每次添加项目或调用notifyDataSetChanged() 时都必须动态设置高度时,您就处于正确的位置。

此代码适用于每行具有不同高度的列表视图

private void setListViewHeightBasedOnChildren(MyQueueAdapter listAdapter) {

    int desiredWidth = MeasureSpec.makeMeasureSpec(
            mListView.getWidth(), MeasureSpec.AT_MOST);
    int totalHeight = 0;

    View view = null;
    int i;
    for (i = 0; i < listAdapter.getCount(); i++) {
        view = listAdapter.getView(i, view, mListView);

        view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);

        totalHeight += view.getMeasuredHeight();
    }

    ViewGroup.LayoutParams params = mListView.getLayoutParams();
    params.height = heightList
            + (mListView.getDividerHeight() * (listAdapter
                    .getCount() + 3));

    heightListComplete = params.height;
    mListView.setLayoutParams(params);

}
Run Code Online (Sandbox Code Playgroud)

您需要根据您的需要修改此代码,您不需要循环,因为在您的情况下每行的高度是静态的。如果您需要更多帮助,请告诉我。

选择

如果您知道以 dp 为单位的视图高度,则可以轻松地将 dp 以 px 为单位转换,并根据行数设置 gridview 的高度。