【问题标题】:Circular dependencies cannot exist in RelativeLayoutRelativeLayout 中不能存在循环依赖
【发布时间】:2013-01-04 12:38:10
【问题描述】:

我正在将 View 渲染为 Bitmap。我需要一个在顶部或底部带有指针的气球,具体取决于它是否适合屏幕。为此,我使用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(...) 上崩溃,并出现 Circular dependencies cannot exist in RelativeLayout 错误。我尝试了不同的 LayoutParams(没有 setLayoutParams(...) measure(...) 会因空指针异常而崩溃),不同的 View.MeasureSpec em>-s 但没有成功。如果我在最后一个 ImageView 中删除 android:layout_below="@id/balloon_body" ,它可以工作,但底部指针位于顶部。

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

【问题讨论】:

    标签: android android-relativelayout


    【解决方案1】:

    问题是因为布局参数中有循环引用造成的。

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

    欲了解更多信息,请访问:Circular dependencies cannot exist in RelativeLayout, android?

    希望对你有帮助!

    【讨论】:

    • 请发表答案,参考文献。
    【解决方案2】:

    试试这个。

    <?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"
        />
    

    【讨论】:

    • 您应该考虑将&lt;ImageView android:id="@id/pointer_top" 换成&lt;ImageView android:id="@+id/pointer_top"android:layout_below="@+id/pointer_top" 换成android:layout_below="@id/pointer_top"
    • @Pankaj Singh 这将产生与LinearLayout 相同的问题,即顶部指针将位于气球下方而不是上方。
    • @shelll 将上面的 ImageView 替换为这个
    • 两个ImageViews 必须在&lt;LinearLayout android:id="@+id/balloon_body&gt; 之下,因为XML 中元素的顺序也定义了它们的Z 顺序,我需要两个指针都在主体之上气球。
    • @shell 以上 xml 很好,因为我已经看到 LinearLayout 位于两个图像视图的中间
    【解决方案3】:

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

    删除该形状或更改布局

    【讨论】:

      【解决方案4】:

      循环依赖表示两个连续的视图在位置上相互依赖。

      例如:

       <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 取决于 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>
      

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

      【讨论】:

        猜你喜欢
        • 2015-05-26
        • 1970-01-01
        • 2017-08-07
        • 2015-11-18
        • 2017-09-04
        • 1970-01-01
        • 1970-01-01
        • 2017-08-14
        • 1970-01-01
        相关资源
        最近更新 更多