Android应用程序在点击按钮时停止
我正在制作这个应用程序,当我按下一些按钮时,它就停止了Android应用程序在点击按钮时停止,android,button,if-statement,logging,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 v
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();
}
}
public类菜单3扩展了菜单{
按钮按钮[]=新按钮[21];
意向开放=新意向(“com.frosti.lidraedi.open”);
点击int;
布尔发现;
INTPO1;
英光;
int s,e;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
ActionBar ActionBar=getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
Bundle b=getIntent().getExtras();
PO1=b.getInt(“PO”,0);
开关(PO1){
案例21:
//当我按下这些按钮时,一切正常
setContentView(R.layout.menu21);
s=0;
e=11;
打破
案例22:
//布局加载时不会出错
//但当我按下布局中的按钮时,它就停止了
setContentView(R.layout.menu22);
s=12;
e=15;
打破
案例23:
setContentView(R.layout.menu23);
s=16;
e=20;
打破
案例24:
setContentView(R.layout.menu24);
打破
案例25:
setContentView(R.layout.menu25);
打破
违约:
打破
}
init();
}
私有void init(){
对于(int c=s;c,创建一个按钮数组,其中包含:
Button Buttons[] = new Button[21];
但在s
到e
之间有一个自定义项(从switch语句中获取值)
由于在数组的所有索引中都没有按钮,所以在b.getId()
上会得到NPE
,因为在某些索引上没有任何按钮
所以你可以用两种方法解决你的问题
1-由于您不知道数组的大小,可以使用ArrayList
2-您需要在init
中使用
Buttons[] = new Button[e - s]; // or e-s+1 test both
我建议使用ArrayList
,因此您的代码必须如下所示:
ArrayList<Button> list = new ArrayList<Button>();
ArrayList list=new ArrayList();
然后,您可以使用以下工具获取代码中的所有id:
for ( int i = 0 ; i < list.size() ; i++)
list.get(i).getId();
for(int i=0;i
您可以创建一个按钮数组,其中包含:
Button Buttons[] = new Button[21];
但在s
到e
之间有一个自定义项(从switch语句中获取值)
由于在数组的所有索引中都没有按钮,所以在b.getId()
上会得到NPE
,因为在某些索引上没有任何按钮
所以你可以用两种方法解决你的问题
1-由于您不知道数组的大小,可以使用ArrayList
2-您需要在init
中使用
Buttons[] = new Button[e - s]; // or e-s+1 test both
我建议使用ArrayList
,因此您的代码必须如下所示:
ArrayList<Button> list = new ArrayList<Button>();
ArrayList list=new ArrayList();
然后,您可以使用以下工具获取代码中的所有id:
for ( int i = 0 ; i < list.size() ; i++)
list.get(i).getId();
for(int i=0;i
在初始化按钮后立即尝试运行以下循环,以确保您拥有:
for(Button b : Buttons){
Log.d("Have button with ID " + b.getId());
然后在onClick()的开头运行相同的循环。这至少可以告诉您按钮的结构是否合理。当您怀疑哪个项目导致NPE时,可以将其单独记录。通常情况下,这是一个不明显的终身错误,尤其是对于片段。尝试在初始化按钮后立即运行以下循环,以确保您拥有:
for(Button b : Buttons){
Log.d("Have button with ID " + b.getId());
然后在onClick()的开头运行相同的循环。这至少会告诉您按钮的结构是否正确。当怀疑哪个项目导致了NPE时,可以将它们分开记录。通常情况下,这是一个不明显的终身错误,尤其是对于片段。第84行是什么?
menu3?如果(b.getId())是if==v.getId()){
在代码中初始化按钮的地方?公共类Menu3扩展了菜单{
按钮[]=new Button[21];
第84行是什么?Menu3
?如果(b.getId()==v.getId()){在代码中初始化按钮的地方?公共类菜单3扩展了菜单{
按钮按钮[]=新按钮[21];