Null pointer Exception – findViewById ()

Может ли кто-нибудь помочь мне узнать, что может быть проблемой с этой программой. В onCreate() findViewById() возвращает значение null для всех идентификаторов, и это вызывает исключение нулевого указателя позже. Я не могу понять, почему findViewById() не может найти представление. Какие-либо предложения?

Это основной код:

 public class MainActivity extends Activity { ViewPager pager; MyPagerAdapter adapter; LinearLayout layout1, layout2, layout3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); layout1 = (LinearLayout) findViewById(R.id.first_View); layout2 = (LinearLayout) findViewById(R.id.second_View); layout3 = (LinearLayout) findViewById(R.id.third_View); adapter = new MyPagerAdapter(); pager = (ViewPager) findViewById(R.id.main_pager); pager.setAdapter(adapter); } private class MyPagerAdapter extends PagerAdapter { @Override public int getCount() { return 3; } @Override public Object instantiateItem(ViewGroup collection, int position) { LinearLayout l = null; if (position == 0 ) { l = layout1; } if (position == 1) { l = layout2; } if (position == 2) { l = layout3; } collection.addView(l, position); return l; } @Override public boolean isViewFromObject(View view, Object object) { return (view==object); } @Override public void destroyItem(ViewGroup collection, int position, Object view) { collection.removeView((View) view); } } } 

И связанные файлы XML:

Макет activity_main:

     

Макет activity_first:

    

Макет activity_second:

      

И макет activity_third:

     

10 Solutions collect form web for “Null pointer Exception – findViewById ()”

findViewById() возвращает представление, если оно существует в макете, setContentView() в setContentView() , в противном случае возвращает null, и это то, что происходит с вами.

Пример, если вы setContentView(R.layout.activity_first); а затем вызовите findViewById(R.id.first_View); он вернет представление, которое является вашим макетом.

Но если вы вызываете findViewById(R.id.second_View); он будет возвращать значение null поскольку в вашем макете activity_first.xml под названием @+id/second_View .

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

 @Override public Object instantiateItem(ViewGroup collection, int position) { LinearLayout l = null; if (position == 0) { l = (LinearLayout) View.inflate(this, R.layout.activity_first, null); } if (position == 1) { l = (LinearLayout) View.inflate(this, R.layout.activity_second, null); } if (position == 2) { l = (LinearLayout) View.inflate(this, R.layout.activity_third, null); } collection.addView(l, position); return l; } 

добавьте эти представления в адаптер пейджера, прежде чем обращаться к ним.

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); adapter = new MyPagerAdapter(); pager = (ViewPager) findViewById(R.id.main_pager); pager.setAdapter(adapter); layout1 = (LinearLayout) findViewById(R.id.first_View); layout2 = (LinearLayout) findViewById(R.id.second_View); layout3 = (LinearLayout) findViewById(R.id.third_View); } 

в адаптере пейджера:

 public Object instantiateItem(View collection, int position) { if(position == 0){ View layout = inflater.inflate(R.layout.activity_first, null); ((ViewPager) collection).addView(layout); return layout; } ... and so forth. } 

отсюда вы можете получить к ним доступ через findViewById.

Сегодня я получил эту ошибку, и было так просто прояснить, что я «facepalmed».

Просто попробуйте добавить элемент пользовательского интерфейса в свой XML-файл макета в каталог res / layout-port !!!

Добавлен акцент

Для тех случаев в classе Activity.

Activity.findViewById(int id)

Находит представление, которое было идентифицировано атрибутом id из XML, обработанного в onCreate(Bundle) .


В противном случае, например, fragment, адаптер, View из LayoutInflater и т. Д.

View.findViewById(int id)

Найдите детское представление с данным id . Если это представление имеет данный идентификатор, верните это представление.


В любом случае,

Возвращает
Представление, если оно найдено, или null противном случае .


Теперь перепроверьте ваши XML-файлы. Убедитесь, что вы ввели правильное значение в setContentView или inflater.inflate .

В случае действия вызовите findViewById после setContentView .

Затем убедитесь, что есть вид, который вы ищете с помощью android:id="@+id/..." в этом макете. Удостоверьтесь, что R.id + находится в @+id , который добавит ресурс в значения R.id чтобы убедиться, что вы можете найти его на Java.

То, что сказал @Warlock выше, правильно, вы должны создать LinearLayout layout1, layout2, layout3 по правильному пути:

 LinearLayout layout1 = (LinearLayout) View.inflate(this, R.layout.first_View, null); LinearLayout layout2 = (LinearLayout) View.inflate(this, R.layout.second_View, null); LinearLayout layout3 = (LinearLayout) View.inflate(this, R.layout.third, null); 

пожелайте, чтобы мой совет помог вам

Иногда вам нужно очистить свой проект в Eclipse (Project – Clean ..).

В Android findViewById(R.id.some_id) работает, когда вы находите вид в макете.

То есть, если вы установили макет, скажите:

 setContentView(R.layout.my_layout); 

Представления можно найти только в этом макете (my_layout).

В вашем layout1 , layout2 , layout3 все три разных макета, и они не настроены на активность.

Метод findViewById должен найти то, что находится в макете (который вы вызывали в setContentView )

В моем случае это была глупая ошибка с моей стороны. Я написал код в методе OnCreate, но он был выше строки кода setContentView . Когда я переместил код ниже этой строки, приложение начало работать нормально.

 setContentView(R.layout.activity_main); 
Interesting Posts

Защитник Windows: отключить режим реального времени; Следить за расписанием и по требованию

Обновление Eclipse с помощью средств разработки Android v. 23

Создание домашнего веб-сервера

Возможность монтировать .iso в Windows 8 отсутствует.

В чем разница между сетью NAT / Bridged / Host-Only?

Как узнать, является ли noatime или relatime параметром монтирования по умолчанию в ядре?

Нет Интернета через веб-браузер, но Skype по-прежнему работает

Как resize изображения с помощью Java?

Использование «Запуск от имени администратора» ничего не делает

Как получить наилучшее качество звука с помощью youtube-dl?

Возможно ли избежать метасимволов регулярных выражений с помощью sed

Unity: Null при создании нового экземпляра classа

Где Google Chrome для Linux хранит пользовательские данные?

Как написать пользовательский десериализатор JSON для Gson?

Как я могу получить виртуальные рабочие столы (например, Mac's Spaces) на моей машине с Windows 7?

Давайте будем гением компьютера.