NullPointerException в onResume при изменении кнопок, почему? - PullRequest
3 голосов
/ 27 января 2012

Я получаю исключение NullPointerException, созданное рядом моих пользователей, и я не могу определить, в чем проблема, оно отображается в этой строке:

((Button)findViewById(R.id.speakEnglishButton)).setText("");

Я не вижу, что не так, кнопка с этим идентификатором существует, она отлично компилируется, отлично работает на моем эмуляторе и на двух устройствах, однако я получаю около 100 сообщений об ошибках в консоли разработчика пользователи на этой версии.

Присмотревшись к onResume:

@Override
protected void onResume()
{
    super.onResume();

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    boolean isButtonLabelsEnabled = sp.getBoolean("isButtonLabelsEnabled", false);
    if (!isButtonLabelsEnabled)
    {
        ((Button)findViewById(R.id.speakEnglishButton)).setText("");
        ((Button)findViewById(R.id.speakFrenchButton)).setText("");
        ((Button)findViewById(R.id.speakSpanishButton)).setText("");
        ((Button)findViewById(R.id.speakGermanButton)).setText("");
        ((Button)findViewById(R.id.speakItalianButton)).setText("");
    }
    else
    {
        ((Button)findViewById(R.id.speakEnglishButton)).setText(getString(R.string.btnLblEnglish));
        ((Button)findViewById(R.id.speakFrenchButton)).setText(getString(R.string.btnLblFrench));
        ((Button)findViewById(R.id.speakSpanishButton)).setText(getString(R.string.btnLblSpanish));
        ((Button)findViewById(R.id.speakGermanButton)).setText(getString(R.string.btnLblGerman));
        ((Button)findViewById(R.id.speakItalianButton)).setText(getString(R.string.btnLblItalian));
    }
}

По сути, все, что я делаю, это проверяю сохраненное предпочтение Boolean, и в зависимости от его значения я либо устанавливаю метки на кнопках, либо устанавливаю их в пустые.

Может кто-нибудь посоветовать, пожалуйста?

Спасибо

Ответы [ 4 ]

7 голосов
/ 27 января 2012

Я думаю, дело в том, что когда пользователь возобновляет действие, макет не устанавливается, и, таким образом, findViewById() не имеет «якоря» для поиска и, следовательно, возвращает ноль.

Вы можете просто переместить вызов на setContentView() с onCreate на onResume (учитывая, что вы не ссылаетесь на представления в onCreate. Для обычного использования это не имеет значения, как в жизненном цикле Android,onResume вызывается непосредственно после onCreate и до того, как пользователь сможет взаимодействовать с действием.

На самом деле в некоторых приложениях есть ошибка, когда вы посещаете действие, затем запускаете другое, возможно, выходите из приложения.для другой вернитесь, а затем вернитесь (с помощью кнопки «назад») к первому действию. Здесь внезапно вы увидите черный экран. Это потому, что система «поменяла» первое действие и при возврате только onResumeвызывается, но не onCreate, поэтому нет возможности снова загрузить макет туда.

3 голосов
/ 27 января 2012

Делать все это ((Кнопка) findViewById (R.id.speakEnglishButton)). SetText (""); .... в onCreate ()

Добавить

private Button mSpeakEngButton;
.....

Как переменные класса, инициализируйте их в onCreate ()

public void onCreate() {

   ....
   mSpeakEngButton = ((Button)findViewById(R.id.speakEnglishButton));
}

Позже в коде вы можете изменить их значения как mSpeakEngButton.setWhwhat ()

2 голосов
/ 27 января 2012

Скорее всего, это вызвано, когда

((Button)findViewById(R.id.speakEnglishButton));

возвращает ноль. Это происходит, если такой ресурс не может быть найден. Спонтанно мне в голову приходит одна причина: у вас нет ресурсов по умолчанию в вашем макете. Это означает, что вы должны иметь хотя бы один макет «по умолчанию», который применяется для каждого языка / ориентации / ..., который следует поместить в папку «макет». Просто «макет».

0 голосов
/ 11 ноября 2013

Если вы сохраните setContentView () в onResume () вместо onCreate (), это выдаст исключение завышения, я пробовал это.

...