0

我的 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% 工作?

4

4 回答 4

1

您的字符串数组肯定没有问题。问题出在您访问字符串的代码中

试试这样

Resources res = getResources();
String[] list = res.getStringArray(R.array.main_list);
于 2011-08-10T06:34:36.100 回答
1

好吧,这是一篇 5 年前的帖子,但我遇到了完全相同的问题(Android Studio 2.1.3)。对我来说,第一个字符串数组运行良好,但是每当我尝试在同一个文件 (strings.xml) 中添加第二个字符串时,我的应用程序就会崩溃。所以我进行了测试,我注意到如果你对 String 资源进行更改,更改会立即出现在设计中,但如果你运行应用程序,它就会保持不变。我认为这与缓存有关,所以我只是关闭并打开 ANDDROID STUDIO,令人惊讶的是,它确实有效,至少对我而言。如果您想要比手动关闭和打开更快的东西,这是最好的解决方案:在您的项目中单击文件->使缓存无效/重新启动->只需重新启动即可完成。

钯。当我发现这个问题时,我正在使用 Spinners,这是我的一些代码:

“字符串.xml”:

<resources>
   <string name="app_name">Mascota Mia</string>
   <string name="registrar_mascota">Registrar Mascota</string>
   <string name="agendar_consulta">Agendar Consulta</string>
   <string-array name="raza_array">
      <item>Perro</item>
      <item>Gato</item>
      <item>Cocodrilo</item>
      <item>Armadillo</item>
      <item>Ganso</item>
   </string-array>
   <string-array name="pasatiempo_array">
      <item>Correr</item>
      <item>Nadar</item>
      <item>Dormir</item>
      <item>Morder el hueso</item>
      <item>Perseguir al gato</item>
   </string-array>
</resources>

“RegistrarMascota.java”(只有 onCreate 方法,这是我在 Spinners 中使用字符串数组的地方):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_registrar_mascota);


   //Spinner para la raza
    Spinner spinneRaza = (Spinner) findViewById(R.id.raza);
    ArrayAdapter<CharSequence>adapteRaz = ArrayAdapter.createFromResource(this,
            R.array.raza_array, android.R.layout.simple_spinner_item);
    adapteRaz.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinneRaza.setAdapter(adapteRaz);
    spinneRaza.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

            Toast.makeText(getBaseContext(), parent.getItemAtPosition(pos)+" seleccionado", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }

    });


    //Spinner para los pasatiempos
    Spinner spinnerPas = (Spinner) findViewById(R.id.pasatiempo);
    ArrayAdapter<CharSequence> adapterPas = ArrayAdapter.createFromResource(this,
            R.array.pasatiempo_array, android.R.layout.simple_spinner_item);
    adapterPas.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerPas.setAdapter(adapterPas);
    spinnerPas.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

            Toast.makeText(getBaseContext(), parent.getItemAtPosition(pos)+" seleccionado", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }

    });

}
于 2016-09-23T06:25:59.543 回答
0

我有同样的问题,这是一个糟糕的备份。只需清除您的应用程序的数据(卸载不起作用)

于 2020-10-04T23:47:52.723 回答
0

同样的问题,2022 Android 11。

我试图制作一个快捷方式.xml 文件并需要一个字符串数组。快捷方式.xml 在 res/values/xml 下。

如果我在 res/values 下的 strings.xml 中放置 <string-array> 引用或在 res/values 中创建 arrays.xml 并将其放在那里,则应用程序崩溃。

我将 arrays.xml 放在 res/values/xml 下,它可以工作。

于 2022-01-24T05:26:56.310 回答