自定义视图中RelativeLayout内的Textview未正确应用对齐方式?

7

我有一个设置,我正在创建自己的View,并在其中添加一些TextView。但是,它的gravity设置已经失效了。(水平居中,但垂直方向不居中)我这样做是因为除了TextView之外,我还在我的视图中绘制其他东西,但这些都正常工作。只有TextView gravity存在问题。以下是我拥有的部分代码。

public class myView extends View {

    protected RelativeLayout baseLayout;
    protected TextView textView1;
    protected TextView textView2;

    public myView (Context context) {
        super(context);
        setLayoutParams(new LayoutParams(FILL_PARENT, FILL_PARENT));

        baseLayout = new RelativeLayout(context);
        baseLayout.setLayoutParams(new LayoutParams(FILL_PARENT, FILL_PARENT));

        textView1 = new TextView(context);
        // initialize textView1 string, id, textsize, and color here
        textView2 = new TextView(context);
        // initialize textView2 string, id, textsize, and color here

        baseLayout.addView(textView1);
        baseLayout.addView(textView2);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Resources res = getResources();
        // calculate out size and position of both textViews here
        textView1.layout(left1, top1, left1 + width1, top1 + height1);
        textView1.setGravity(Gravity.CENTER);
            textView1.setBackgroundColor(green); // just to make sure it's drawn in the right spot
        textView2.layout(left2, top2, left2 + width2, top2 + height2);
        textView2.setGravity(Gravity.CENTER);
            textView2.setBackgroundColor(blue); // same as above

        baseLayout.draw(canvas);
    }
}

这段代码在我想要的位置和大小绘制了TextView(我知道这是因为背景颜色),但是重力只将它们水平居中,而不是垂直居中。(是的,TextView比实际文本字符串要大)。
我可以尝试实现此处找到的解决方案(TextView gravity),但这似乎不是一个非常高效或可靠的方法来解决这个问题。是否有什么我做错了导致重力无法正常工作?任何输入/帮助都会受到赞赏。

两件事:1. 我没意识到一个视图可以包含一个 ViewGroup?2. 当子视图的位置被绝对设置时,为什么要使用 RelativeLayout? - samus
没关系,我没有意识到ViewGroup扩展了View!! - samus
已经有一段时间没有发布这篇文章了,但如果我记得正确的话——AbsoluteLayout需要不同的构造函数参数,使用RelativeLayout会更容易一些。但这可能不准确。无论如何,您可能希望某些视图位置是相对的,某些是绝对的——谁知道您可能计划了什么。至少使用相对布局,您将有这个选项。 :) - Joishi Bodio
3个回答

9

好的..所以我解决了这个问题。我只需要在每个TextView上运行measure()方法。所以我的新代码如下:

    textView1.measure(MeasureSpec.makeMeasureSpec(width1, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height1, MeasureSpec.EXACTLY));
    textView1.layout(left1, top1, left1 + width1, top1 + height1);
    textView1.setGravity(Gravity.CENTER);

    textView2.measure(MeasureSpec.makeMeasureSpec(width2, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height2, MeasureSpec.EXACTLY));
    textView2.layout(left2, top2, left2 + width2, top2 + height2);
    textView2.setGravity(Gravity.CENTER);

现在它水平和垂直都居中了,就像应该的那样。如果您也遇到了同样的问题,请尝试这个方法。

另一种方法是在TextView上使用WRAP_CONTENT,并更改父级对齐方式(Gravity.CENTER)或alignParent - Hugo Gresse

2
您可以使用setGravity设置多个重力参数,如下所示。
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL );

请看在Android中如何水平垂直居中TextView文本的方法

其实那就是我最初的想法,直到我发现只有"居中"这个选项(它是垂直和水平的按位或组合)...但这并不能解决这个问题。但我终于想通了。(如下所述) - Joishi Bodio

0

我也遇到了这个问题。我的问题是,当我通过调用TextView.setGravity()来设置TextView的重力时,它会在父视图中默默地影响自身(Textview)的布局。

以下是我为解决问题所做的临时修复措施:

TextView schedule = getBubbleTextView (item, hasZeroSpanEvent);
// There's a bug in TextView, we need to use wrapper to fix it   
LinearLayout wrapper = new LinearLayout (getApplicationContext ());
wrapper.addView (schedule); 
hourlyBubbleParent.addView (wrapper, llp);

你应该掌握使用包装器来解决这个问题的思路。

我很高兴,近两年后仍有人发现我的一些问题很有用.. ^.^ 如果我再次遇到这个问题,我会考虑这种方法 - 我想知道是否是相同的Android操作系统版本,或者即使在更新的API版本中问题仍然存在。(我记得当时我在编码API 7,可能是9) - Joishi Bodio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接