我正在尝试创建一个垂直linearlayout,其权重大小比屏幕大。比方说屏幕尺寸的2倍。为了使其工作,我显然需要能够滚动它。不幸的是,我无法想办法做到这一点。我尝试使用布局权重,并将权重总和设置为所有组件权重的实际总和的一半(因此,如果所有组件权重总和为20,我将权重总和设置为10)并设法使其工作但不幸的是滚动由于某种原因不再起作用。
我有什么遗失的吗?
这是使linearlayout比屏幕大两倍但滚动不起作用的代码:
<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>
答案 0 :(得分: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);
}
那样做。最终结果:
答案 1 :(得分:3)
您宣布LinearLayout
“match_parent
”的高度等于其父母身高。只要内容大于ScrollView
,它就永远不会滚动。首先,你必须给出一个固定的高度,如(50dp)或wrap_content
,或者你必须以编程方式设置它的高度(就像你提到的2x屏幕高度)。
weightSum
和weight
将始终强制您的商品符合LinearLayouts
当前尺寸,因此请尽量不要使用它。
我希望这会有所帮助。
答案 2 :(得分: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
值,您应使用dp
代替textSize
。
编辑:我还应注意,为了澄清,weightSum
还会在必要时带走空间。要对此进行测试,请将weightSum
的{{1}}设置为2,然后将LinearLayout
添加到每个android:layout_weight="1"
控件中。视图加载时,最终结果将是50/50分割,然后当您开始在第一个控件中键入时,第二个空格将相应缩小。将文本添加到第二个控件将导致出现滚动条。