【问题标题】:How to programmatically set the layout_align_parent_right attribute of a Button in Relative Layout?如何以编程方式设置相对布局中按钮的 layout_align_parent_right 属性?
【发布时间】:2011-06-06 01:07:31
【问题描述】:

我有一个以编程方式创建的相对布局:

 RelativeLayout layout = new RelativeLayout( this );
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);

现在我有两个按钮,我想在这个相对布局中添加它们。但问题是两个按钮都显示在 RelatiiveLayout 的左侧,彼此重叠。

buttonContainer.addView(btn1);
buttonContainer.addView(btn2);

现在我想知道如何以编程方式设置 android:layout_alignParentRight="true" 还是像我们在 xml 中那样设置按钮的 android:layout_toLeftOf="@id/btn" 属性?

【问题讨论】:

    标签: android android-relativelayout android-layoutparams


    【解决方案1】:

    您可以使用View.getLayoutParams 从代码中访问任何LayoutParams。您只需要非常清楚您访问的LayoutParams 是什么。这通常是通过检查包含的ViewGroup 来实现的,如果它有一个LayoutParams 内部子级,那么这就是你应该使用的那个。在您的情况下,它是RelativeLayout.LayoutParams。您将使用RelativeLayout.LayoutParams#addRule(int verb)RelativeLayout.LayoutParams#addRule(int verb, int anchor)

    您可以通过代码访问它:

    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)button.getLayoutParams();
    params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
    params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);
    
    button.setLayoutParams(params); //causes layout update
    

    【讨论】:

    • 如果主播没有id怎么办? params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);TextView tvUserName = new TextView(act);
    • 添加ID怎么样?
    • 如果buttonRecycleView 上怎么办?向同一个小部件添加相同或相反的规则不是问题吗?
    • 它只工作一次,如果我改变对齐它不会得到更新。我可以知道可能是什么问题吗??
    • 我尝试使用它,但它在addRule 的代码中变为红色?
    【解决方案2】:
    1. 您需要为 您需要参考的按钮: btn1.setId(1);
    2. 您可以使用 params 变量来 将参数添加到您的布局中,我 认为方法是addRule(),检查 为此的 android java 文档 LayoutParams 对象。

    【讨论】:

    • 我非常感谢任何一段代码。我在按钮中找不到任何方法。
    • 设置 id 没有帮助,因为它需要一个真实的资源 id 而不是一个数字,因为 setId 是用 @IdRes 注释的。
    • 那是新的,在过去,您可以从布局中获取资源编号,并将其用作不会发生冲突的资源 id 的基础。我猜谷歌一定已经阻止了/
    【解决方案3】:

    要添加值为 true 或 false 的 RelativeLayout 属性,请使用 0 表示 false 和 RelativeLayout.TRUE 表示 true:

    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) button.getLayoutParams()
    params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE)
    

    属性是否已经添加无关紧要,您仍然使用addRule(verb, subject) 来启用/禁用它。但是,在 API 17 之后,您可以使用 removeRule(verb),这只是 addRule(verb, 0) 的快捷方式。

    【讨论】:

      【解决方案4】:

      Kotlin 版本:

      将这些扩展与中缀函数一起使用,简化以后的调用

      infix fun View.below(view: View) {
          (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.BELOW, view.id)
      }
      
      infix fun View.leftOf(view: View) {
          (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.LEFT_OF, view.id)
      }
      
      infix fun View.alightParentRightIs(aligned: Boolean) {
          val layoutParams = this.layoutParams as? RelativeLayout.LayoutParams
          if (aligned) {
              (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
          } else {
              (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0)
          }
          this.layoutParams = layoutParams
      }
      

      然后将它们用作中缀函数调用:

      view1 below view2
      view1 leftOf view2
      view1 alightParentRightIs true
      

      或者您可以将它们用作普通功能:

      view1.below(view2)
      view1.leftOf(view2)
      view1.alightParentRightIs(true)
      

      【讨论】:

        猜你喜欢
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 2017-06-19
        • 2012-09-18
        • 2013-09-05
        • 1970-01-01
        • 2014-07-25
        • 2013-05-09
        相关资源
        最近更新 更多