改变孩子布局参数对其父母有一个奇怪的影响

时间:2017-09-03 15:17:53

标签: android android-layout android-view

所以我有一个布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:id="@+id/rl_tooltip"
    android:visibility="gone"
    tools:visibility="visible">

    <View
        android:id="@+id/v_triangle"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_gravity="left"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="-15dp"
        android:background="@drawable/tooltip_triangle" />

    <TextView
        android:id="@+id/tv_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/v_triangle"
        android:background="@drawable/tooltip_bg"
        android:padding="10dp"
        android:textColor="@color/color_fefefe"
        tools:text="New Tooltip text" />
</LinearLayout>

我正在这样膨胀

 View content = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_tooltip, viewGroup, false);
        View v = viewGroup.findViewById(R.id.rl_tooltip);

所以这就是当我将这个内容视图添加到父布局时它的工作正常,布局宽度wrap_content在计算后大约是400px,但是当我更改子视图的layoutparams时v_triangle

LinearLayout.LayoutParams marginLayoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            marginLayoutParams.gravity = Gravity.RIGHT;
            contentView.findViewById(R.id.v_triangle).setLayoutParams(marginLayoutParams);
像这样,布局宽度现在是1080px(即屏幕宽度)。

所以我不明白为什么布局的行为正在发生变化。我需要该视图的实际宽度。

1 个答案:

答案 0 :(得分:0)

将您的代码更改为:

    View triangle = contentView.findViewById(R.id.v_triangle);
    LinearLayout.LayoutParams marginLayoutParams = (LinearLayout.LayoutParams) triangle.getLayoutParams();
    marginLayoutParams.gravity = Gravity.RIGHT;
    triangle.setLayoutParams(marginLayoutParams);

问题是您的v_triangle视图没有任何内容可以定义其宽度/高度(android:background没有定义内在尺寸),所以当你写

LinearLayout.LayoutParams marginLayoutParams = 
    new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                                ViewGroup.LayoutParams.WRAP_CONTENT);

你实际上最终会看到一个尽可能大的视图。而不是创建新的LayoutParams对象,只需通过调用View.getLayoutParams()重新使用现有的对象。请注意,您仍需要使用View.setLayoutParams()重新分配参数,以使更改生效。