Измените <view
на <View
, потому что view
не находится в пустом представлении. Это для пользовательского представления, определенного через class
attr, как показано ниже:
<view
android:layout_width="wrap_content"
android:layout_height="wrap_content"
class="com.your.package.YourCustomView" />
И вы получили
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
из-за LayoutInflater
пытается разобрать class
attr:
LayoutInflater
Исходный код
//...
View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,
boolean ignoreThemeAttr) {
if (name.equals("view")) { // line 724
name = attrs.getAttributeValue(null, "class"); // line 725
}
// Apply a theme wrapper, if allowed and one is specified.
if (!ignoreThemeAttr) {
final TypedArray ta = context.obtainStyledAttributes(attrs, ATTRS_THEME);
final int themeResId = ta.getResourceId(0, 0);
if (themeResId != 0) {
context = new ContextThemeWrapper(context, themeResId);
}
ta.recycle();
}
if (name.equals(TAG_1995)) { // line 738
// Let's party like it's 1995!
return new BlinkLayout(context, attrs);
}
//...
view
и получает true
class
attr и получает null
blink
и получает сбой Кроме того, есть любопытная вещь, разработчики Android добавили пасхальное яйцо, вы можете попробовать:
<view
android:layout_width="wrap_content"
android:layout_height="wrap_content"
class="blink">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Some text" />
</view>
Моя философия входа довольно легко получена в итоге в четырех частях:
Аудит или бизнес-логика, регистрирующаяся
Журнал те вещи, которые требуются, чтобы быть зарегистрированными. Это прибывает из требований к приложению и может включать вход каждого изменения, внесенного в любую базу данных (как во многих финансовых приложениях) или вход доступов к данным (как может требоваться в медицинской промышленности выполнить промышленные инструкции)
, Поскольку это - часть требований программы, многие не включают его в их общие обсуждения входа, однако в этих областях существует перекрытие, и для некоторых приложений полезно рассмотреть все операции входа вместе.
Программа, регистрирующаяся
сообщения, которые помогут разработчикам протестировать и отладить приложение, и более легко следовать за потоком данных и логикой программы для понимания, где реализация, интеграция и другие ошибки могут существовать.
В целом этот вход включается и выключается по мере необходимости для сеансов отладки.
Производительность, регистрирующаяся
, Добавляет более поздний вход по мере необходимости, чтобы найти и разрешить узкие места производительности и другие проблемы программы, которые не заставляют программу перестать работать, но приведут к лучшей операции. Перекрытия с Программой, регистрирующейся в случае утечек памяти и некоторых некритических ошибок.
безопасность, регистрирующаяся
Регистрирующиеся пользовательские действия и взаимодействия с внешними системами, где безопасность является беспокойством. Полезный для определения, как взломщик повредил систему после нападения, но может также наброситься на систему обнаружения проникновения для обнаружения новых или продолжающихся нападений.
Я работаю с безопасностью, критические системы реального времени и вход часто являются единственным способом поймать редкие ошибки, которые только поднимают каждый 53-й вторник, когда это - полная луна при ловле моего дрейфа. Это отчасти делает Вас одержимыми предметом, таким образом, я принесу извинения теперь, начинаю ли я вскипать во рту.
я разрабатываю системы, которые способны к входу в значительной степени всего, но я не включаю все по умолчанию. Отладочная информация отправляется в скрытое диалоговое окно отладки, которое добавляет метку времени к ней и производит ее к полю списка (ограниченный приблизительно 500 строками перед удалением), и диалоговое окно позволяет мне останавливать ее, сохранять ее к файлу журнала автоматически или отклонять ее к приложенному отладчику, такому как DBWin32. Та диверсия позволяет мне видеть вывод отладки из нескольких приложений все аккуратно сериализированные, который может иногда быть жизненным средством сохранения. Файлы журнала автоматически очищены каждый дни N. Я использовал для использования числовых уровней входа (чем выше Вы устанавливаете уровень, тем больше Вы получаете):
кроме этого слишком негибко - поскольку Вы прокладываете себе путь к ошибке, на которой намного более эффективно смочь сфокусировать вход в систему точно, в чем Вы нуждаетесь, не имея необходимость пробираться через тонны осколков, и это может быть один конкретный вид транзакции или операции, которая вызывает ошибку. Если это требует, чтобы Вы включили все, Вы просто делаете свое собственное задание тяжелее. Вам нужно что-то с более прекрасными зернами.
Поэтому теперь я нахожусь в процессе переключения на вход на основе системы флага. Все, что зарегистрировано, имеет детализацию флага, какая операция это, и существует ряд флажков, разрешающих мне определить то, что зарегистрировано. Обычно тот список похож на это:
#define DEBUG_ERROR 1
#define DEBUG_BASIC 2
#define DEBUG_DETAIL 4
#define DEBUG_MSG_BASIC 8
#define DEBUG_MSG_POLL 16
#define DEBUG_MSG_STATUS 32
#define DEBUG_METRICS 64
#define DEBUG_EXCEPTION 128
#define DEBUG_STATE_CHANGE 256
#define DEBUG_DB_READ 512
#define DEBUG_DB_WRITE 1024
#define DEBUG_SQL_TEXT 2048
#define DEBUG_MSG_CONTENTS 4096
Эта система регистрации поставлется со сборкой конечных версий, включенной и сохраняющий в файл по умолчанию. Слишком поздно, чтобы узнать, что необходимо было регистрироваться ПОСЛЕ ТОГО, КАК ошибка произошла, если та ошибка только происходит один раз в шесть месяцев в среднем, и у Вас нет способа воспроизвести его.
программное обеспечение обычно поставлется с ОШИБКОЙ, ОСНОВНОЙ, STATE_CHANGE и включенное ИСКЛЮЧЕНИЕ, но это может быть изменено в поле через диалоговое окно отладки (или установка registry/ini/cfg, где эти вещи сохраняются).
, О, и одна вещь - моя система отладки генерирует один файл в день. Ваши требования могут отличаться. Но удостоверьтесь, что Ваш код отладки запускается каждый файл с датой, версией кода, который Вы выполняете, и, если возможно некоторый маркер для идентификатора клиента, местоположения системы или что бы то ни было. Можно вложить путаницу файлов журнала, прибывающих из поля, и Вам нужна некоторая запись того, что прибыло из того, где и какую версию системы они выполняли, это находится на самом деле в самих данных, и Вы не можете доверять клиенту/наладчику, чтобы сказать Вам, какую версию они имеют - они могут просто сказать Вам, какая версия они ДУМАЮТ, что имеют. Хуже, они могут сообщить о exe версии, это находится на диске, но старая версия все еще работает, потому что они забыли перезагружать после замены. Имейте свой код, говорят Вам сам.
Это - мой выведенный мозг...
Я думаю всегда, всегда, всегда добавляйте вход, когда существует исключение, включая сообщение и полное отслеживание стека. Кроме того, я думаю, что это довольно субъективно к тому, используете ли Вы часто журналы или нет...
я часто пытаюсь только добавить вход в систему критических мест, где то, что я регистрирую, должно очень редко совершать нападки, иначе Вы получаете проблему как, он упомянул журналов, которые становятся слишком большими..., это - то, почему вход ошибочных случаев является идеальной вещью всегда зарегистрироваться (и замечательно быть в состоянии видеть, когда эти ошибочные случаи на самом деле поражаются так, можно осмотреть проблему далее).
Другие хорошие вещи зарегистрироваться состоят в том, если Вы имеете утверждения и Ваш сбой утверждений, затем регистрируете его... такой как, этот запрос должен находиться под 10 результатами, если это больше может быть проблема, так зарегистрируйте его. Конечно, если оператор журнала заканчивает тем, что заполнил журналы, это - вероятно, подсказка, чтобы или поместить его в своего рода уровень "отладки", или скорректировать или удалить оператор журнала. Если журналы станут слишком большими, Вы будете часто заканчивать тем, что игнорировали их.
Я беру то, что я рассматриваю традиционным подходом; некоторый вход, окруженный условным выражением, определяет. Для производственных сборок я выключаю определение.
Я принимаю решение зарегистрироваться сознательно, когда я иду, поскольку это означает, что данные логов значимы:
Используя некоторую форму инжекции кода, представление или прослеживание инструмента для генерации журналов, скорее всего, генерировали бы подробные, менее полезные журналы, которые будут более тверды погрузиться в. Они могут быть полезными как помощь для отладки, как бы то ни было.
Я запускаю путем утверждения большого количества условий в моем коде (в C#, с помощью System.Diagnostics.Assert
), но я добавляю вход только там, где я нахожу при отладке или подвергании системы напряжению, что у меня действительно должен быть способ следовать за тем, что происходит в моем коде, не имея отладчика, постоянно присоединенного.
Иначе, я предпочитаю использовать поддержку Visual Studio поместить трассировки в код как специальные точки останова (т.е. Вы вставляете точку останова и щелкаете правой кнопкой по ней, затем выбираете, "Когда поражено..." и говорите ее, что отобразиться в этом случае). Нет никакой потребности перекомпилировать, и легко позволить/запретить трассировки на лету.
Если Вы пишете программу, которая будет использоваться многими людьми, лучше иметь некоторый механизм для выбора то, что будет зарегистрировано и что не будет. Один аргумент в пользу .logthis () функции состоят в том, что они могут быть превосходной заменой для встроенных комментариев в некоторых случаях (если сделано правильно).
Плюс, это помогает Вам сузить ТОЧНО, где ошибка происходит.
Зарегистрируйте их всех и позвольте Grep уладить их.
Я соглашаюсь с Adam, но я также рассмотрел бы регистрирующиеся вещи интереса или вещи, которые можно продемонстрировать как успехи как своего рода доказательство того, что они происходили.
Я определяю множество уровней и передаю в установке с конфигурацией / вызов.