Что может быть причиной этого NPE в onCreate?

Я получаю NPE в onCreate следующего файла (MySubActivity):

public class MySubActivity extends MySuperActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myTextView.setText(getResources().getString(R.string.myString));
    }
}

МояСуперактивность:

public class MySuperActivity extends Activity {
    protected TextView myTextView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_layout);

        myTextView = (TextView)findViewById(R.id.myTextViewid);
    }
}

Странно то, что я никогда не видел этого сбоя при тестировании приложения. Страница работает нормально, когда я тестирую ее. Однако я получил отчет о сбое от Google, уведомляющий меня о сбое. Я не могу его воспроизвести и понятия не имею, по какому сценарию мог произойти этот сбой. Учитывая, как это работает для меня, идентификаторы ресурсов, имена строк и т. д. должны быть правильными.

Единственное, что пришло мне в голову, это то, что, возможно, у пользователя был установлен другой язык в телефоне, поэтому он не мог должным образом извлекать ресурсы. Однако для всех из них есть ресурсы по умолчанию, и я проверил изменение языка своего эмулятора, и он не завис. Любые идеи?


person Adam Johns    schedule 07.11.2013    source источник
comment
может быть, вместо этого использовать myTextView.setText(R.string.myString);?   -  person petey    schedule 08.11.2013
comment
@petey R.string.myString - это идентификатор строки, если я прав   -  person what is sleep    schedule 08.11.2013
comment
@petey спасибо за совет. Я попробую это. Знаете ли вы какой-либо сценарий, который может привести к сбою myTextView.setText(getResources().getString(R.string.myString)); и работе myTextView.setText(R.string.myString);?   -  person Adam Johns    schedule 08.11.2013
comment
Не совсем. Знаете ли вы устройство и версию ОС/уровень API? это может помочь понять, что происходит.   -  person petey    schedule 08.11.2013
comment
@petey Я знаю, что это было устройство SCH-R760X, похожее на Samsung Galaxy S2 под управлением 2.3. Если телефон не рутирован.   -  person Adam Johns    schedule 08.11.2013


Ответы (1)


Установите свой вид другим методом, например:

public class MySubActivity extends MySuperActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    private void setView(){
        myTextView.setText(getResources().getString(R.string.myString));
    }
}

Изменить: не вызывать setView() в MySuperActivity

public class MySuperActivity extends Activity {
    protected TextView myTextView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_layout);

        myTextView = (TextView)findViewById(R.id.myTextViewid);
        // Or, you can do this in a method called getView() if you like
    }
}
person chinglun    schedule 07.11.2013
comment
Это неправда, потому что ОП позвонил super.onCreate(). Вы даже получите ошибку компиляции, если не вызовете super.onCreate(). - person Lawrence Choy; 08.11.2013
comment
@LawrenceChoy Я тебя не понимаю. Я вызвал super.onCreate() в обоих действиях. Не могли бы вы дать дополнительные пояснения? заранее спасибо - person chinglun; 08.11.2013
comment
Я имел в виду, что ваше утверждение The onCreate() in mySubActivity overrides the onCreate() in its parent class, so findViewById() will not be called. неверно. Поскольку OP вызвал super.onCreate() в MySubActivity, будет вызван onCreate() из MySuperActivity, поэтому также будет вызван findViewById(). - person Lawrence Choy; 08.11.2013
comment
Лоуренс прав. findViewById() вызывается. Как я уже сказал, этот сбой не происходит ни в одном тесте, который я запускал. - person Adam Johns; 08.11.2013
comment
Я проверил и обнаружил, что вы правы, спасибо, что указали на это! - person chinglun; 08.11.2013