2011-06-20 56 views
0

我有一個複雜的時間表使用TextViews佈局。我發現絕對佈局已被折舊。現在我知道這是「不好的做法」,但我有一個格式良好的屏幕度量類,將調整所有相關的屏幕尺寸/密度等。android絕對佈局

如果我不能使用絕對佈局,那我該如何告訴TextView我想要這麼多左和頂? (就像使用絕對位置的HTML一樣)?

我想以編程方式不使用XML。這是可能的還是我必須使用WebView或畫布?

編輯::

void positionView (TextView v, int x, int y, int w, int h){ 
    final ViewGroup.MarginLayoutParams lpt = new ViewGroup.MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);//v.getLayoutParams(); 
    //lpt.setMargins(x,y,x+w,y+h); 
    lpt.height=h; 
    lpt.width=w; 
    lpt.topMargin=y; 
    lpt.leftMargin=x; 
    v.setLayoutParams(lpt); 

} 

這是方法,我從這個快速testcode呼籲:

 ScrollView dayViewContainer = new ScrollView(context); 
    dayViewContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    FrameLayout dayView = new FrameLayout(context); 
    dayView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    dayView.setBackgroundColor(0xFF00FF00) 
    int lineHeight = 60; 

    for(int i =0;i<11 ;i++){ 
     TextView hourView = new TextView(context); 
     hourView.setText(""+i+":00"); 
     BrScreenMetrics.getScreenWidthPX()-20, lineHeight); 
     positionView(hourView, 50, i*lineHeight, BrScreenMetrics.getScreenWidthPX()-20, lineHeight); 
     dayView.addView(hourView); 
     } 

    dayViewContainer.addView(dayView); 
    addView(dayViewContainer); 

回答

1

是的,你可以通過下面的代碼做編程..

TextView title = ((TextView)findViewById(R.id.default_panel_title)) 
final ViewGroup.MarginLayoutParams lpt =(MarginLayoutParams)title.getLayoutParams(); 

lpt.setMargins(0,lpt.topMargin,lpt.rightMargin,lpt.bottomMargin); 

title.setLayoutParams(lpt); 
+0

是@Sujit貼會爲你工作的偉大這段代碼,你可以考慮使用的FrameLayout作爲替代的絕對佈局。您可以從左上角開始設置邊距,並且放置在frameLayout中的視圖不依賴於彼此。他們是一個在另一個之上,所以他們可以重疊放在任何地方你想要的地方等。 – DArkO

+0

很好,這聽起來很完美,謝謝 –

+0

不幸的是它沒有工作。我創建了一個框架視圖並將邊距添加到視圖中,但它們只停留在0,0。我可能需要使用webview,因爲我已經浪費了一天的時間已經:( 我不明白他們爲什麼折舊絕對佈局,因爲它確實是我想要的,並且當使用屏幕指標進行計算時可以在不同的設備上正常工作。 –

1

好吧,整整24小時的頭疼我終於想出了一個答案爲我自己和其他人:D 感謝大家,您的投入肯定會讓我走向正確的方向!

基本上framelayout邊緣不能正常工作,除非我失去了一些東西。所以我所做的是必須擴展一個完全展開的線性佈局,並在其內部保留所需的視圖。

例如:

public class BrPositionableTextView extends LinearLayout{ 

TextView text ; 

public BrPositionableTextView(Context context, int x, int y, int w, int h) { 
    super(context); 

    setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    text = new TextView(context); 
    text.setHeight(h); 
    text.setGravity(Gravity.CENTER_VERTICAL); 
    LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    params.setMargins(x, y, 0, 0); 
    params.height = h; 
    params.width = w; 
    addView(text, params); 
} 

/** 
* @return the text 
*/ 
public String getText() { 
    return text.getText().toString(); 
} 

/** 
* @param text the text to set 
*/ 
public void setText(String text) { 
    this.text.setText(text); 
} 

public void setMargins(int x, int y, int w, int h) { 
    //not tested, may need to recreate textview... 
    LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    params.setMargins(x, y, x+w, y+h); 
    text.setLayoutParams(params); 
} 

public void setBackgroundColor(int color) 
{ 
    text.setBackgroundColor(color); 
} 

}

這可以隨後被添加到的FrameLayout並顯示在正確的位置的圖。

例子:

 ScrollView dayViewContainer = new ScrollView(context); 
    dayViewContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    FrameLayout dayView = new FrameLayout(context); 
    dayView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    dayView.setBackgroundColor(0xFF005000); 
    dayView.setMinimumHeight(BrScreenMetrics.getScreenHeightMinusStatusBar()); 
    dayView.setMinimumWidth(BrScreenMetrics.getScreenWidthPX()); 
    int lineHeight = 60; 

    for(int i =0;i<11 ;i++){ 
     BrPositionableTextView hourView = new BrPositionableTextView(
       context, 
       8, 
       i*lineHeight, 
       80, 
       lineHeight); 

     hourView.setText(""+(i+7)+":00"); 

     dayView.addView(hourView); 
     BrPositionableSeparator separator = new BrPositionableSeparator(
       context, 
       80, 
       (i*lineHeight)+((int)(lineHeight*0.5f)), 
       BrScreenMetrics.getScreenWidthPX()-117, 
       1); 

     separator.setColor(0xFFFFFFFF); 
     dayView.addView(separator); 

    } 
    BrPositionableTextView bigassBox= new BrPositionableTextView(context, 100,200,300,500); 
    bigassBox.setBackgroundColor(0xFF0000FF); 
    dayView.addView(bigassBox); 

    dayViewContainer.addView(dayView); 
    addView(dayViewContainer); 
}