我有一個包含一些個人文本視圖的相關佈局。我需要把那些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
我知道不同的佈局,但我與x和y一起工作,因爲我有一些textViews將他們的中心coordonates放在imageView上。 – Imotep
要堆疊視圖,您需要使用Framelayout,我相信......也許可以通過您的方式實現,但聽起來像是一種可能會跨平臺分離的黑客攻擊。 –
問題是不知道它是好還是不這樣做(我不能通過其他方式做到這一點..),我想知道是否可以將新的RelativeLayout.LayoutParams直接應用到我的textView中?或者我絕對需要使用addView(view,params)在relativeLayout中完成它? – Imotep