Сбой строкового массива Android - PullRequest
0 голосов
/ 10 августа 2011

У меня очень странная проблема с моим приложением для 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>

Опять же, удаление раздела "string-array" внизу приводит к тому, что программа работает, но добавление приводит к сбою.

Вот журнал аварий 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

Если у кого-то есть идеи, поделитесь ими. Я работал над этим довольно долго, и я уверен, что это глупая ошибка, но мне просто нужна другая пара глаз. Я был бы готов попробовать любое возможное решение.

EDIT:

Я удалил каждую ссылку на ресурс строкового массива, и простое включение ресурса вызывает сбой. Я нигде не упоминаю об этом, поэтому проблема не в этом.

В соответствии с просьбой, вот мой 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, даже не обращаясь к нему. Вот почему это так странно для меня ...

РЕДАКТИРОВАНИЕ РЕДАКТИРОВАНИЯ:

Джон Скит может быть чем-то занят. Включая ресурс строкового массива и комментируя строку 32 в onCreate логина (как я уже сказал, какая строка в комментариях выше), приложение снова работает. Итак, добавление строки-массива как-то разрывает эту строку? Любая помощь в том, почему добавление ресурса строкового массива сломало бы это, но это работает на 100% без добавления ресурса?

Ответы [ 2 ]

1 голос
/ 23 сентября 2016

Ну, это 5-летний пост, но у меня точно такая же проблема (Android Studio 2.1.3).Для меня первый строковый массив работал отлично, но всякий раз, когда я пытался добавить второй в тот же файл (strings.xml), мое приложение зависало.Поэтому я проводил тесты и заметил, что если вы вносите изменения в свои ресурсы String, изменения сразу появляются в дизайне, но если вы запускаете приложение, оно просто остается прежним.Я думал, что это связано с кешем, поэтому я просто ЗАКРЫВАЮ И ОТКРЫВАЮЩУЮ СТАНЦИЮ ANDDROID, и удивляюсь, ЭТО СДЕЛАНО, по крайней мере, для меня.Если вы хотите что-то быстрее, чем закрыть и открыть это вручную, вот лучшее решение: В вашем проекте нажмите Файл-> Недействительный Cache / Restart-> Просто перезапустите и все готово.

Pd,Я работал с Spinners, когда обнаружил эту проблему, вот мой код:

"strings.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,здесь я использую строковые массивы в своих спиннерах:

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) {

        }

    });

}
1 голос
/ 10 августа 2011

Конечно, нет проблем с вашим строковым массивом. Проблема в коде, к которому вы обращаетесь к строке

попробуй вот так

Resources res = getResources();
String[] list = res.getStringArray(R.array.main_list);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...