我正在制作这个应用程序,当我按下某些按钮时它就会停止
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)按下某个按钮然后停止 这些是我得到的错误:
如果你将图像与你看到的代码进行比较,它会执行“Log.d(”for loop“,”我跑了“);”但后来吓坏了,所以错误应该在这行“if(b.getId()== v.getId()){”但是我不知道为什么会这样?
这是xml布局代码,以防它有用。
如果你能帮助我,我真的很感激
答案 0 :(得分:3)
尝试在初始化按钮后立即运行以下循环,以确保您拥有的内容:
for(Button b : Buttons){
Log.d("Have button with ID " + b.getId());
然后在onClick()的开头运行相同的循环。这至少会告诉你你的按钮结构是否合理。如果对哪个项目导致NPE有疑问,则有助于单独记录它们。通常情况下,这是一个非显而易见的生命周期错误,特别是片段。
答案 1 :(得分:2)
使用以下命令创建一个Button数组:
Button Buttons[] = new Button[21];
但您在s
到e
之间有自定义项(您从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}}