Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在relativeLayout中将文本视图移动到x和y_Android_Android Layout_Android Widget_Textview_Android Relativelayout - Fatal编程技术网

Android 如何在relativeLayout中将文本视图移动到x和y

Android 如何在relativeLayout中将文本视图移动到x和y,android,android-layout,android-widget,textview,android-relativelayout,Android,Android Layout,Android Widget,Textview,Android Relativelayout,我有一个relativelayout,其中包含一些个人文本视图。我需要将这些文本视图放置为x和y,所以我这样做: RelativeLayout layoutAnnotations = (RelativeLayout)findViewById(R.id.affichageFiche_layoutAnnotations); TextViewAnnotation tvAnno = new TextViewAnnotation(this,this,anno.getTexte(),anno.getFon

我有一个relativelayout,其中包含一些个人文本视图。我需要将这些文本视图放置为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填充和x填充:


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);
    }
如您所见,我尝试了该函数的两个版本:一个使用带参数的addView,另一个没有:未更改

这次:

  • 我有两个textViewAnnotation,每个调用函数“onSizeChanged”,但只有一个调用“AjusterAnnotation”函数,为什么
07-13 18:05:18.086:调试/文本视图注释(980):onSizeChanged 07-13 18:05:18.086:调试/生效(980):一个朱斯特符号附加。TextViewAnnotation@407405a0 7-13 18:05:18.106:调试/生效(980):古代:x:117 y:236 w:87 h:10 07-13 18:05:18.106:调试/生效(980):新潮:x:74 y:231 w:87 h:10 07-13 18:05:18.115:调试/文本视图注释(980):onSizeChanged
  • 唯一调用“AjusterAnnotation”的textView未绘制,即使x、y、w和h都正常

请帮助我,这似乎是一种非常复杂的布局处理方式

为什么要使用x和y坐标,而不只是将重心设置为中心


AbsoluteLayout被弃用是有原因的,但你可能已经读过了。但是首先,你读过或其他任何布局教程吗?

我知道不同的布局,但我正在使用x和y,因为我有一些文本视图要放在带有中心坐标的imageView上。要堆叠视图,我相信你需要使用Framelayout。。。也许这可以通过您的方式实现,但听起来像是一种可能会跨平台崩溃的黑客行为。问题不在于知道这样做是好是坏(我不能通过其他方式实现…),我想知道是否可以直接在其中将新的RelativeLayout.LayoutParams应用到我的textView?或者我绝对需要用addView(view,params)在relativeLayout中完成它?明白了-我不知道,但给了你+1,希望这里有人能做到。 07-13 18:05:18.086: DEBUG/TextViewAnnotation(980): onSizeChanged 07-13 18:05:18.086: DEBUG/AffFiche(980): AjusterAnnotation affichageFiche.TextViewAnnotation@407405a0 07-13 18:05:18.106: DEBUG/AffFiche(980): Ancien : x:117 y:236 w:87 h:10 07-13 18:05:18.106: DEBUG/AffFiche(980): Nouveau : x:74 y:231 w:87 h:10 07-13 18:05:18.115: DEBUG/TextViewAnnotation(980): onSizeChanged