NullPointerException для this.getPreferences () - PullRequest
0 голосов
/ 19 марта 2019
class PlayerDetails : AppCompatActivity(), View.OnClickListener, TextWatcher {

    val sharedPref = this.getPreferences(Context.MODE_PRIVATE) // NPE
    var applicationID = sharedPref.getString("applicationID", null)

    private lateinit var binding: ActivityPlayerDetailsBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_player_details)
        ...
    }
...

Я пытаюсь создать ссылку на файл общих настроек по умолчанию для моей деятельности с именем this.getPreferences().

Результат дает мне NullPointerException - почему это так?Он не связан с пользовательским интерфейсом, поэтому его не нужно вызывать после setContentView().Почему в этот момент активность будет null

Ответы [ 4 ]

2 голосов
/ 19 марта 2019

Он не связан с пользовательским интерфейсом, поэтому его не нужно вызывать после setContentView ()

Вправо, но он должен вызываться после:

super.onCreate(savedInstanceState)

, поскольку this относится к Context действия, а этот Context действителен только после этого вызова.Поэтому вы можете изменить объявление на:

val sharedPref: SharedPreferences? by lazy { this.getPreferences(Context.MODE_PRIVATE) }

, таким образом sharedPref будет инициализирован при первом использовании после вызова super.onCreate(savedInstanceState).Подробнее о ленивый .

0 голосов
/ 19 марта 2019

Переместить строку внутрь onCreate после super.onCreate

val PREFS_NAME = "com.teamtreehouse.colorsarefun.prefs"
var prefs: SharedPreferences? = null

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            prefs =  = this.getSharedPreferences(PREFS_FILENAME, 0)
            binding = DataBindingUtil.setContentView(this, R.layout.activity_player_details)
            ...
        }
0 голосов
/ 19 марта 2019

Делая this.getPreferences (Context.MODE_PRIVATE), вы вызвали метод унаследовать от AppCompatActivity, поскольку onCreate является первым обратным вызовом при запуске операции, поэтому все еще не настроено.

0 голосов
/ 19 марта 2019

Самое безопасное место для вызова это после super.onCreate(savedInstnaceState).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...