如何将 TextView 移动到 relativeLayout 中的 x 和 y

Posted

技术标签:

【中文标题】如何将 TextView 移动到 relativeLayout 中的 x 和 y【英文标题】:How to move a TextView to an x and an y in a relativeLayout 【发布时间】:2011-10-02 23:02:19 【问题描述】:

我有一个包含一些个人文本视图的相对布局。我需要用 x 和 y 放置这些文本视图,所以我这样做:

RelativeLayout layoutAnnotations = (RelativeLayout)findViewById(R.id.affichageFiche_layoutAnnotations);

TextViewAnnotation tvAnno = new TextViewAnnotation(this,this,anno.getTexte(),anno.getFontSize());

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.leftMargin = x;
params.topMargin = y;
layoutAnnotations.addView(tvAnno, params);

问题是我给的x和y会是textView的左上角,而应该是中心。

为了使其成为中心,我在 TextViewAnnotation 中覆盖了 onSizeChanged,并将 height/2 和 width/2 减去当前的 y padding 和 x padding:


protected void onSizeChanged(int w, int h, int oldw, int oldh) 
   Log.d("TextViewAnnotation", "onSizeChanged");
   super.onSizeChanged(w, h, oldw, oldh);
   if (w ==0 || h==0) return;

   RelativeLayout.LayoutParams old_params = (RelativeLayout.LayoutParams)getLayoutParams();
   int old_x = old_params.leftMargin;
   int old_y = old_params.topMargin;

   Log.d("AffFiche", "Ancien : x:"+old_x+" y:"+old_y+" w:"+w+" h:"+h);

   RelativeLayout.LayoutParams new_params = new RelativeLayout.LayoutParams(w, h);
   new_params.leftMargin = old_x - w/2;
   new_params.rightMargin = old_y - h/2;
   Log.d("AffFiche", "Nouveau : x:"+new_params.leftMargin+" y:"+new_params.rightMargin+" w:"+w+" h:"+h);

   setLayoutParams(new_params);

但它什么也没做...我认为这是因为 setlayoutParams 采用 ViewGroup.LayoutParams 而不是 RelativeLayout.LayoutParams。

我该如何解决?


好的,我有一些消息。

我尝试使用RelativeLayout 的addView(view,params) 方法更改LayoutParams。 为此,我在 TextViewAnnotation 中创建了一个“控制器”,以便在触发 onSizeChanged 方法时调用此对象的方法:


//in TextViewAnnotation class
protected void onSizeChanged(int w, int h, int oldw, int oldh) 
        Log.d("TextViewAnnotation", "onSizeChanged");
        super.onSizeChanged(w, h, oldw, oldh);
        if (w ==0 || h==0) return;
        controller.ajusterAnnotation(this,w,h);
    

//in my controller class
public void ajusterAnnotation(TextViewAnnotation annotation,int w,int h)
        Log.d("AffFiche", "AjusterAnnotation "+annotation);
        RelativeLayout layoutAnnotations = (RelativeLayout)findViewById(R.id.affichageFiche_layoutAnnotations);

        RelativeLayout.LayoutParams old_params = (RelativeLayout.LayoutParams)annotation.getLayoutParams();
        int old_x = old_params.leftMargin;
        int old_y = old_params.topMargin;
        Log.d("AffFiche", "Ancien : x:"+old_x+" y:"+old_y+" w:"+w+" h:"+h);

        RelativeLayout.LayoutParams new_params = new RelativeLayout.LayoutParams(w, h);
        new_params.leftMargin = old_x - w/2;
        new_params.rightMargin = old_y - h/2;
        Log.d("AffFiche", "Nouveau : x:"+new_params.leftMargin+" y:"+new_params.rightMargin+" w:"+w+" h:"+h);

        layoutAnnotations.removeView(annotation);
        //layoutAnnotations.addView(annotation, new_params);
        annotation.setLayoutParams(new_params);
        layoutAnnotations.addView(annotation);
    

如您所见,我尝试了此函数的 2 个版本:一个使用带参数的 addView,另一个不使用 : 没有任何变化。

这次:

我有2个textViewAnnotation,每个调用“onSizeChanged”函数,但只有一个调用“AjusterAnnotation”函数,为什么?
07-13 18:05:18.086: 调试/TextViewAnnotation(980): onSizeChanged
07-13 18:05:18.086: 调试/AffFiche(980): AjusterAnnotation affichageFiche.TextViewAnnotation@407405a0
07-13 18:05:18.106: 调试/AffFiche(980): Ancien: x:117 y:236 w:87 h:10
07-13 18:05:18.106:调试/AffFiche(980):Nouveau:x:74 y:231 w:87 h:10
07-13 18:05:18.115:调试/TextViewAnnotation(980):onSizeChanged
调用“AjusterAnnotation”的唯一 textView 未绘制,即使 x、y、w 和 h 都正常...

请帮帮忙

【问题讨论】:

【参考方案1】:

嗯,这似乎是一种非常复杂的布局处理方式。

为什么你使用 x 和 y 坐标而不是仅仅将重力设置为中心?

AbsoluteLayout 被弃用是有原因的——但你可能会读到这一点。但首先,您是否阅读过this 或任何其他布局教程?

【讨论】:

我知道不同的布局,但我正在使用 x 和 y,因为我有一些 textView 可以放在带有中心坐标的 imageView 上。 要堆叠视图,您需要使用 Framelayout 我相信...也许可以按照您的方式实现,但听起来有点像跨平台的 hack。 问题是不知道这样做好不好(我不能通过其他方式做到这一点..),我想知道我是否可以应用新的RelativeLayout。 LayoutParams 把我的textView 直接放在里面吗?或者我绝对需要在 relativeLayout 中使用 addView(view,params)? 知道了-我不知道,但给了你+1希望这里有人这样做。

以上是关于如何将 TextView 移动到 relativeLayout 中的 x 和 y的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective-C 中加载时将光标移动到预填充 Textview 的开头

如何使用textview移动到表格视图中的下一个单元格/行

如何使用css将div位置绝对移动到中心? [复制]

将文本视图移动到文本视图的末尾

如何将 TextView 拖到正确的目标其他 TextView

Xamarin Android - 如何在textview动画期间阻止文本移动