我是Android应用程序开发的新手,我正在尝试创建充满小按钮的屏幕。为此我创建了TableLayout类,其中我用以下代码覆盖onSizeChanged方法:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if(mRows == null && mButtons == null){
Integer height = new Integer(mActivity.getString(R.string.buttonHeight));
Integer width = new Integer(mActivity.getString(R.string.buttonWidth));
mColumnCount = h / height.intValue();
mRowCount = w / width.intValue();
mRows = new ArrayList<TableRow>();
mButtons = new ArrayList<Button>();
int buttonID = 0;
for(int i = 0; i < mColumnCount ; i++) {
mRows.add(new TableRow(mActivity));
mRows.get(i).setPadding(0, 0, 0, 0);
addView(mRows.get(i));
for(int j = 0; j < mRowCount; j++){
mButtons.add(new Button(mActivity));
mButtons.get(buttonID).setLayoutParams(new TableRow.LayoutParams(width.intValue(), height.intValue()));
mButtons.get(buttonID).setBackgroundResource(R.drawable.btn_normal);
mButtons.get(buttonID).setClickable(true);
mButtons.get(buttonID).setSelected(false);
mButtons.get(buttonID).setPadding(0, 0, 0, 0);
mButtons.get(buttonID).setOnClickListener(this);
mButtons.get(buttonID).setId(buttonID);
mRows.get(i).addView(mButtons.get(buttonID));
buttonID++;
}
}
defineBorders();
}
}
现在代码在针对Android 2.2或更高版本运行时工作正常但是当我在Android 2.1或更低版本上运行它时我会得到空白屏幕。我没有任何需要android 2.2的组件才能执行。实际上所有组件都是API级别1的东西。
除了代码在2.1上工作正常,如果在作为Activity.setContentView()上的参数传递之前创建了布局。但我需要屏幕尺寸参数,以使布局适应不同的屏幕尺寸,根据我的理解,我只能从view.onSizeChanged方法获得它。
此外,当我搜索调用堆栈时。当框架调用view.onSizeChanged:
时,它在android 2.1上显示以下序列onSizeChanged(), onLayout()
当android 2.2上的序列为:
时onSizeChanged(), onLayout() onMeasure() onLayout()
这可能是框架视图缺陷吗?或者2.1之后视图框架是否发生了变化?有关行动方案的任何建议吗?
答案 0 :(得分:1)
我有类似的问题,我可以提出一些解决方案:
myCustomTableLayout.post(new Runnable() {
@Override
public void run() {
// Size of your table is known here
myCustomTableLayout.addDynamicalContent(
myCustomTableLayout.getWidth(), myCustomTableLayout.getHeight());
}
});
我没试过,但我相信你可以在onSizeChanged()中调用post()方法
答案 1 :(得分:0)
我是否错过了为什么不在xml中创建布局的原因,因为根据Supporting Multiple Screens,您希望支持的每个屏幕尺寸/密度?然后,您可以让Android处理选择适当的布局并正确绘制它。
编辑:
不确定为什么它在2.1上没有正确绘制,但是,我会稍微不同地对mRows
和mButtons
进行初始化(紧跟在super.onSizeChanged
之后和if
之前1}}):
if ( mRows == null ) {
mRows = new ArrayList<TableRow>();
}
if ( mButtons == null ) {
mButtons = new ArrayList<Button>();
}
然后我会移除以下if
并随附}
:
if(mRows == null && mButtons == null){
我说这个的原因是,如果由于某种原因,mRows
或mButtons
中的某个非null,那么您的绘图代码将永远不会使用您当前的if
调用声明。你明确地将它们初始化为null吗?