我的 Android 应用程序有一个非常奇怪的问题。每次我将字符串数组添加到我的 strings.xml(或 res/values/ 中的任何其他文件)时,我的程序都会在启动时崩溃。我绝对肯定地知道,这就是导致它崩溃的原因(因为每当我删除它时,它都可以正常工作)。无论如何,这是导致崩溃的 XML 代码:
<string-array name="main_list">
<item>Collections</item>
<item>Requests</item>
<item>Forums</item>
</string-array>
它的格式有什么问题吗?它位于“资源”标签和所有内容中。这是完整的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Activity Names -->
<string name="app_name">MyFavs</string>
<!-- Login Vars -->
<string name="username_login_field">Username</string>
<string name="password_login_field">Password</string>
<string name="login_btn">Login!</string>
<string name="remember_login_tag">Save Login Info</string>
<string name="no_username_password">You must supply a username and password</string>
<string name="sign_in_cancelled">Sign-in cancelled</string>
<string name="sign_in_progress">Signing in...</string>
<string name="invalid_username_password_alert_title">Error</string>
<string name="invalid_username_password_alert_btn">Ok</string>
<string name="menu_forgotten_password">Forgot Password?</string>
<!-- ForgotPasswd Vars -->
<string name="forgotten_pass_field">Email</string>
<string name="forgotten_pass_btn">Recover Account</string>
<string name="forgot_passwd_progress">Recovering account...</string>
<string name="invalid_forgot_passwd_title">Recover Account</string>
<string name="invalid_forgot_passwd_btn">Ok</string>
<string name="no_email">You must supply a valid email</string>
<string name="recover_cancelled">Recover cancelled</string>
<string name="menu_home">Home</string>
<string-array name="main_list">
<item>Collections</item>
<item>Requests</item>
<item>Forums</item>
</string-array>
</resources>
同样,删除底部的“字符串数组”部分会使程序工作,但添加它会导致崩溃。
这是 logcat 崩溃日志(虽然它没有多大帮助):
W/dalvikvm( 849): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime( 849): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 849): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.myfavs.droid/org.myfavs.droid.login}: java.lang.NullPointerException
E/AndroidRuntime( 849): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
E/AndroidRuntime( 849): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
E/AndroidRuntime( 849): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
E/AndroidRuntime( 849): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
E/AndroidRuntime( 849): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 849): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 849): at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime( 849): at java.lang.reflect.Method.invokeNative(NativeMethod)
E/AndroidRuntime( 849): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 849): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime( 849): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime( 849): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 849): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 849): at org.myfavs.droid.login.onCreate(login.java:32)
E/AndroidRuntime( 849): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime( 849): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
E/AndroidRuntime( 849): ... 11 more
I/Process ( 51): Sending signal. PID: 849 SIG: 3
如果有人有任何想法,请分享。我已经为此工作了很长时间,我确信这是一个愚蠢的错误,但我只需要另一双眼睛。我愿意尝试任何可能的解决方案。
编辑:
我删除了对字符串数组资源的所有引用,并且简单地包含该资源会导致崩溃。我没有在任何地方引用它,所以它不是导致问题的原因。
根据要求,这是我用于“登录”的 onCreate,虽然我很长时间没有接触过该代码并且它一直有效:
public void onCreate(Bundle savedInstanceState)
{
Log.d("Login","onCreate called");
super.onCreate(savedInstanceState);
Interactor.create(this);
setContentView(R.layout.login);
((EditText)findViewById(R.id.username)).setText(Interactor.getDB().getSetting("username"));
EditText pwd = (EditText)findViewById(R.id.password);
pwd.setText(Interactor.getDB().getSetting("password"));
if (Interactor.getDB().getSetting("save_login").equals("yes"))
((CheckBox)findViewById(R.id.remember_login)).setChecked(true);
// Treat "Send" soft-button on keyboard as a button click
pwd.setOnEditorActionListener(new android.widget.TextView.OnEditorActionListener()
{
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
{
if (actionId == EditorInfo.IME_ACTION_SEND)
((Button)findViewById(R.id.login_btn)).performClick();
return true;
}
});
}
只需将资源包含在 res/values 中,即使没有引用它,也会引发异常。这就是为什么它对我来说如此奇怪......
编辑编辑:
Jon Skeet 可能正在做某事。在包含字符串数组资源并注释掉登录的 onCreate 的第 32 行(正如我在上面的注释中所说的那样)时,应用程序再次运行。那么添加一个字符串数组会以某种方式打破那条线吗?为什么添加字符串数组资源会破坏它的任何帮助,但它在不添加资源的情况下可以 100% 工作?