在针对android 2.1或更低版本运行时,不会显示动态创建的内容

时间:2011-02-17 09:30:10

标签: android view tablelayout

我是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之后视图框架是否发生了变化?有关行动方案的任何建议吗?

2 个答案:

答案 0 :(得分:1)

我有类似的问题,我可以提出一些解决方案:

  1. 覆盖onDraw()并在那里调用requestLayout()以更新动态内容
  2. (更好的解决方案)使用以下内容:
  3.   

    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上没有正确绘制,但是,我会稍微不同地对mRowsmButtons进行初始化(紧跟在super.onSizeChanged之后和if之前1}}):

if ( mRows == null ) {
    mRows = new ArrayList<TableRow>();
}
if ( mButtons == null ) {
    mButtons = new ArrayList<Button>();
}

然后我会移除以下if并随附}

 if(mRows == null && mButtons == null){

我说这个的原因是,如果由于某种原因,mRowsmButtons中的某个非null,那么您的绘图代码将永远不会使用您当前的if调用声明。你明确地将它们初始化为null吗?