gpt4 book ai didi

java - 使用操作栏返回时应用程序意外停止

转载 作者:行者123 更新时间:2023-11-30 02:54:49 25 4
gpt4 key购买 nike

我一直在阅读与此相关的不同问题和答案,但我仍然没有得到任何线索。我真的很抱歉,因为我知道这个问题被重复了,但我真的需要帮助:(

每当我按下操作栏中的后退时,应用程序都会意外停止。

05-05 01:39:03.685: E/AndroidRuntime(10591): FATAL EXCEPTION: main
05-05 01:39:03.685: E/AndroidRuntime(10591): Process: com.FYP.undergraduate, PID: 10591
05-05 01:39:03.685: E/AndroidRuntime(10591): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.FYP.undergraduate/com.FYP.undergraduate.ChooseSubject}: java.lang.NullPointerException
05-05 01:39:03.685: E/AndroidRuntime(10591): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
05-05 01:39:03.685: E/AndroidRuntime(10591): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
05-05 01:39:03.685: E/AndroidRuntime(10591): at android.app.ActivityThread.access$900(ActivityThread.java:161)
05-05 01:39:03.685: E/AndroidRuntime(10591): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
05-05 01:39:03.685: E/AndroidRuntime(10591): at android.os.Handler.dispatchMessage(Handler.java:102)
05-05 01:39:03.685: E/AndroidRuntime(10591): at android.os.Looper.loop(Looper.java:157)
05-05 01:39:03.685: E/AndroidRuntime(10591): at android.app.ActivityThread.main(ActivityThread.java:5356)
05-05 01:39:03.685: E/AndroidRuntime(10591): at java.lang.reflect.Method.invokeNative(Native Method)
05-05 01:39:03.685: E/AndroidRuntime(10591): at java.lang.reflect.Method.invoke(Method.java:515)
05-05 01:39:03.685: E/AndroidRuntime(10591): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
05-05 01:39:03.685: E/AndroidRuntime(10591): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
05-05 01:39:03.685: E/AndroidRuntime(10591): at dalvik.system.NativeStart.main(Native Method)
05-05 01:39:03.685: E/AndroidRuntime(10591): Caused by: java.lang.NullPointerException
05-05 01:39:03.685: E/AndroidRuntime(10591): at com.FYP.undergraduate.ChooseSubject.onCreate(ChooseSubject.java:35)
05-05 01:39:03.685: E/AndroidRuntime(10591): at android.app.Activity.performCreate(Activity.java:5426)
05-05 01:39:03.685: E/AndroidRuntime(10591): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
05-05 01:39:03.685: E/AndroidRuntime(10591): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
05-05 01:39:03.685: E/AndroidRuntime(10591): ... 11 more
05-05 01:39:06.175: I/Process(10591): Sending signal. PID: 10591 SIG: 9
05-05 01:39:06.340: W/ApplicationPackageManager(11234): getCSCPackageItemText()

这是类 ChooseSubject.java 的部分编码。

package com.FYP.undergraduate;

import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.*;
import android.app.Activity;
import android.view.*;
import android.view.View.OnClickListener;
import android.widget.*;
import android.support.v4.app.NavUtils;
import android.annotation.TargetApi;
import android.content.Intent;

public class ChooseSubject extends Activity
{
String loginID;
ProgressBar spinner1;
int role;

protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_subject);
setupActionBar();
loginID = getIntent().getExtras().getString("LOGINID");
role = getIntent().getExtras().getInt("ROLE");
new MyGetSubjectClass().execute();
spinner1 = (ProgressBar)findViewById(R.id.progressBar1);
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void setupActionBar()
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
getActionBar().setDisplayHomeAsUpEnabled(true);
}
}

public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.choose_subject, menu);
return true;
}

public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}

最佳答案

重要的是,我建议你不要在 Android 中使用 navigateUpFromSameTask,因为有 a known bug on 4.1 and higher .在“up” Activity 的情况下,您可以简单地调用finish()方法来销毁当前 Activity 并自动返回到父 Activity :

case android.R.id.home:
this.finish(); // the "up" activity will be destroyed
return true;

我怀疑你在“up” Activity 中执行了另一个 Intent 以返回 ChooseSubject 然后该 Activity 没有来自这个新 Intent 的数据,因为通常你执行此操作以调用 ChooseSubject Activity :

Intent i = new Intent(PreviousActivity.this, ChooseSubject.class);
// pass the datas
i.putString("LOGINID", loginIdStringValue);
// then, call startActivity method
startActivity(i);

在您再次调用 startActivity 以(重新)启动 ChooseSubject 类的情况下,您没有传递任何数据。 onCreategetIntent 在 Activity 首次显示时被调用。当您启动了另一个 Activity 时,您可以使用 finish() 返回到前一个 Activity 而无需再次调用这些方法。

也许您应该存储发送的值以避免空异常。当您查看有关 Activity Lifecycle 的文档时,您可以看到 onCreate 只有在 Activity 不再可见并且另一个应用需要内存时才会被调用。然而,根据Documentation :

The system uses the Bundle instance state to save information about each View object in your activity layout (such as the text value entered into an EditText object). So, if your activity instance is destroyed and recreated, the state of the layout is restored to its previous state with no code required by you.

然后,您可以按如下方式存储值:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the datas
savedInstanceState.putString("SAVED_LOGINID", getIntent().getExtras().getString("LOGINID"));
savedInstanceState.putInt("SAVED_ROLE", getIntent().getExtras().getInt("ROLE"));

// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}

This method在将 Activity 置于此类后台状态之前调用。您可以在 onCreate 中检索这些值,它使用 Bundle 作为参数,例如:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_subject);

// Check the state of the activity bundle
if(savedInstanceState != null) { // the activity has already be created
loginID = savedInstanceState.getString("SAVED_LOGINID");
role = savedInstanceState.getInt("SAVED_ROLE");
} else { // the activity is displayed for the 1st time
loginID = getIntent().getExtras().getString("LOGINID");
role = getIntent().getExtras().getInt("ROLE");
}
//...
}

如果您需要其他 Activity 中的值,解决方案可能是使用 SharedPreference将其存储在设备上,另请参阅 Saving Persistent State部分。但是,您可以在 Storage Options 上看到一些其他功能。 .

它可能会解决您的问题,希望对您有所帮助。
如果您需要更多相关信息,请告诉我。

关于java - 使用操作栏返回时应用程序意外停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23459513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com