如何将 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 的开头