2

我正在将 View 渲染为Bitmap. 我需要一个在顶部或底部带有指针的气球,具体取决于它是否适合屏幕。为此,我使用 a RelativeLayout,因为我需要指针部分位于气球上方:

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

    <LinearLayout android:id="@+id/balloon_body"
        android:layout_width="@dimen/pins_details_balloon_width"
        android:layout_height="wrap_content"
        android:layout_marginTop="-1dp"
        android:layout_marginBottom="-1dp"
        android:layout_below="@+id/pointer_top"
        android:orientation="vertical"
        >

        <TextView android:id="@android:id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="4dp"
            />

        <TextView android:id="@android:id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="4dp"
            />

    </LinearLayout>

    <ImageView android:id="@id/pointer_top"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <ImageView android:id="@+id/pointer_bottom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/balloon_body"
        />

</RelativeLayout>

我膨胀这个视图,然后我想测量和布局它,所以我可以把它渲染成一个位图:

view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
//view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
//view.measure(View.MeasureSpec.makeMeasureSpec(3000, View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(3000, View.MeasureSpec.AT_MOST));
view.layout(0, 0, s_View.getMeasuredWidth(), s_View.getMeasuredHeight());

此代码在view.measure(...)上崩溃,在 RelativeLayout错误中不能存在循环依赖项。我尝试了不同的LayoutParams(没有 setLayoutParams(...) measure(...)崩溃并出现空指针异常),不同的View.MeasureSpec -s 但没有成功。如果我在最后一个 ImageView 中删除android:layout_below="@id/balloon_body",它可以工作,但底部指针位于顶部。

我不能使用 LinearLayout,因为我需要将这些指针放在气球体的上方,而使用 LinearLayout 时,顶部指针将位于它的下方。问题出在哪里,我怎样才能实现我想要的?

4

4 回答 4

2

问题是由于布局参​​数中存在循环引用引起的。

例如,当视图 B 是 layout_below 视图 A 时,视图 A 不能再在其下方引用视图 B,alignRight 等。这也可以存在于多个视图之间:A 引用 B 引用 C。在那种情况下,C 不能引用 A因为循环依赖。

有关更多信息,请转到:RelativeLayout 中不能存在循环依赖项,android?

希望能帮助到你!

于 2016-11-29T00:46:49.380 回答
0

尝试这个。

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

 <ImageView android:id="@id/pointer_top"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
<LinearLayout android:id="@+id/balloon_body"
    android:layout_width="@dimen/pins_details_balloon_width"
    android:layout_height="wrap_content"
    android:layout_marginTop="-1dp"
    android:layout_marginBottom="-1dp"
    android:layout_below="@+id/pointer_top"
    android:orientation="vertical"
    >

    <TextView android:id="@android:id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="4dp"
        />

    <TextView android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="4dp"
        />

</LinearLayout>
<ImageView android:id="@+id/pointer_bottom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/balloon_body"
    />

于 2013-01-04T12:41:16.230 回答
0

循环依赖意味着两个连续的视图在位置上相互依赖。

例如:

 <android.support.v4.view.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/tabs"
    android:layout_above="@id/orderpaylayout"
    />

<Button
    android:id="@+id/orderbutton"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_margin="20dp"
    android:layout_centerInParent="true"
    android:background="@drawable/orderbuttonstyle"
    android:text="@string/order"
    android:textSize="16sp"
    android:textStyle="bold"
    android:visibility="gone" />

<Button
    android:id="@+id/paybutton"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_centerInParent="true"
    android:text="@string/Pay"
    android:textColor="#ffffff"
    android:textSize="16sp"
    android:visibility="gone"
    android:layout_below="@id/viewPager
    android:textStyle="bold"
    android:layout_margin="20dp"
    android:background="@drawable/paybuttonstyle"
    />

在上面的 XML 中,有三个视图。第一个视图 ViewPager 取决于 order button as layout_above = orderButton。一旦顶视图或底视图依赖于其他视图,就不能发生反向/向后依赖,即两个视图不能同时相互依赖

上述错误示例的正确 XML 代码是:

 <android.support.v4.view.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/tabs"
    android:layout_above="@id/orderpaylayout"
    />

<RelativeLayout
    android:id="@+id/orderpaylayout"
    android:layout_width="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_height="wrap_content">

<Button
    android:id="@+id/orderbutton"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_margin="20dp"
    android:layout_centerInParent="true"
    android:background="@drawable/orderbuttonstyle"
    android:text="@string/order"
    android:textSize="16sp"
    android:textStyle="bold"
    android:visibility="gone" />

<Button
    android:id="@+id/paybutton"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_centerInParent="true"
    android:text="@string/Pay"
    android:textColor="#ffffff"
    android:textSize="16sp"
    android:visibility="gone"
    android:textStyle="bold"
    android:layout_margin="20dp"
    android:background="@drawable/paybuttonstyle"
    />
</RelativeLayout>

希望,这个例子会对你有所帮助。如果您认为这是正确的,请为其他好处投票,或者如果它是错误的或不起作用,请发表您的评论。

于 2019-05-03T09:10:37.957 回答
0

如果您在相对布局中使用圆形背景(可绘制形状),则会抛出该错误

删除该形状或更改布局

于 2017-10-11T12:28:12.393 回答