11

我正在尝试创建一个垂直线性布局,其权重大于屏幕。假设是屏幕大小的 2 倍。为了使它起作用,我显然需要能够滚动浏览它。不幸的是,我想不出办法做到这一点。我尝试使用布局权重,并将权重总和设置为所有组件权重的实际总和的一半(因此,如果所有组件的权重总和为 20,我将权重总和设置为 10)并设法使其工作,但不幸的是由于某种原因,滚动不再起作用。

有什么我想念的吗?

这是使线性布局两倍于屏幕但滚动不起作用的代码:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:fillViewport="true">

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

        <EditText android:id="@+id/id1"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:textSize="25dp"
            android:gravity="center"
            android:layout_weight="2"/>

        <EditText android:id="@+id/id2"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:textSize="25dp"
            android:gravity="center"
            android:layout_weight="2"/>

    </LinearLayout>
</ScrollView>
4

3 回答 3

7

根据您的评论,这是一种实现您正在寻找的东西的编程方式。我不相信有办法在纯布局 XML 中实现这一点。

布局:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:background="#000000"
    android:fillViewport="true" >

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

        <EditText
            android:id="@+id/id1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#DCDCDC"
            android:gravity="center"
            android:text="ONE ONE ONE"
            android:textIsSelectable="false"
            android:textSize="45sp" />

        <EditText
            android:id="@+id/id2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#AAAAAA"
            android:gravity="center"
            android:text="TWO TWO TWO"
            android:textIsSelectable="false"
            android:textSize="45sp" />

        <EditText
            android:id="@+id/id3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#777777"
            android:gravity="center"
            android:text="THREE THREE THREE"
            android:textIsSelectable="false"
            android:textSize="45sp" />
    </LinearLayout>

</ScrollView>

活动:

public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      // Get display size -- API L13 and up. Otherwise use getResources().getDisplayMetrics();
      Display display = getWindowManager().getDefaultDisplay();
      Point size = new Point();
      display.getSize(size);


      // You want size to be 50% per EditText, so divide available height by 2.
      // Note: this is absolute height, does not take into consideration window decoration!
      int editTextHeight = size.y / 2;

      // Get a handle to your EditTexts
      EditText t1 = (EditText) findViewById(R.id.id1);
      EditText t2 = (EditText) findViewById(R.id.id2);
      EditText t3 = (EditText) findViewById(R.id.id3);

      // Set height to 50% of screen size each
      t1.setHeight(editTextHeight);
      t2.setHeight(editTextHeight);
      t3.setHeight(editTextHeight);
}

这样就可以了。最终结果:

EditText 50% 屏幕高度 EditText 50% 屏幕高度 EditText 50% 屏幕高度

于 2013-10-09T02:53:44.770 回答
3

你声明你的LinearLayoutmatch_parent”高度等于它的父母身高。只要内容更大,它就永远不会滚动ScrollView。首先,您必须提供固定高度,例如 (50dp),wrap_content或者您必须以编程方式设置其高度(例如您提到的 2x 屏幕高度)。

weightSum并且weight总是会强制您的物品适合您LinearLayouts当前的尺寸,所以尽量不要使用它。

我希望这有帮助。

于 2013-10-10T12:01:56.637 回答
1

layout_weight这里的问题是你的使用weightSum是无效的。重要的是要记住android:layout_weight只能使用视图中剩余的可用空间;超出该边界的任何内容都会被自动裁剪。

因此,在您的示例中,您的第一个EditText占用了整个屏幕,而您的第二个完全被排除在视图之外。因为第二个EditText被裁剪了,所以LinearLayout已经占据了整个屏幕并且没有什么ScrollView可做的。

我不完全确定您的最终目标是什么;您是否试图让文本输入随着用户输入而增长,并且ScrollView处理溢出?

如果是这样,这将起作用:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:background="#000000"
    android:fillViewport="true" >

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

        <EditText
        android:id="@+id/id1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#DCDCDC"
        android:gravity="center"
        android:text="ONE ONE ONE"
        android:textIsSelectable="false"
        android:textSize="45sp" />

    <EditText
        android:id="@+id/id2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#AAAAAA"
        android:gravity="center"
        android:text="TWO TWO TWO"
        android:textIsSelectable="false"
        android:textSize="45sp" />
    </LinearLayout>

</ScrollView>

我已经包含了一些基本的背景颜色,以便您可以在布局预览中看到每个项目的开始和结束位置。键入第一个EditText将正确地向下推第二个,产生一个滚动条。

另请注意,您应该使用sp而不是dpfortextSize值。

编辑:为了澄清起见,我还应该注意,这weightSum也会在必要时占用空间。要对此进行测试,请将weightSum您的设置LinearLayout为 2,然后添加android:layout_weight="1"到每个EditText控件。最终结果将是视图加载时的 50/50 分割,然后当您开始输入第一个控件时,第二个空间将相应缩小。将文本添加到第二个控件将导致出现滚动条。

于 2013-10-06T22:43:02.550 回答