2011-06-20 60 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); 
}