Android - 更改保证金的背景颜色

时间:2015-09-17 01:45:57

标签: android android-layout xml-layout

我有一个名为HostFragment的片段,它嵌套了一到四个其他片段。

这是HostFragment

的布局
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/hostFragmentLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="12dp">

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">

        <RelativeLayout
            android:id="@+id/fragmentContainer1"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

        <RelativeLayout
            android:id="@+id/fragmentContainer2"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

    </TableRow>

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">

        <RelativeLayout
            android:id="@+id/fragmentContainer3"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

        <RelativeLayout
            android:id="@+id/fragmentContainer4"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

    </TableRow>

</TableLayout>

这一点的重要部分是android:layout_marginTop="12dp"

背景:除此边距外,嵌套片段覆盖整个HostFragment。当嵌套片段更改其背景颜色时(通过调用Canvas#drawColor),HostFragment也需要更改此边距的颜色以匹配。我将所需的颜色存储在SharedPreferences

行为:如果用户从HostFragment转到SettingsActivity,更改颜色,然后返回HostFragment,嵌套的片段将更改其颜色立即(通过他们的onResume()方法),但HostFragment的边距仍将是旧颜色。如果用户随后离开HostFragment并转到另一个片段,然后返回HostFragment,则边距将更新其颜色。我不知道如何或为什么 - HostFragment中没有代码来更新颜色。 HostFragment中的代码仅处理交换嵌套片段。

问题:我需要立即更新边距颜色,因此在onResume()中,我尝试了类似mTableLayout.setBackgroundColor(...)甚至mView.setBackgroundColor(...)的内容({ {1}}是我在mView中膨胀的布局。这仍然不起作用,只有当用户离开并返回时颜色才会更新。

问题:一旦用户从另一个onCreateView()返回int,我怎样才能更改边距的颜色以匹配SharedPreferences中的HostFragment值1}}(用户从设置中返回后的权利)?

提前谢谢!

5 个答案:

答案 0 :(得分:5)

尝试提供paddingTop而不是marginTop,然后在onResume中更改mView.setBackgroundColor(...)的视图颜色。

  • 边距是视图外的空间,因此视图的背景颜色不会反映在边距空间中。
  • 填充是视图中的空间,给予视图的背景颜色也将应用于填充空间。

答案 1 :(得分:1)

无法设置边距的颜色。要实现这样的东西,有两件事要做。

1)使用填充而不是边距。 边距位于元素之外,而填充位于元素内部。这意味着元素的大小会增加,并且您将元素作为背景颜色的颜色也将应用于内容周围的区域。

2)使用边框或可绘制的边框。 这种方式需要更多的工作,但是可配置性非常高。只需将drawable设置为背景,并为其指定笔触宽度和颜色即可创建边框。有关更多信息(以及示例实现),请参阅https://stackoverflow.com/a/8203840/4330555

有关边距,填充,边框等的详细信息,请参阅http://www.w3schools.com/css/css_boxmodel.asp。这个网站为CSS解释了它,但这个概念在任何地方都是相同的。

答案 2 :(得分:0)

为了更改颜色.setBackgroundColor(...)应该在onResume()中工作,但您应该知道,正如上面已经指出的那样,边距区域是留在外面的空间从您的视图中查看其父视图。这就是为什么更改视图的背景颜色不会对边距产生影响。你可以做的是添加一个FrameLayout来封装你的TableLayout,以便你的TableLayout有一个参考来设置边距。在这种情况下,您应该能够更改FrameLayout的背景,它应该会影响所需的边距区域。

在下图中,红色矩形表示您在左侧看到的TableLayout,它是HostFragment的根视图,边距区域超出您的范围。在是的,HostFragment的根视图是FrameLayout,红色矩形仍然是TableLayout。在后一种情况下,您可以更改FrameLayout

的颜色

图片:http://oi59.tinypic.com/jz8q46.jpg

答案 3 :(得分:0)

试试这个,

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/c1_cnxlayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/black" >

    <RelativeLayout 
        android:id="@+id/c2_cnxlayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="50dp"
        android:layout_marginRight="50dp"
        android:background="@android:color/darker_gray" />

</RelativeLayout>

答案 4 :(得分:0)

最好的方法是使用背景资源指定具有不同颜色的多个形状并使用边距或填充..