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 7 с меньшим жестким диском

Как загрузить части одного и того же файла из разных источников с помощью curl / wget?

PHP-скрипт не может запускать скрипт bash. Sh: Разрешение отклонено

Ext2 или Ext4 для загрузочного USB-флеш-накопителя с Linux?

Простой, простой способ создания символических ссылок в Windows?

Установка диска восстановления на определенный раздел

Учетная запись не действует как администратор правильно

Должен ли я использовать пластиковые / изоляционные шайбы при подключении материнской платы к корпусу?

PuTTY не отправляет Esc

Пытаясь установить Astromenace на мой linux mint 14 cinnamon pc

Как установить гостевые дополнения VirtualBox для CentOS 7?

Добавление загрузочного раздела на внешний жесткий диск

Можно ли маршрутизировать только конкретное приложение через VPN?

Контроль подкачки и блокировка крышки в Windows 7

Нет видеовыхода

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