【问题标题】:Two exact same startactivity() in a switch, only one works开关中有两个完全相同的 startactivity(),只有一个有效
【发布时间】:2019-01-12 01:21:28
【问题描述】:

我是编码新手。

所以我有一个开关,应用程序可以使用字符串 nextActivityExtra 选择下一个活动。 Intent.putExtra 是其他活动所必需的,并且没有活动在接收它们时遇到问题。所以基本上代码有效,但仅限于第一种情况。当应用回到这个“切换活动”时,它应该进入第二种情况,在这里它无法加载 MainActivity(它加载一个黑屏并突然回到“切换活动”)。

如果我为 MainActivity 或任何其他活动切换 ExplicaioActivity 它将正常工作,除非它是在第二种情况下。我真的无法理解这里发生了什么,我也尝试了使用 If 的相同代码,结果相似。

public class EntreActivities extends AppCompatActivity {

ImageView iconView;
int count;
String levelExtra;
Intent intent;
String nextActivityExtra;
String rutaLevelNumber;
boolean isTaskCompleted;
Class myClass;


public void Rotate(View view) {
    RotateAnimation rotateAnimation = new RotateAnimation(0, 30,
            RotateAnimation.RELATIVE_TO_SELF, 0.5f,
            RotateAnimation.RELATIVE_TO_SELF, 1f);
    rotateAnimation.setDuration(3000);
    rotateAnimation.setRepeatMode(Animation.REVERSE);
    rotateAnimation.setRepeatCount(Animation.INFINITE);
    rotateAnimation.setFillAfter(true);
    rotateAnimation.setStartOffset(1000);
    iconView.setAnimation(rotateAnimation);

}

public void startAct() {
    if (getIntent().getBooleanExtra("inTraining", false)) {
        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
        Toast.makeText(this, "TTTTtrain", Toast.LENGTH_SHORT).show();


    } else {


        switch (nextActivityExtra) {
            case "ExplicaioActivity":
                myClass = ExplicaioActivity.class;
                Toast.makeText(EntreActivities.this, "here", Toast.LENGTH_SHORT).show();
                intent = new Intent(getApplicationContext(), ExplicaioActivity.class);
                intent.putExtra("Level", rutaLevelNumber);
                intent.putExtra("inTraining", false);
                startActivity(intent);
                overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_up);

                break;
            case "MainActivity":
                myClass = MainActivity.class;
                Toast.makeText(EntreActivities.this, "here", Toast.LENGTH_SHORT).show();

                intent.putExtra("Level", rutaLevelNumber);
                intent.putExtra("inTraining", false);
                intent = new Intent(getApplicationContext(), MainActivity.class);

                startActivity(intent);
                overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_up);
                break;
        }


    }
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_entre_activities);
    iconView = findViewById(R.id.iconView);
    iconView.setRotation(-15);
    Intent intent = getIntent();
    levelExtra = intent.getStringExtra("Level");
    nextActivityExtra = intent.getStringExtra("NextActivity");
    rutaLevelNumber = intent.getStringExtra("Level");


    Rotate(iconView);


    startAct();


}
}

这是我可以从 AS 获取的错误日志:

2019-01-12 01:08:12.383 4282-4282/com.example.root.exercicis E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.root.exercicis, PID: 4282
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.root.exercicis/com.example.root.exercicis.EntreActivities}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.hashCode()' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.hashCode()' on a null object reference
    at com.example.root.exercicis.EntreActivities.startAct(EntreActivities.java:53)
    at com.example.root.exercicis.EntreActivities.onCreate(EntreActivities.java:100)
    at android.app.Activity.performCreate(Activity.java:6662)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 

【问题讨论】:

  • 分享EntreActivities 活动的实现
  • EntreActivities 的第 53 行是哪一行?
  • “回到……”是什么意思?它是如何“回来”的?
  • switch 语句之前添加日志并输出nextActivityExtra 的值

标签: java android android-intent android-activity switch-statement


【解决方案1】:

您试图在初始化 Intent 之前添加额外的 MainActivity 案例。

在添加额外内容之前初始化 Intent

intent = new Intent(getApplicationContext(), MainActivity.class);
intent.putExtra("Level", rutaLevelNumber);
intent.putExtra("inTraining", false);

【讨论】:

    【解决方案2】:

    这是因为您正在创建一个没有额外字符串“NextActivity”的新 Intent。

    让我带你了解正在发生的事情:

    1. Activity 已启动并运行 onCreate()。
    2. Intent intent = getIntent() 已运行,并且 Intent 现在包含从 Intent 发送到此 Activity 的所有数据。
    3. nextActivityExtra = intent.getStringExtra("NextActivity") 已运行,现在 nextActivityExtra 现在与 "ExplicaioActivity""MainActivity" 一起存储。
    4. startAct() 正在运行。
    5. Switch 语句运行正常,因为 nextActivityExtra 具有正确的值。让我们假设它是 ExplicaioActivity。
    6. intent = new Intent(getApplicationContext(), ExplicaioActivity.class);运行,它创建了一个NEW意图。
    7. 你使用了intent.putExtra("Level")intent.putExtra("inTraining"),但是忘记放`intent.putExtra("NextActivity");
    8. 新活动已启动,onCreate() 正在运行。
    9. Intent intent = getIntent() 正在运行,并且意图现在包含发送到此活动的意图的所有数据。 但请记住,上一个 Activity 中的这个 Intent 缺少额外的“NextActivity”
    10. nextActivityExtra = intent.getStringExtra("NextActivity") 已运行,但由于没有额外的,所以 null 存储在此变量中。
    11. 发生了switch case,但是switch不支持null所以黑屏其实是Activity的crash。

    因此,要解决此问题,您只需在 case "ExplicaioActivity" 中添加 intent.putExtra("NextActivity", NEW_VALUE);,其中 NEW_VALUE 是您要作为额外值添加的新值。 `

    但是,对于case“MainActivity”,除了做我之前说的,还需要重新排列一行代码。

    切换这个:

    intent.putExtra("Level", rutaLevelNumber);
    intent.putExtra("inTraining", false);
    intent = new Intent(getApplicationContext(), MainActivity.class);
    

    到这里:

    intent = new Intent(getApplicationContext(), MainActivity.class);
    intent.putExtra("Level", rutaLevelNumber);
    intent.putExtra("inTraining", false);
    

    【讨论】:

    • 非常感谢您提供的超级详细的回答。我按照您的建议进行了更改,但问题仍然存在。即使在第二种情况下,我将 MainActivity 更改为一些根本不使用意图的活动也不起作用。变量 nextActivityExtra 始终为 null,与 rutalevelnumber 相同。
    • @CroquetaFregidaAmbPastanaga 如果您已经进行了我提到的三个更改,但您仍然遇到崩溃,那么我担心崩溃是由于不同的问题造成的。这是课程的完整来源吗?从您的错误日志中,该错误是由于在空对象上使用 hashCode() 造成的。但是,您的源代码似乎没有反映错误日志: startAct() 被列为第 53 行,而 onCreate() 被列为第 100 行,但您的源代码太短。如果您在源代码中保留了某些代码,则崩溃可能发生在代码的保留部分中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多