1

我有一個包含一些個人文本視圖的相關佈局。我需要把那些textviews具有x和y,所以我這樣做:如何在一個relativeLayout中將TextView移動到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的的左上角,而應該是中心。

爲了使它的中心,我overrided的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。

我該如何解決?


好的,我有一些消息。

我試着用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與params,另一個沒有:沒有改變。

這一次:

  • 我有2 textViewAnnotation,每一個呼叫功能 「onSizeChanged」,但只有一個呼叫的 「AjusterAnnotation」 功能,爲什麼呢?
07-13 18:05:18.086: DEBUG/TextViewAnnotation(980): onSizeChanged 
07-13 18:05:18.086: DEBUG/AffFiche(980): AjusterAnnotation [email protected] 
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」 不drawed,即使在X,Y,W和H都OK ...

請幫助u_u

回答

0

嗯,這似乎是一個非常複雜的處理佈局的方式。

爲什麼使用x和y座標而不是將重力設置爲中心?

AbsoluteLayout已被棄用的原因 - 但你可能會閱讀。但首先,您是否閱讀this或其他任何佈局教程?

+0

我知道不同的佈局,但我與x和y一起工作,因爲我有一些textViews將他們的中心coordonates放在imageView上。 – Imotep

+0

要堆疊視圖,您需要使用Framelayout,我相信......也許可以通過您的方式實現,但聽起來像是一種可能會跨平臺分離的黑客攻擊。 –

+0

問題是不知道它是好還是不這樣做(我不能通過其他方式做到這一點..),我想知道是否可以將新的RelativeLayout.LayoutParams直接應用到我的textView中?或者我絕對需要使用addView(view,params)在relativeLayout中完成它? – Imotep

相關問題