Launcher(主屏/待机) App的BUG: 没有初始化定义CellLayout中屏幕方向的布尔值参数

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;// 新增代码

... ...

}

 

根据提供的代码片段和错误信息,有以下几个问题需要解决: 1. 在 `PasswordDialog.java` 文件的第 22 行,出现了一个错误,提示 `PasswordDialog` 类未能重写抽象方法 `onClick`。请确保 `PasswordDialog` 类正确实现了 `View.OnClickListener` 接口,并且重写了其的 `onClick` 方法。 2. 在第 53 行和第 55 行,出现了 `incompatible types` 错误,提示无法将某些类型转换为 `OnClickListener`。请检查这两行代码,并确保传递给 `setOnClickListener` 方法的参数是一个实现了 `OnClickListener` 接口的对象。 3. 在最后一行,出现了 `continueBtn.setonClick! Listener(this)` 的错误。请注意,`setOnClick! Listener` 应该是 `setOnClickListener` 的拼写错误。请将这一行代码的错误拼写修正为 `setOnClickListener(this)`。 以下是一个修正后的代码片段示例: ```java public class PasswordDialog extends Dialog implements View.OnClickListener { private Button cancelBtn; private Button continueBtn; public PasswordDialog(Context context) { super(context); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog_password); cancelBtn = findViewById(R.id.cancel_button); continueBtn = findViewById(R.id.continue_button); cancelBtn.setOnClickListener(this); continueBtn.setOnClickListener(this); } @Override public void onClick(View v) { if (v == cancelBtn) { // 取消按钮被点击 // 执行相应的操作 } else if (v == continueBtn) { // 继续按钮被点击 // 执行相应的操作 } } } ``` 请根据上述示例代码修正你的代码,并确保你的类正确实现了 `OnClickListener` 接口,并在 `onClick` 方法处理按钮的点击事件。如果问题仍然存在,请提供更多的代码和错误信息,以便我能够更好地帮助你。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值