以编程方式在 ImageView 上居中 TextView

Posted

技术标签:

【中文标题】以编程方式在 ImageView 上居中 TextView【英文标题】:Center TextView over ImageView programmatically 【发布时间】:2019-03-05 12:03:47 【问题描述】:

我想在我的应用中添加图片和文字。 我需要将文本置于图像的中心。 一切都是使用RelativeLayout 对象以编程方式完成的。 出于某种原因,我只能成功地将 TextView 垂直居中于 ImageView 上。

这是创建RelativeLayout的函数:

 private void buildPost(Context context)

    Random rnd = new Random();
    SquareImageView postBgImgIV = new SquareImageView(context);
    postBgImgIV.setBackgroundColor(Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
    postBgImgIV.setImageResource(R.drawable.clear);


    TextView postContentTV = new TextView(context);
    postContentTV.setText(this.postContent);
    postContentTV.setTextSize(42);
    //postContentTV.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
    postContentTV.setGravity(Gravity.CENTER);


    post = new RelativeLayout(context);
    post.addView(postBgImgIV);
    post.addView(postContentTV);

我确定我遗漏了一些东西,它无法用几行代码解决。 我很乐意得到帮助:)

【问题讨论】:

我认为您的视图缺少必需的宽度和高度,为此您需要一个 RelativeLayout.LayoutParams。使用此类时,您还必须相对于容器定位图像和文本视图(发布RelativeLayout)。如果您在 xml 中设置所有这些并将其更改为运行时而不是动态地创建所有内容,则会更容易一些。 这会有点困难,因为我在 xml 中没有 relativeLayout。我使用代码“随时随地”创建 relativeLayout,然后将 relativeLayout 推送到 scrollView。 你将不得不以编程方式进行。而RelativeLayout,在你添加到父视图之前,还需要设置它的Layouts,具体的类依赖于父视图。例如,如果它是 FrameLayout,则 RelativeLayout 需要将 FrameLayout.LayoutParams 设置为其 layoutParams。 谢谢,我试过了,现在我遇到了一个问题,我无法将 LinearLayout 参数(xml 中存在的布局)转换为 RelativeLayout 参数 【参考方案1】:

问题解决了! 实际上,我需要定义新的 RelativeLayout.LayoutParams,然后将 textView LayoutParams 定义为新的 RelativeLayout.LayoutParams。

代码吧:

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT);
    params.addRule(RelativeLayout.CENTER_IN_PARENT);
    postContentTV.setLayoutParams(params);

【讨论】:

【参考方案2】:

您需要在文本视图中添加布局参数

 TextView textView = new TextView(context);

RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            lp.addRule(RelativeLayout.CENTER_IN_PARENT);
            textView.setLayoutParams(lp);;

【讨论】:

这不起作用,因为 textView.getLayoutParams() 未定义并返回 null。错误信息:Attempt to invoke virtual method 'void android.widget.RelativeLayout$LayoutParams.addRule(int)' on a null object reference

以上是关于以编程方式在 ImageView 上居中 TextView的主要内容,如果未能解决你的问题,请参考以下文章

斯威夫特 3 |以编程方式添加约束不会使我的子视图居中

iOS 以编程方式居中对象

JavaFX - 垂直居中TextFlow中的文本

以编程方式为水平居中的元素提供偏移量

以编程方式显示 ImageView

以编程方式自动布局不垂直居中