按钮点击后Android应用程序停止

时间:2014-04-06 14:46:56

标签: android button if-statement logging

我正在制作这个应用程序,当我按下某些按钮时它就会停止

public class Menu3 extends TheMenu{

    Button Buttons[] = new Button[21];
    Intent open = new Intent("com.frosti.lidraedi.OPEN");
    int clicked;
    boolean found;
    int PO1;
    int GoOn;
    int s,e;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActionBar actionBar = getActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);

    Bundle b = getIntent().getExtras();
    PO1 = b.getInt("PO", 0);

    switch (PO1) {
    case 21:
                    //when i press these buttons everything works well
        setContentView(R.layout.menu21);
        s=0;
        e=11;
        break;
    case 22:
                    //the layout loads without error
                    //but when i press the buttons int the layout it just stops
        setContentView(R.layout.menu22);
        s=12;
        e=15;
        break;
    case 23:
        setContentView(R.layout.menu23);
        s=16;
        e=20;
        break;
    case 24:
        setContentView(R.layout.menu24);
        break;
    case 25:
        setContentView(R.layout.menu25);
        break;

    default:
        break;
    }

    init();
}

private void init() {
    for(int c=s; c <= e; c++){
        Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/SourceSansPro-Semibold.otf");
        int d = c+1;
        int viewId = getResources().getIdentifier("b"+Integer.toString(d), "id", getPackageName());
        if(viewId!=0){
            Buttons[c] =((Button)findViewById(viewId));
            Buttons[c].setTypeface(tf);
            Log.d("Buttons", Integer.toString(c)+" : "+Integer.toString(d));
        }else{
            Log.d("Buttons", "0");
        }
    }
}

public void ButtonOnClick(View v){
    Log.d("ButtonOnClick", "I was clicked");
    found=false;
    int c= 0;
    for(Button b:Buttons){
        Log.d("for loop", "I got run");
        if(b.getId() == v.getId()){
            Log.d("if block", "I got found");
            GoOn=c;
            Log.d("M3:true:C", Integer.toString(c)+ " : "+Integer.toString(v.getId()));
            found=true;
            break;
        }
        Log.d("C var", "I will get incremented");
        c++;  //hehehe
        Log.d("C var", "I got incremented");
    }
    Log.i("ButtonOnClick",Integer.toString(c));
    if(found) {
        Log.i("M3:clicked:GoOn",Integer.toString(GoOn));
        Bundle b1 = new Bundle();

        b1.putInt("GoOn",GoOn);

        open.putExtras(b1);
        Log.d("Activity", "I will get opened");
        startActivity(open);
        overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
    }else if(clicked != v.getId()){
        clicked = v.getId();
        Toast.makeText(getApplicationContext(),"Skjárinn fannst því miður ekki",Toast.LENGTH_SHORT).show();
    }
}

好的,所以我打开应用程序按菜单22(执行开关块中的案例22)按下某个按钮然后停止 这些是我得到的错误: The errors i get.

如果你将图像与你看到的代码进行比较,它会执行“Log.d(”for loop“,”我跑了“);”但后来吓坏了,所以错误应该在这行“if(b.getId()== v.getId()){”但是我不知道为什么会这样?
这是xml布局代码,以防它有用。

The button layout code

如果你能帮助我,我真的很感激

2 个答案:

答案 0 :(得分:3)

尝试在初始化按钮后立即运行以下循环,以确保您拥有的内容:

for(Button b : Buttons){
    Log.d("Have button with ID " + b.getId());

然后在onClick()的开头运行相同的循环。这至少会告诉你你的按钮结构是否合理。如果对哪个项目导致NPE有疑问,则有助于单独记录它们。通常情况下,这是一个非显而易见的生命周期错误,特别是片段。

答案 1 :(得分:2)

使用以下命令创建一个Button数组:

Button Buttons[] = new Button[21];

但您在se之间有自定义项(您从switch语句中获取值)。

由于您的数组的所有索引中没有按钮,因此NPE上的b.getId()获得了ArrayList,因为某些索引上没有任何按钮。

所以你可以通过两种方式解决问题。

1-因为您不知道阵列的大小,您可以使用init

2-您需要使用

Buttons[] = new Button[e - s]; // or e-s+1 test both 中初始化数组
ArrayList

我建议使用 ArrayList<Button> list = new ArrayList<Button>(); ,因此您的代码必须如下:

for ( int i = 0 ; i < list.size() ; i++)
      list.get(i).getId();

然后,您可以使用以下代码获取代码中的所有ID:

{{1}}