【问题标题】:Adding ScrollView to RelativeLayout changes position of wigdets将 ScrollView 添加到 RelativeLayout 会更改 wigdets 的位置
【发布时间】:2012-11-10 17:44:59
【问题描述】:

以下是我的布局的 XML。它明确指出标题、时间和描述 TextView 应位于警报图像下方。但是,如屏幕截图所示,TextViews 已移至ImageView。为什么会发生这种情况,我该如何解决?当我添加滚动视图时,问题才开始发生。

XML

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

    <ImageView
        android:id="@+id/img_alarm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/alarm"
        android:layout_centerInParent="true"
        android:contentDescription="@string/content_description_layout_alarm"/>

    <TextView
        android:id="@+id/lbl_alarm_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dip"
        android:textStyle="bold"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/img_alarm"
        android:layout_alignLeft="@+id/img_alarm"
        android:text="@string/empty"
        />   
        <TextView
        android:id="@+id/lbl_alarm_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dip"
        android:textStyle="bold"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/img_alarm"
        android:layout_alignRight="@+id/img_alarm"
        android:text="@string/empty"
        />  
      <TextView
        android:id="@+id/lbl_alarm_description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/lbl_alarm_title"
        android:layout_alignLeft="@+id/lbl_alarm_title"
        android:layout_alignRight="@+id/lbl_alarm_time"
        android:maxLines="1"
        android:ellipsize="marquee"
        android:text="@string/empty"
        />   

    <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/lbl_alarm_description"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="5dip"
        android:paddingLeft="20dip"
        android:paddingRight="20dip"
        android:text="@string/stop_layout_alarm"
        android:gravity="center" />

</RelativeLayout>
</ScrollView>

图片

【问题讨论】:

  • ScrollViewtry android:fillViewport="true"
  • 解决了定位问题,但是 ScrollView 现在不滚动了。
  • 我不确定在可以滚动的元素中包含android:layout_centerInParent="true" 是否有意义。如果删除它会发生什么?
  • @jush:图像偏离中心,看起来不太好。
  • 删除android:layout_centerInParent="true"Scroll 有什么影响?

标签: android scrollview android-relativelayout


【解决方案1】:

可爱的应用:)

嗯...不知道为什么这样做,看起来你有正确的代码,没有破坏eclipse。但我也有一些奇怪的相对布局错误,我不明白,也没有时间调试。

我知道另一种方法可以完成你正在寻找的东西 -

有一个包含线性布局而不是相对布局的滚动视图。做这些事情:

  1. 对于线性布局,您可以设置方向 = 垂直,这样它仍然是自上而下的顺序。
  2. 对于需要两个文本视图的部分,其中一个右对齐,另一个右对齐,您需要另一个内部线性布局,其方向=水平。然后让一个元素左对齐父元素,另一个元素右对齐父元素。为这个线性布局添加一个 weightSum=1 属性,并让两个 textview 中的每一个 layout_width=0.5 以便每个都是屏幕宽度的一半
  3. 将 weightSum=1 属性应用到最外层的线性布局,并查看内部的每个元素,使其 layout_weight 总和为 1。layout_weight 将允许元素占据屏幕上那么多 % 的空间。就像如果您将 imageView 设置为 android:layout_weight=0.8 那么它将占用 80% 的屏幕...因为从数学上讲, (layout_weight/weightSum) = (.08/1) = 80%

尝试使用该机制,如果应该工作:) 如果它令人困惑,我可以提供代码 例子

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

        <ImageView
            android:id="@+id/img_alarm"
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:src="@drawable/alarm"
            android:layout_weight="0.7"
            android:contentDescription="@string/content_description_layout_alarm"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.1">

            <TextView
                android:id="@+id/lbl_alarm_title"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:textSize="20dip"
                android:textStyle="bold"
                android:text="@string/empty"
                />   
                <TextView
                android:id="@+id/lbl_alarm_time"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:textSize="20dip"
                android:textStyle="bold"
                android:text="@string/empty"
                />  

        </LinearLayout>

          <TextView
            android:id="@+id/lbl_alarm_description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="0.1"
            android:maxLines="1"
            android:ellipsize="marquee"
            android:text="@string/empty"
            />   

        <Button
            android:id="@+id/btn_stop"
            android:layout_weight="0.1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="5dip"
            android:paddingLeft="20dip"
            android:paddingRight="20dip"
            android:text="@string/stop_layout_alarm"
            android:gravity="center" />

    </LinearLayout>
</ScrollView>

我希望这至少值得一票:D

【讨论】:

  • 等一下...当我在编辑这个时我才注意到 - 你所有的 textveiws 和按钮都有 layout_width="wrap_content",改为 layout_width="match_parent"
  • 谢谢。我想要可爱:) 我宁愿把它作为最后的手段。我尝试使用 LinearLayout 而不是 RelativeLayout,但我无法让 TextView 的标题与 ImageView 的左侧对齐,并且无法让 TextView 与 ImageView 的右侧对齐。我会试试你建议的重量。谢谢:)
  • 干得好 :) 嗯...我添加了一些示例代码,但我没有在 Eclipse 中运行它,所以希望它应该没问题。如果没有,请修改 layout_weight、layout_width 和所有这些...使用 0dp 以便 android 可以自动调整它
  • 好的,我设法让它工作,但通过使用LinearLayout-TableLayout 组合。我使用填充来获取中心的所有元素。我使用TableLayout 获得标题TextView 和时间TextView 在同一行。它看起来像我想要的那样滚动。谢谢:)
猜你喜欢
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
相关资源
最近更新 更多