(android)以编程方式填充的scrollview失去标题

时间:2017-04-02 00:29:14

标签: android layout

我有这个布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerInParent="true"
    android:layout_centerVertical="true"
    android:background="#000"
    android:gravity="center_horizontal|center_vertical"
    android:orientation="vertical">

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center_horizontal|center_vertical">

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:orientation="vertical">


            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription="@string/play"
                android:gravity="center_horizontal"
                android:scaleType="centerInside"
                android:text="@string/highScores"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textColor="#fff" />

            <View
                android:layout_width="1dp"
                android:layout_height="20dp"></View>


            <TableLayout
                android:id="@+id/container"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical|center_horizontal">

            </TableLayout>

        </LinearLayout>

    </ScrollView>

</LinearLayout>

我使用以下元素填充'container'TableLayout:

    layout.addView(buildTitleRow());

    for (int i = 0; i < users.length(); i++) {

        JSONObject parent = (JSONObject) users.get(i);

        layout.addView(buildRowFrom(parent, i + 1));
    }

buildTitleRow:

private TableRow buildTitleRow(){

    TableRow result = new TableRow(this);

    int color = Color.parseColor("#ffff00");

    View view = new View(this);
    view.setMinimumWidth(10);
    result.addView(view);

    view = new View(this);
    view.setMinimumWidth(10);
    result.addView(view);

    //the same for other views        

    return result;
}

buildRowFrom:

private TableRow buildRowFrom(final JSONObject element, int counter) throws JSONException {

    TableRow result = new TableRow(this);

    String rowName = element.getString("name");

    int color = Color.parseColor("#00ff00");

    if(rowName.equals(userName)){
        color = Color.parseColor("#ffffff");
    }

    TextView textView = new TextView(this);
    textView.setText(counter + ".");
    textView.setTextColor(color);
    result.addView(textView);

    //some other views

    return result;
}

在滚动需要发生之前,这确实很有效......

一旦有比屏幕高度更多的元素,表格仍然可滚动(幸运的是),但原始的“标题”Textview不再显示(你不能再向上滚动)

有没有人知道如何调整布局,以便在添加的元素多于屏幕大小后可以看到它?

非常感谢,

S上。

2 个答案:

答案 0 :(得分:1)

我已经尝试过您的代码,发现您的xml布局中发现了一些错误。

属性android:layout_gravity将改变布局的自身重力。因此,如果将此属性设置为LinearLayout center且其android:layout_heightwrap_content(意味着&#39; LinearLayout&#39;的实际高度将超过屏幕高度)并填充ScrollView(其高度是屏幕的高度),LinearLayout将与其父ScrollView的中心对齐。

如果您想保留&#39; LinearLayout&#39;的内容居中,您可以将android:fillViewport="true"设置为ScrollView,然后LinearLayout将填充父级,您可以android:gravity="center"使用LinearLayoutReference

但仍有一些事情需要改变。在您的java代码中,View view = new View(this)这一行将是新的View,然后您将其添加到TableLayout。但由于以下TableLayout的说明,此View将充满View * The base class implementation of measure defaults to the background size, * unless a larger size is allowed by the MeasureSpec. Subclasses should * override {@link #onMeasure(int, int)} to provide better measurements of * their content. 您可以使用TextView之类的具体视图代替它。

我不知道我是否澄清了它。我想如果您删除android:layout_gravity的属性LinearLayout,它就会有效。

如果能有所帮助,我很高兴。

答案 1 :(得分:0)

我做了改编Paul建议+改变android:layout_height of ScrollView to&#34; wrap_content&#34;在android:layout_gravity =&#34; center&#34;中保持内部LinearLayout居中被删除(见下面的完整布局)。

如果没有保罗的建议和解释,我不会发现它,所以我接受他的答案作为答案,这个答案只是为了完整...

我并不期待这个问题能得到足够的关注; - )

谢谢保罗:-D

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerInParent="true"
    android:layout_centerVertical="true"
    android:background="#000"
    android:gravity="center_horizontal|center_vertical"
    android:orientation="vertical">

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal|center_vertical">

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="vertical">

            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription="@string/play"
                android:gravity="center_horizontal"
                android:scaleType="centerInside"
                android:text="@string/highScores"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textColor="#fff" />

            <View
                android:layout_width="1dp"
                android:layout_height="20dp"></View>

            <TableLayout
                android:id="@+id/container"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical|center_horizontal">

            </TableLayout>

        </LinearLayout>

    </ScrollView>

</LinearLayout>