android - 应用程序在数组末尾崩溃

标签 android arrays

我的应用程序在 bluestacks 数组末尾崩溃。我不知道为什么。

当我单击数组末尾的下一个按钮时,应用程序崩溃。我也在手机上测试过,结果一样。应用程序的其余部分按预期运行。

据我所知“i %= image_elements.length;”应该是循环数组的函数。

我很确定这就是崩溃的根源。

i++;

element.setImageResource(image_elements[i]);
name.setImageResource(image_names[i]);

i %= image_elements.length;

完整代码如下

public class Practice extends MainMenuActivity {

    int i = 0;
    final int[] image_elements = {
        R.drawable.spr_elements_0,
        R.drawable.spr_elements_1,
        [...]
        R.drawable.spr_elements_86,
        R.drawable.spr_elements_87,
    };
    final int[] image_names = {
        R.drawable.spr_name_0,
        R.drawable.spr_name_1,
        [...]
        R.drawable.spr_name_86,
        R.drawable.spr_name_87,
    };

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.practice);

            final ImageView element = (ImageView) findViewById(R.id.element);
            final ImageView name = (ImageView) findViewById(R.id.name);

            Button nextButton = (Button) findViewById(R.id.buttonNext);
            nextButton.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                            i++;

                            element.setImageResource(image_elements[i]);
                            name.setImageResource(image_names[i]);

                            i %= image_elements.length;
                    }
            });
    }
    public void backButton(View view) {
            Intent z = new Intent(this, MainMenuActivity.class);
            startActivity(z);
    }
}

最佳答案

您需要重新排列您的代码:

                        i++;

                        element.setImageResource(image_elements[i]);
                        name.setImageResource(image_names[i]);

                        i %= image_elements.length;

对此:

                        i++;
                        i %= image_elements.length;

                        element.setImageResource(image_elements[i]);
                        name.setImageResource(image_names[i]);

否则会发生的情况是,索引会递增到超出数组边界,并且随后使用模运算符进行更正。在使用索引之前,您需要进行更正。

i %= image_elements.length 在这种特殊情况下,本质上与

相同
if( i == image_elements.length ) {
    i = 0;
}

数组索引从 0length-1

您可以通过按名称查找资源来完全摆脱数组,如下所示:

final static int MAX_ELEMENTS = 88; // this includes 0..87
private int index = 0;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.practice);

        final ImageView element = (ImageView) findViewById(R.id.element);
        final ImageView name = (ImageView) findViewById(R.id.name);
        final Resources res = this.getResources();
        final String pkgName = this.getPackageName();

        Button nextButton = (Button) findViewById(R.id.buttonNext);
        nextButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                        final int imgId = res.getIdentifier( "spr_elements_" + index, "drawable", pkgName );
                        final int nameId = res.getIdentifier( "spr_name_" + index, "drawable", pkgName );
                        element.setImageResource( imgId );
                        name.setImageResource( nameId );

                        index = (index+1) % MAX_ELEMENTS;
                }
        });
}

关于android - 应用程序在数组末尾崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34498334/

相关文章:

android - 如何让 Android View 占用 "remaining"空间?

android - 仅限 VOLTE 运营商的 TWITTER DIGITS 上的 OTP 问题

arrays - GO中嵌套的JSON数组生成

perl - 在 perl 中散列的数组

python - 使用内插新值将 python numpy 数组的长度加倍

javascript - 数字数组中的任何一点是否有高程

android - 从 Activity 中启动和停止 DayDream 服务的正确方法

android - 如何使用 ActionBarSherlock 更改 Actions 的触摸影响颜色?

arrays - 声明数组时指定的大小超过所需的大小是一种不好的做法吗?

android - 如何在页面加载时从 TextInputLayout 中移除焦点?