我有一个使用TextViews
进行布局的复杂时间表。我看到绝对布局已被折旧。现在我知道这是“糟糕的做法”,但我有一个结构良好的屏幕指标类,它将调整与屏幕尺寸/密度等相关的所有内容。
如果我不能使用绝对布局,那我怎么能告诉TextView
我想要它那么多左边和顶部? (比如使用绝对位置的HTML)?
我想以编程方式执行此操作而不使用XML。这是可能的还是我必须使用WebView
或画布?
EDIT ::
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);
}
这是我通过这个快速测试代码调用的方法:
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);
答案 0 :(得分: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);
答案 1 :(得分: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);
}