【问题标题】:addRule in RelativeLayout.LayoutParams is not workingRelativeLayout.LayoutParams 中的 addRule 不起作用
【发布时间】:2019-08-24 00:36:57
【问题描述】:

我有这个代码:

final RelativeLayout headerRl=new RelativeLayout(SpeakersActivity.this);
            headerRl.setBackgroundColor(Color.parseColor(almacen.getColor()));
            final TextView initial=new TextView(SpeakersActivity.this);
            final RelativeLayout.LayoutParams headerParams=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 80);
            headerParams.addRule(RelativeLayout.CENTER_VERTICAL,RelativeLayout.TRUE);
            initial.setText(arrayInitials.get(i));
            initial.setTextColor(getColor(R.color.white));
            initial.setTextSize(16);
            initial.setPadding(10,0,0,0);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    headerRl.addView(initial,headerParams);
                    ll.addView(headerRl);
                }
            });

“ll”是一个线性布局。我在RelativeLayout.LayoutParams 上添加规则,我将视图添加到RelativeLayout,它被添加到LinearLayout。但我的观点不是垂直居中。我试图将它水平居中以查看它是否正常工作,但事实并非如此。为什么我的观点没有以 RL 为中心?如何居中?

谢谢。

【问题讨论】:

    标签: android android-relativelayout layoutparams


    【解决方案1】:

    试试

     final RelativeLayout.LayoutParams headerParams=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 80);
    
    /**
     * Rule that centers the child vertically with respect to the
     * bounds of its RelativeLayout parent.
     */           
     headerParams.addRule(RelativeLayout.CENTER_VERTICAL,RelativeLayout.TRUE);
    
     // your textview
     initial.setGravity(Gravity.CENTER_VERTICAL);
    

    【讨论】:

    • 如果我这样做,它将垂直和水平居中。我只希望它垂直居中。
    • 那么你可能应该将你的 textView 的重力设置为Gravity.CENTER_VERTICAL,因为Gravity.CENTER 水平和垂直居中
    【解决方案2】:
    initial.setGravity(Gravity.CENTER_VERTICAL);
    

    【讨论】:

    • 一个小小的解释确实有助于改进这个答案:)
    【解决方案3】:

    取决于您期望的结果 有两种方法可以解决您的问题。

    第一个: 问题出在 headerRl 中,默认设置为 wrap_content, wrap_content 所以,你需要用 match_parent 定义它的布局参数:

    headerRlLayoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) 
    headerRl.setLayoutParams(headerRlLayoutParams)
    

    第一个参数可以是 wrap_content,取决于你想要什么,但第二个参数应该是 match_parent,否则,默认情况下它将是 wrap_content,它将你的视图定位在顶部

    将 headerParams 创建为 headerParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT... 就是这样。 在此处匹配父级会导致您的视图占据整个父级的宽度。如果这就是你想要的,那么请看下面的第二个选项

    第二个: 如果您希望您的视图为 match_parent 并获取整个视图,那么 你的问题是: 新的 RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT 这会导致您的文本视图在布局中成为 match_parent。而且因为您没有设置视图的重力 - 文本具有默认值 - 顶部/开始。

    解决方案很简单 - 设置 TextView Gravity(与在 XML 中设置重力参数相同) - 视图将保持为 match_parent - 占据其父布局的整个宽度,但文本将垂直居中

    initial.setGravity(Gravity.CENTER_VERTICAL);
    

    还有一个小提示 - 您还可以在开发人员选项中设置“显示布局边界”以查看您的布局占用了多少空间以及视图如何在布局中自行定位。这有助于调试和了解到底出了什么问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多