Исключение нулевого указателя при раздувании из XML (без использования TabActivity)

В настоящее время я пытаюсь отлаживать свое приложение для Android. Я построил первый экран, и он использует Tab Host. Я внес несколько незначительных изменений в TabHost, чтобы добавить несколько дополнительных методов (полный исходный код будет следовать) для работы с некоторыми другими частями моего приложения.

Однако, когда я пытаюсь запустить следующее, я получаю исключение нулевого указателя на Inflate, и это на самом деле ничего не говорит мне о том, почему. Я загрузил полный исходный код Android для своего SDK и добавил его в eclipse, чтобы пройти через процесс инфляции и выяснить, могу ли я таким образом получить больше информации об ошибке.

Я точно нашел, какая строка вызывала ошибку (источник указан ниже), но при переходе через отладчик произошло что-то странное. Логика представляет собой случай if/else, где if == true он должен возвращать объект New Parser(), я запустил этот код, и он успешно прошел через конструктор Parser, но после возврата из него следующая инструкция вышла прямо из группа операторов на строку ниже возвращает null.

Конструктор, похоже, работает правильно (он находится в XmlBlock.java, если вам интересно), но он по-прежнему переходит на следующую строку и возвращает null, и я понятия не имею, почему это так. Я искал решения, но пока единственная подобная проблема возникла у кого-то, использующего TabActivity, который не подходит для моего приложения. Мне нужно, чтобы вкладки и их представления генерировались объектами, которые я определил в своем проекте (аналогично контроллерам представлений в стиле IOS), а не отдельными процессами с использованием намерений для запуска новых действий.

Может кто-нибудь взглянуть на мой источник и сказать мне, что я здесь делаю неправильно, потому что никто другой не может сказать мне, в чем проблема? Вот еще одна прямая ссылка на соответствующий источник: http://pastebin.com/9VRE2UGW.


person Fallout2man    schedule 22.12.2010    source источник
comment
Если вы добавляете несколько дополнительных методов в свою активность для работы с некоторыми другими частями вашего приложения, похоже, вы делаете что-то не так.   -  person Falmarri    schedule 22.12.2010
comment
Мне просто очень не нравится, как Android вроде Бога/классов все в действиях, которые немного смешивают логику пользовательского интерфейса и контроллера. Я предпочел более четкое разделение объектов ViewController в стиле IOS. Поэтому я разрабатывал свое приложение вокруг них. Было несложно собрать хороший базовый класс венчурного капитала и работать с ним. Я уже разобрался с этими первоначальными проблемами и теперь уже перешел к более серьезной работе, переносу моего парсера CSV в SQLite с Objective-C на Java.   -  person Fallout2man    schedule 26.12.2010


Ответы (2)


Хорошо, похоже, что моя НАСТОЯЩАЯ проблема заключалась в том, что я не искал в перспективе Android DDMS информацию об отладке. Первоначально я думал, что перспектива отладки Java даст мне всю необходимую информацию. Настоящая причина этого исключения была в другом месте программы. Теперь, когда я читаю logcat, я должен решить остальную часть этого самостоятельно, поскольку это была моя настоящая проблема (неадекватная информация).

person Fallout2man    schedule 22.12.2010
comment
Просто подумал, что оставлю здесь комментарий на случай, если кто-то захочет узнать, что такое НАСТОЯЩАЯ ошибка. Я забыл вызвать TabHost.setup() после раздувания моего представления. В примере, который я видел, использовалось TabActivity (поэтому я специально упомянул здесь, что не использовал его). В некоторых случаях вам нужно вручную вызывать TabHost.setup() после инициализации, а в других — нет. Я не знал об этом раньше, и это генерировало исключения нулевого указателя, когда я пытался добавить вкладки, потому что виджет вкладки не был должным образом назначен внутри свойств TabHost. - person Fallout2man; 23.12.2010

Я подозреваю, что эта строка неверна:

TabBarController UITabBarController = 
    (TabBarController)interfaceBuilder.inflate(R.layout.tab_bar , null);

Поскольку ваш R.layout.tab_bar представляет собой TabHost:

<?xml version="1.0" encoding="utf-8"?>
<TabHost
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:id="@android:id/tabhost">
        <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
                <TabWidget
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:id="@android:id/tabs"
                android:layout_alignParentBottom="true" />

                <FrameLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@android:id/tabcontent">
                </FrameLayout>
        </RelativeLayout>
</TabHost>
person Vit Khudenko    schedule 22.12.2010
comment
Хорошо, спасибо, на самом деле забыл обновить этот тег. который фактически был заменен правильным полным именем класса Java. Это все еще не работает. Я попытался пойти другим путем и вместо этого выполнить View.inflate(), но теперь я получаю исключения ClassNotFound. Есть ли причина, по которой ClassLoader не сможет найти данный класс во время выполнения, который компилятор без проблем нашел во время компиляции? - person Fallout2man; 23.12.2010