Ссылка на нулевой объект хронометра - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть хронометр во втором действии. Я хотел получить к нему доступ из основной активности, поэтому я включил хронометр во вторую активность как общедоступную статическую и «secondActivity.chronometer» в основную активность, но при запуске приложения отображается chronometer.setbase(long) on a null object reference Я проверил правильность идентификатора xml. Кто-нибудь знает, как решить проблему?

Ответы [ 3 ]

0 голосов
/ 05 ноября 2019

При запуске приложения второе действие не инициализируется. Хронометр, как подкласс TextView, также не может быть инициализирован. Это не очень хорошая идея, чтобы получить доступ или изменить представление в другой деятельности. Вы можете передавать данные и показывать по данным。

0 голосов
/ 05 ноября 2019

Как я уже упоминал в своем комментарии, сохранение статической ссылки на View - очень плохая идея. Во-первых, как выяснили другие ответы, нет никакой гарантии, что ваш View будет инициализирован при вызове, поскольку Activity, частью которого он является, еще не инициализирован. Тем не менее, это также является основной причиной утечек памяти (см. этот ответ для более подробной информации ).

Я бы порекомендовал вместо того, чтобы начать Chronometer, вместо этого запишитераз вы хотите запустить его (что, в случае Chronometer, можно получить, вызвав SystemClock#uptimeMillis), записав его в Intent и используя его для запуска второго Activity. Затем вы можете использовать это время в качестве базового времени для вашего Chronometer и, следовательно, создать впечатление, что оно работает все время. Т.е.

public class ActivityOne extends Activity {
    //...
    private void startChronometer() {
        final Intent i = new Intent(this, ActivityTwo.class);
        i.putExtra("time", SystemClock.uptimeMillis());
        startActivity(i);
    }
}
public class ActivityTwo extends Activity {

    private Chronometer chrono;  

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        //...
        chrono = findViewById(R.id.id_of_chronometer);
        chrono.setBase(getIntent().getLongExtra("time", SystemClock.uptimeMillis()));
        chrono.start();
    }

}
0 голосов
/ 05 ноября 2019

Вы не инициализировали хронометр. когда вы запускаете приложение, хронометр не имеет никакого значения, потому что он находится во втором действии.

...