Это канонический вопрос для проблемы, часто публикуемой на StackOverflow.
Я слежу за учебником. Я создал новое занятие с помощью мастера. Я получаю NullPointerException
при попытке вызвать метод для View
s, полученного findViewById()
в моей деятельности onCreate()
.
Активность onCreate()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View something = findViewById(R.id.something);
something.setOnClickListener(new View.OnClickListener() { ... }); // NPE HERE
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
Макет XML ( fragment_main.xml
):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="packagename.MainActivity$PlaceholderFragment" >
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/something" />
</RelativeLayout>
findViewById()
наrootView
и не от деятельности.Попробуйте
OnStart()
метод и просто используйтеили объявить любое представление с использованием
getView().findViewById
метода вonStart()
Объявить прослушиватель кликов для просмотра
anyView.setOnClickListener(this);
источник
Попробуйте переключить ваши представления доступа на метод фрагмента onViewCreated, потому что иногда, когда вы пытаетесь получить доступ к представлениям в методе onCreate, они не отображаются в то время, когда возникает исключение нулевого указателя.
источник
Согласен, это типичная ошибка, потому что люди часто не понимают, как работают фрагменты, когда начинают работать над разработкой для Android. Чтобы избежать путаницы, я создал простой пример кода, который изначально был опубликован в разделе «Приложение остановлено в эмуляторе Android» , но я разместил его и здесь.
Пример такой:
activity_container.xml:
ExampleFragment:
fragment_example.xml:
И это должен быть действительный пример, он показывает, как вы можете использовать Activity для отображения фрагмента и обрабатывать события в этом фрагменте. А также как общаться с содержащим Activity.
источник
Otto
для связи вместо обратных вызовов и использоватьButterknife
для внедрения представлений.Представление «что-то» находится во фрагменте, а не в действии, поэтому вместо доступа к нему в действии вы должны получить доступ к нему в классе фрагмента, например
В PlaceholderFragment.class
источник
Вы пытаетесь получить доступ к элементам пользовательского интерфейса в
onCreate()
но, еще слишком рано для доступа к ним, поскольку представления фрагментов могут быть созданы вonCreateView()
методе. ИonActivityCreated()
метод надежен для обработки любых действий с ними, поскольку в этом состоянии активность полностью загружена.источник
Добавьте следующее в свой activity_main.xml
источник
Поскольку вы объявили свое представление в файле
fragment_main.xml
, переместите этот фрагмент кода, в который вы получаете NPE, вonCreateView()
методе фрагмента. Это должно решить проблему.источник
в опубликованном коде выше в вопросе есть проблема: вы используете R.layout.activity_main в методе oncreate, но имя файла xml - «fragment_main.xml», означает, что вы пытаетесь получить представление файла fragment_main.xml который не отображается, поэтому он дает исключение нулевого указателя. измените код, например:
источник
Вы должны помнить, что важно следующее: исключение NullPointerException возникает, когда вы объявили свою переменную и пытаетесь получить ее значение перед присвоением ей значения.
источник
Используйте метод onViewCreated () при использовании или вызове представлений из фрагментов.
источник
У меня такая же
NullPointerException
инициализация слушателя после вызоваfindViewById()
onCreate()
иonCreateView()
методов.Но когда я использовал
onActivityCreated(Bundle savedInstanceState) {...}
его, он работает. Итак, я мог получить доступGroupView
и установить свой слушатель.Надеюсь, это будет полезно.
источник
Самая популярная библиотека для поиска представлений, которую использует практически каждый разработчик.
Нож для масла
Насколько я могу, их ответов достаточно, чтобы объяснить поиск точек зрения с помощью надлежащей методологии. Но если вы разработчик Android и часто кодите ежедневно, вы можете использовать нож для масла, который экономит много времени при поиске представлений, и у вас нет кода для него. С помощью 2-3 шагов вы можете найти представления за миллисекунды. ,
Добавить зависимость в gradle на уровне приложения:
Добавьте плагин для ножа для масла:
Затем найдите Android ButterKnife Zelezny, установите плагин и перезапустите студию, и все готово.
Теперь просто перейдите к методу Oncreate вашей активности и щелкните правой кнопкой мыши свое layout_name, нажмите кнопку создания и выберите вариант впрыска масляного ножа, и ваши ссылки на представления будут автоматически созданы, как указано ниже:
источник