Java Android Studio中的意图错误(训练应用程序)
对于我的学校项目,我目前正在做一个简单的锻炼应用程序。但我被困在倒计时上,因为应用程序一直在崩溃。首先,有一些受欢迎的屏幕;然后,你开始做你自己的锻炼(选择锻炼、休息和轮数)。它工作得很好,甚至可以使用Intent将所有这些变量放到下一个类中。下面是按钮下一步代码:Java Android Studio中的意图错误(训练应用程序),java,android,xml,android-studio,Java,Android,Xml,Android Studio,对于我的学校项目,我目前正在做一个简单的锻炼应用程序。但我被困在倒计时上,因为应用程序一直在崩溃。首先,有一些受欢迎的屏幕;然后,你开始做你自己的锻炼(选择锻炼、休息和轮数)。它工作得很好,甚至可以使用Intent将所有这些变量放到下一个类中。下面是按钮下一步代码: next.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent my
next.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent myIntent = new Intent(CustomWorkout.this, GetReady.class);
myIntent.putExtra("all_exercises", Exercises); //arraylist of exercises
myIntent.putExtra("total_rounds", total_rounds); //number of rounds
myIntent.putExtra("total_rest", total_rest); //rest time
startActivity(myIntent);
}
});
正如您在上面所看到的,然后我调用GetReady()类,这是一个简单的5秒倒计时,用于为第一个练习做好准备准备就绪如下所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.getready);
getReady();
}
public void getReady(){
timer = (TextView) findViewById(R.id.timer);
cTimer= new CountDownTimer(5000, 1000) {
public void onTick(long millisUntilFinished) {
timer.setText("" + millisUntilFinished / 1000);
}
public void onFinish() {
startActivity(new Intent(GetReady.this, Exercises.class));
}
}.start();
}
现在是错误(以及应用程序崩溃)。在完成倒计时后,我调用Exercise()类(这是一个屏幕,显示当前练习的名称和按钮done->单击后再次启动倒计时计时器)。代码:
您必须在GetReady中传递数据,以便在练习中访问它们。为了编写更少的代码,我将它们放入一个
包中
,然后简单地传输这个包
:
在OnClickListener
中:
next.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent myIntent = new Intent(CustomWorkout.this, GetReady.class);
Bundle b = new Bundle();
b.putSerializable("all_exercises", Exercises); //arraylist of exercises
b.putInt("total_rounds", total_rounds); //number of rounds
b.putInt("total_rest", total_rest); //rest time
myIntent.putExtra("myData", b);
startActivity(myIntent);
}
});
在GetReady.java中:
在exercises.java中:
Intent i=getIntent();
Bundle b=i.getBundleExtra(“myDataFromGetReady”);
//现在从包中获取数据:
所有_练习=(ArrayList)b.getSerializable(“所有_练习”);
轮数=b.getInt(“总轮数”,-1);
练习名称=(TextView)findViewById(R.id.exercise\u name);
练习名.setText(所有练习名.get(0));
最终按钮完成=(按钮)findViewById(R.id.done);
// ... 等等
如果它崩溃了,请分享Logcat中的堆栈跟踪对不起,我是应用程序编程新手。编辑的原始帖子。看起来你得到了一个NullPointerException,因为你忘了在GetReady中传递来自Intent的数据,所以练习中的getIntent()没有多余的内容。所以我需要在GetReady类中声明Intent,获取变量并将它们提交给练习(在转发到倒计时类的练习中也要这样做)?我认为Intent在phpBasic中类似于会话变量,基本上是的,对我来说,它更像是Android系统内通信的信封。它可能包含非常不同的信息片段,这取决于您想用它做什么
FATAL EXCEPTION: main
Process: com.msimonic.worldofworkout, PID: 8968
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.msimonic.worldofworkout/com.msimonic.worldofworkout.Exercises}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
at com.msimonic.worldofworkout.Exercises.onCreate(Exercises.java:39)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
next.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent myIntent = new Intent(CustomWorkout.this, GetReady.class);
Bundle b = new Bundle();
b.putSerializable("all_exercises", Exercises); //arraylist of exercises
b.putInt("total_rounds", total_rounds); //number of rounds
b.putInt("total_rest", total_rest); //rest time
myIntent.putExtra("myData", b);
startActivity(myIntent);
}
});
public void getReady(){
timer = (TextView) findViewById(R.id.timer);
cTimer= new CountDownTimer(5000, 1000) {
public void onTick(long millisUntilFinished) {
timer.setText("" + millisUntilFinished / 1000);
}
public void onFinish() {
Bundle b = GetReady.this.getIntent().getBundleExtra("myData");
Intent myNextIntent = new Intent(GetReady.this, Exercises.class);
myNextIntent.putExtra("myDataFromGetReady", b);
startActivity(myNextIntent);
}
}.start();
}
Intent i = getIntent();
Bundle b = i.getBundleExtra("myDataFromGetReady");
// now get the data from the Bundle:
all_exercises = (ArrayList<String>) b.getSerializable("all_exercises");
rounds= b.getInt("total_rounds", -1);
exercise_name = (TextView) findViewById(R.id.exercise_name);
exercise_name.setText(all_exercises.get(0));
final Button done=(Button) findViewById(R.id.done);
// ... and so on ...