Как переместить TextView к x и y в относительном расположении - PullRequest
1 голос
/ 11 июля 2011

У меня есть относительная задержка, которая содержит некоторые личные текстовые представления.Мне нужно поместить эти текстовые представления с x и ay, поэтому я делаю это:

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, в то время как это должно бытьцентр.

Чтобы сделать его центром, я переопределил onSizeChanged в моем TextViewAnnotation и вычел высоту / 2 и ширину / 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.

Как я могу это исправить?


хорошо, у меня есть некоторыеnews.

Я пытался изменить LayoutParams с помощью метода addView (view, params) объекта RelativeLayout.Для этого я создал «контроллер» в своей 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 "function, почему?
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
  • единственный textView, который сделал вызов" AjusterAnnotation ", не рисуется, даже если x, y, w и h в порядке ...

Пожалуйста, помогите u_u

1 Ответ

0 голосов
/ 11 июля 2011

Хм, это кажется очень запутанным способом обработки макета.

Почему вы используете координаты x и y вместо того, чтобы просто устанавливать гравитацию в центр?

AbsoluteLayout устарел по какой-то причине, но вы можете прочитать об этом.Но сначала вы прочитали этот или любой другой учебник по макету?

...