【问题标题】:Issue with RelativeLayout when View visibility is View.GONE当视图可见性为 View.GONE 时,RelativeLayout 出现问题
【发布时间】:2010-07-19 07:15:54
【问题描述】:

我有一个RelativeLayout,因此:

<RelativeLayout>
<TextView1/>
<TextView2/> // <-- View.VISIBLE OR View.GONE
<TextView3/>
<TextView4/>
</RelativeLayout>

每个TextView 都用android:layout_below 锚定在前一个TextView 之下。

问题在于 TextView2 可能存在也可能不存在(View.VISIBLEView.GONE);如果是View.VISIBLE,则一切正常,但如果是View.GONE,则TextView3 最终会在TextView1 之上呈现。

我尝试了各种方法来解决这个问题,但每次都被RelativeLayout 的“在定义之前不能引用 id”规则所困扰。

我希望我在这里遗漏了一些明显的东西。

【问题讨论】:

标签: android android-relativelayout


【解决方案1】:

你可以使用这个标签:

android:layout_alignWithParentIfMissing="true"

来自文档:

如果设置为true,当layout_toLeftOf、layout_toRightOf等找不到anchor时,parent会作为anchor。

【讨论】:

  • 这仅在需要与父视图对齐时才有效,但问题是如何与前一个视图对齐,而不是父视图。
  • @dismuz,这对于管理动态布局非常有用,并且可以避免在不可预见的极端情况下出现任何意外。
【解决方案2】:

您可以将textview 2和3放在LinearLayout中,并将线性布局保持在textview 1下方。

【讨论】:

  • 向布局文件添加层次结构总是一个坏主意,尤其是当它是相对布局时。添加的越多,Android 将创建更多对象来表示您的布局。您应该改用 android:layout_alignWithParentIfMissing="true" 之类的东西。您也可以考虑使用其他布局,例如 TableLayout。
【解决方案3】:

更新TextView2的可见性时,为什么不更新TextView3的below属性呢? (我假设您在代码中执行此操作)

类似

TextView tv = (TextView) findViewById(R.id.textview3);
RelativeLayout.LayoutParams lp =
    (RelativeLayout.LayoutParams) tv.getLayoutParams();
lp.addRule(RelativeLayout.BELOW, R.id.textview1);
((TextView) view).setLayoutParams(lp);

【讨论】:

    【解决方案4】:

    此答案不能解决您的具体问题,但确实解决了类似的问题,因此希望这会对某人有所帮助。

    我的相对布局没有与您的 TextView1 等效的情况。因此,在我的情况下,如果 TextView2 已消失,那么我希望 TextView3 与父级的顶部对齐。我通过向 TextView3 添加属性 android:layout_alignWithParentIfMissing="true" 解决了这个问题。见http://developer.android.com/resources/articles/layout-tricks-efficiency.html

    不幸的是,除非它是父级,否则我看不到指定备用对齐锚点的方法。

    【讨论】:

      【解决方案5】:

      忘记INVISIBLEGONE,改用这个:

      RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();
      
      params.height = 0;
      
      params.setMargins(0,0,0,0);
      
      view.setLayoutParams(params);
      

      【讨论】:

        【解决方案6】:

        你可以这样做

        <RelativeLayout>
        <TextView1/>
        <FrameLayout>
          <TextView2/>  // <-- View.VISIBLE OR View.GONE
        </FrameLayout>
        <TextView3/>
        <TextView4/>
        </RelativeLayout>
        

        让TextView3在这个没有背景的FrameLayout下面,所以如果TextView2是Gone,它不会占用空间。

        【讨论】:

          【解决方案7】:

          将所有文本视图放置在垂直方向的LinearLayout下。

          <LinearLayout>
          <TextView/>
          <TextView/>
          <TextView/>
          <TextView/>
          <TextView/>
          <TextView/>
          </LinearLayout>
          

          【讨论】:

            【解决方案8】:

            一个简单的技巧是使用 alpha 0/1。 如果有的话,也禁用 onClickListener

            【讨论】:

            • 这将占用不必要的空间。
            猜你喜欢
            • 1970-01-01
            • 2017-03-10
            • 1970-01-01
            • 2017-05-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-25
            相关资源
            最近更新 更多