随笔-1  评论-68  文章-98  trackbacks-0

Launcher App:\cupcake\packages\apps\Launcher

待机画面分为多层,桌面Desktop Items在\res\layout-*\workspace_screen.xml中设置:

<com.android.launcher.CellLayout

... ...

    launcher:shortAxisCells="4"
    launcher:longAxisCells="4"

... ...

/>

表示4行4列

再看看 com.android.launcher.CellLayout ,其中有定义屏幕方向的参数,

private boolean mPortrait;

但是一直没有初始化,也就是mPortrait=false,桌面的单元格设置一直是以非竖屏(横屏)的设置定义进行初始化。

再来看看横屏和竖屏情况下的初始化不同之处,就可以看出BUG了。

boolean[][] mOccupied;//二元单元格布尔值数组

            if (mPortrait) {
                mOccupied = new boolean[mShortAxisCells][mLongAxisCells];
            } else {
                mOccupied = new boolean[mLongAxisCells][mShortAxisCells];
            }

如果我们满屏显示桌面(横向和纵向的单元格数不一致),而不是默认的只显示4行4列,则mShortAxisCells = 4, mLongAxisCells = 5,数组应该初始化是:new boolean[4][5],但是实际是按照非竖屏处理,初始化成了new boolean[5][4],会产生数组越界异常。

可以在构造函数中,添加通过屏幕方向初始化mPortrait,代码如下:

public CellLayout(Context context, AttributeSet attrs, int defStyle)

{
        super(context, attrs, defStyle);
        mPortrait = this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;// 新增代码

... ...

}


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/netpirate/archive/2009/06/05/4245445.aspx

posted on 2009-08-29 23:26 Xu Jianxiang 阅读(618) 评论(0)  编辑  收藏 所属分类: Android

只有注册用户登录后才能发表评论。


网站导航: