Android background null не работает

Используйте библиотеку DataBinding для установки ресурса цвета фона или null

Я хотел бы установить цвет фона или null в моем представлении с помощью библиотеки DataBinding, но при попытке запустить его возникает исключение.

Вот как я это делаю:

Я также пробовал настроить преобразование, но это не сработало.

В конце концов, я решил это с помощью обходного пути, используя @BindingAdapter , но я хотел бы знать, как это сделать правильно.

7 ответов

Причина:

Прежде всего необходимо знать, что библиотека DataBinding уже предоставляет преобразователь привязки convertColorToDrawable , расположенный в android.databinding.adapters.Converters.convertColorToDrawable(int) .

Использование android:background должно «теоретически» работать, поскольку ему соответствует setBackground(Drawable) метод. Проблема в том, что он видит, что вы пытаетесь передать цвет в качестве первого аргумента, поэтому он попытался запустить этот преобразователь перед его применением к методу setBackground(Drawable) . Если привязка данных решит использовать конвертер, она будет использовать его для обоих аргументов, а также для null , прямо перед применением окончательного результата к установщику.
Поскольку null не может быть кастом к int (и вы не можете вызвать intValue() на нем), он выбрасывает NullPointerException .

Упоминается о том, что смешанные типы аргументов не поддерживаются в официальных данных. Руководство по переплету.

Вот два решения этой проблемы. Хотя вы можете использовать любое из этих двух решений, первое намного проще.

Решения:

1. Как растяжимый

Если вы определяете свой цвет не как цвет, а как доступный для рисования в ваших ресурсах (это может быть в нашем файле colors.xml:

Тогда вы сможете использовать android:background , как вы изначально хотели, но с возможностью рисования вместо цвета:

Здесь аргументы имеют совместимые типы: первый — это Drawable , а второй — null, поэтому его также можно преобразовать в Drawable .

2. Как идентификатор ресурса

Но также потребуется добавить импорт вашего класса R в раздел data :

Передача 0 в качестве «идентификатора нулевого ресурса» безопасна, потому что метод setBackgroundResource для View проверяет, отличается ли resid от 0, и в противном случае устанавливает значение null в качестве фонового рисунка. Здесь не создаются ненужные прозрачные рисованные объекты.

Другое решение для этого, если вы просто хотите установить backgroundTint , но не целиком background , вы можете использовать его следующим образом:

Вам нужно будет импортировать ContextCompat , если ваш min api равен 21:

Это действительно старый пост, но я хочу предложить еще одно решение.

  1. ОБЪЯВЛЕНИЕ ИНДИВИДУАЛЬНЫХ СТИЛЕЙ / ФОНОВ НА ГРАФИКАХ **

У меня есть четыре похожих стиля, поэтому я вставлю только один из них.

Когда я установлю этот стиль, моя кнопка будет выглядеть так:

  1. Подготовьте привязываемое значение в вашей модели / классе обработчика

В моем случае у меня есть код ниже в классе ActivityMainEventHandler

  1. Передайте свой класс вашему представлению

XML нашей деятельности

  1. Настройте фон для просмотра, как показано ниже
  1. Затем, если вы хотите снова проверить условия шага 2 и перерисовать представление, просто позвоните

В этой статье вы можете найти два хороших решения, но в моем случае только одно работает, потому что я хотел изменить оттенок фона в кнопке материала, вот мой адаптер привязки:

Сначала создайте файл Kotlin и вставьте этот метод адаптера:

Во-вторых, используйте его в своем xml:

и в конструкторе

Один из подходов, который вы можете использовать, — написать собственный @BindingConversion , который позаботится об этом за вас:

С его помощью вы можете установить для любого атрибута, который принимает ColorDrawable целочисленное значение цвета (например, 0 или @android:color/transparent ), и автоматически преобразовать его в облегченный @null.

Читайте также:  Samsung android устройств usb

(В то время как встроенный преобразователь convertColorToDrawable(int) всегда создает объект ColorDrawable , даже если цвет прозрачный.)

Примечание: чтобы этот метод использовался вместо встроенного @BindingConversion , он должен возвращать ColorDrawable , а не Drawable — в противном случае встроенный метод будет рассматривается как более конкретный / подходящий.

Другой подход — использовать статический метод для преобразования цвета в Drawable в выражении привязки данных, чтобы типы значений совпадали. Например, вы можете импортировать встроенный класс Converters :

. и напишите свое выражение так:

. хотя я бы лично рекомендовал вместо этого использовать такую ​​условную логику в вашем методе адаптера привязки данных, например с использованием метода getArticleBackground() , который возвращает Drawable или null. Как правило, легче отлаживать и отслеживать, если вы не помещаете логику принятия решений в файлы макета.

Я думаю, вам нужно попробовать по умолчанию color вместо null

Источник

Почему android:background=»@null» вызывает проблему при применении правил pro-guard?

Так что это происходит со мной, когда я применяю правила pro-guard для своего приложения. Я застрял с этой ошибкой.

Поэтому я искал это в интернете и где-то нашел, что удалите @null из файла .xml, и он должен работать. И это сработало. Итак, мой вопрос заключается в том, почему @null является проблемой?

2 ответа

Я сделал свое первое заявление на android. Он ничего особенного не делает, просто хранит некоторые пользовательские данные в SQLiteDatabase и управляет ими. Теперь приложение не требует специального разрешения. И, читая руководство по его публикации, я наткнулся на Pro-Guard. Исследуя его и читая.

Пожалуйста, дайте мне знать, что Pro-guard в приложениях android необходим или нет, прежде чем выпускать его в app store. в некоторых источниках упоминается использование pro-guard в android приложениях, что может создать проблему в приложении. Источник Ссылки Выгода Reduced APK size Improve.

proguard пытался использовать «null» в качестве имени для члена класса , когда он встречается с @null , это известная проблема . вы можете удалить

и заменить кодом java:

имя члена класса не может быть NULL , поскольку это зарезервированное ключевое слово в Java.

Похожие вопросы:

Я использую Retrofit 2.1.0 с парсером Jackson 2.8.6 . Но если Pro Guard включен, он не работает. Исключения в лог : D/EXAMPLE_PROJ: Class com.example.network.d.b.a.m$a has no default (no arg).

Я разработал приложение android и использовал admob sdk 6.2.1 для показа рекламы,и когда я тестировал приложение на своем реальном устройстве и на эмуляторе, реклама показывалась. но когда я.

Вопрос возник в этом тексте, который я прочитал из какого-то блога. Обратите внимание, что вам может потребоваться удалить версию разработки приложения на вашем устройстве, потому что.

Я сделал свое первое заявление на android. Он ничего особенного не делает, просто хранит некоторые пользовательские данные в SQLiteDatabase и управляет ими. Теперь приложение не требует специального.

Пожалуйста, дайте мне знать, что Pro-guard в приложениях android необходим или нет, прежде чем выпускать его в app store. в некоторых источниках упоминается использование pro-guard в android.

Итак, я включил Pro-Guard в проект, и после сборки apk я декомпилировал его, чтобы убедиться, что Pro-Guard выполнил свою работу, и заметил, что он добавляет, например, к классу BaseAdapter — /*.

я разрабатываю приложение, связанное с PDF, в android (java). Для редактирования PDF и преобразования других типов файлов в файл PDF я добавляю некоторые собственные библиотеки, и это прекрасно.

Получение этой ошибки при применении pro-guard Unexpected error while performing partial evaluation: Method =.

У меня есть строка данных, к которой я хотел бы добавить столбцы, поэтому я перекрестно применяю некоторые данные. Однако применяемая таблица иногда имеет значение null. Когда применяемая таблица.

Читайте также:  Wakelock detector android 4pda

Источник

Используйте библиотеку DataBinding для установки ресурса цвета фона или null

Я хотел бы установить цвет фона или null на мой взгляд, используя библиотеку DataBinding, но я получаю исключение при попытке ее запустить.

Вот как я это делаю:

Я также попытался установить преобразование, но это не сработало.

В конце концов, я решил это с помощью обходного пути, используя @BindingAdapter но я хотел бы знать, как это сделать правильно.

5 ответов

Причина:

Первое, что нужно знать, это то, что библиотека DataBinding уже предоставляет convertColorToDrawable Обязательный конвертер находится в android.databinding.adapters.Converters.convertColorToDrawable(int) ,

С помощью android:background должен «теоретически» работать, потому что имеет setBackground(Drawable) метод. Проблема в том, что он видит, что вы пытаетесь передать цвет в качестве первого аргумента, поэтому он пытался запустить этот конвертер, прежде чем применить его к setBackground(Drawable) метод. Если связывание данных решит использовать конвертер, оно будет использовать его в обоих аргументах, поэтому null , прямо перед применением окончательного результата к сеттеру.
Так как null нельзя каст int (и вы не можете вызвать intValue() на это) он бросает NullPointerException ,

Есть упоминание о том, что смешанные типы аргументов не поддерживаются в официальном Руководстве по привязке данных.

Вот два решения этой проблемы. Хотя вы можете использовать любое из этих двух решений, первое намного проще.

Решения:

1. Как рисовать

Если вы определяете свой цвет не как цвет, а как рисунок в ваших ресурсах (это может быть в нашем файле colors.xml:

тогда вы должны быть в состоянии использовать android:background как вы изначально хотели, но предоставляя рисование вместо цвета:

Здесь аргументы имеют совместимые типы: первый Drawable а второе значение равно нулю, так что он также может быть приведен к Drawable ,

2. Как идентификатор ресурса

но это также потребует добавить импорт класса R в data раздел:

Передача 0 в качестве «нулевого идентификатора ресурса» безопасна, потому что setBackgroundResource метод View проверяет, resid отличается от 0 и устанавливает ноль в качестве фона для рисования в противном случае. Никаких ненужных прозрачных прорисовываемых объектов там не создается.

Источник

Используйте библиотеку DataBinding для установки ресурса цвет фона или нулевого

Я хотел бы установить цвет фона или null в моем представлении, используя библиотеку DataBinding, но я получаю исключение, пытаясь запустить его.

Вот как я это делаю:

Я также попытался установить преобразование, но это не сработало.

В конце концов, я решил его обходным путем с помощью @BindingAdapter но я хотел бы знать, как это сделать правильно.

Причина:

Первое, что нужно знать, это то, что библиотека DataBinding уже предоставляет convertColorToDrawable конверсии convertColorToDrawable расположенный в android.databinding.adapters.Converters.convertColorToDrawable(int) .

Использование android:background должен «теоретически» работать, потому что он имеет соответствующий setBackground(Drawable) . Проблема в том, что он видит, что вы пытаетесь передать цвет в качестве первого аргумента, поэтому он попытался запустить этот конвертер, прежде чем применять его к setBackground(Drawable) . Если привязка данных решает использовать конвертер, он будет использовать его для обоих аргументов, так же как и для null , перед тем как применить конечный результат к сеттеру.
Поскольку null не может быть castes для int (и вы не можете вызвать intValue() на нем), он выдает NullPointerException .

Существует упоминание о том, что смешанные типы аргументов не поддерживаются в официальном руководстве по привязке данных .

Вот два решения этой проблемы. Хотя вы можете использовать любое из этих двух решений, первое намного проще.

Решения:

1. Как доступный

Если вы определяете свой цвет не как цвет, а как вытягиваемый в своих ресурсах (он может быть в нашем файле colors.xml:

То вы должны иметь возможность использовать android:background как вы изначально хотели, но предоставляющий возможность рисования вместо цвета:

Здесь аргументы имеют совместимые типы: сначала – Drawable а second – null, поэтому его также можно отнести к Drawable .

Читайте также:  Как отправить файл по wifi android

2. В качестве идентификатора ресурса

Но также потребуется добавить свой импорт R-класса в раздел data :

Передача 0 в качестве «идентификатора нулевого ресурса» безопасна, потому setBackgroundResource метод setBackgroundResource View проверяет, отличается ли значение, отличное от 0, и устанавливает значение null в качестве фона в противном случае. Там нет ненужных прозрачных объектов.

Я думаю, вы должны попробовать color умолчанию вместо null

Один из подходов, который вы можете использовать, – написать пользовательскую @BindingConversion чтобы позаботиться об этом для вас:

С помощью этого вы можете установить любой атрибут, который принимает ColorDrawable для целочисленного значения цвета (например, 0 или @android:color/transparent ) и автоматически преобразует его в легкий вес @null для вас.

(В то время как встроенный convertColorToDrawable(int) всегда создает объект ColorDrawable , даже если цвет прозрачен.)

Примечание: для того, чтобы этот метод использовался вместо встроенной @BindingConversion , он должен возвращать ColorDrawable а не Drawable иначе встроенный метод будет рассматриваться как более конкретный / соответствующий.

Другим подходом является использование статического метода для преобразования из цвета в Drawable в ваше выражение привязки данных, чтобы совместить типы значений. Например, вы можете импортировать встроенный класс Converters :

… и напишите свое выражение следующим образом:

… хотя я лично рекомендовал бы вместо этого использовать getArticleBackground() условную логику в методе адаптера привязки данных, например, используя метод getArticleBackground() который возвращает Drawable или null. В общем, легче отлаживать и отслеживать, если вы не ставите логику принятия решений в свои файлы макета.

Источник

Диалог с прозрачным фоном в Android

Как удалить черный фон из диалогового окна на Android. На рисунке показана проблема.

Добавить этот код

Использовать в java

Надеюсь, вам поможет!

Я столкнулся с более простой проблемой, и в решении, которое я придумал, была применена прозрачная тестовая ТЕМА. Напишите эти строки в своих стилях

В вашем основном файле манифеста, внутри блока активности диалога.

Плюс в вашем диалоговом действии XML-набор

Почему-то решение Zacharias не сработало для меня, поэтому я использовал тему ниже, чтобы решить эту проблему …

Можно установить эту тему в диалоговом окне, как показано ниже.

Вы можете использовать:

Метод. Далее следует документ:

Одна проблема, которую я нашел со всеми существующими ответами, заключается в том, что поля не сохраняются. Это связано с тем, что все они переопределяют атрибут android:windowBackground , который отвечает за поля, с сплошным цветом. Тем не менее, я сделал некоторые копания в Android SDK и нашел фоновый рисунок фона по умолчанию, и немного изменил его, чтобы разрешить прозрачные диалоги.

Сначала скопируйте /platforms/android-22/data/res/drawable/dialog_background_material.xml в свой проект. Или просто скопируйте эти строки в новый файл:

Обратите внимание, что android:color установлен на ?attr/colorBackground . Это сплошная серая / белая по умолчанию, которую вы видите. Чтобы цвет, определенный в android:background в вашем пользовательском стиле, был прозрачным и отображал прозрачность, все, что нам нужно сделать, это изменить ?attr/colorBackground на @android:color/transparent . Теперь это будет выглядеть так:

После этого перейдите к теме и добавьте следующее:

Обязательно замените newly_created_background_name фактическим именем только что созданного файла, и замените some_transparent_color на необходимый прозрачный фон.

После этого все, что нам нужно сделать, это установить тему. Используйте это при создании AlertDialog.Builder :

Затем просто создавайте, создавайте и показывайте диалог как обычно!

Такое же решение, как и zGnep, но используя xml:

Это то, что я сделал для достижения прозрачности с помощью AlertDialog.

Создал пользовательский стиль:

Затем создайте диалог с помощью:

Используйте этот код, он работает со мной:

Это мой путь, вы можете попробовать!

Попробуйте это в своем коде:

Он будет определенно работать … в моем случае …! мой друг

В моем случае решение работает следующим образом:

Источник

Оцените статью