Я получил ответ JSON, у которого есть elementId и флаг для скрытия/отображения этого элемента.
Функция вызова с использованием этого (из ответа JSON)
displayView(templateDefinationItem.getTemplateDefinationId(), templateDefinationItem.isActive());
Я создал одну функцию для скрытия представлений
public void displayView(final int elementId, boolean isVisible) {
try {
View view = findViewById(elementId);
if (isVisible) {
view.setVisibility(View.VISIBLE);
} else {
view.setVisibility(View.GONE);
}
} catch (Exception e) {
e.printStackTrace();
}
}
В приведенном выше коде я передал elementId и значение true/false для операции, где elementId (EditTextId, TextView, LinearLayout, кнопки и т. д.)
Ошибка
я получил ошибку в этой строке View view = findViewById(elementId); при получении null.
Что я хочу
есть ли способ связать любой тип элемента? Или любой общий вид для того же самого?
в моем случае я использовал этот View view = findViewById(elementId); для привязки, но я получил нуль.
Что вы передаете как elementId?
Представление необходимо инициализировать в методе onCreate. В противном случае вы получите исключение с нулевым указателем.
@Ashish Я передаю elementId из моего onCreate()
В вашем xml есть этот elementId?
покажи этот elementid
@esQmo_ да, я передал идентификатор элемента после onCreate()
@Ashish Я обновил вопрос, что я передаю в функцию
Что такое templateDefinationItem.getTemplateDefinationId()? Как вы можете настроить вид на этот элемент?
@FaysalAhmed я разбираю ответ JSON и сохраняю его в объекте, так что это мои объекты
Хорошо понял. Но этому findViewById(elementId); нужен идентификатор элемента представления. Предположим, у вас есть файл макета, такой как item_layout.xml, и в файле xml есть изображение с идентификатором +@id/imageView. Теперь, если вы используете findViewById(R.id.imageView), вы можете получить представление. И тогда легко можно показать/скрыть вид. В вашей ситуации elementId не является ссылкой на представление. Вот почему представление равно нулю.
Я сомневаюсь, что это сработает - насколько я понимаю, статически определенные (т.е. в XML) идентификаторы представлений не согласованы между сборками. Я бы порекомендовал вам использовать технику, описанную в ответе Четана Джоши, или, что еще лучше, иметь промежуточный слой, на котором вы сопоставляете свои представления с содержимым в вашем JSON (например, Map<String, View>, а ваша полезная нагрузка JSON содержит ключ, который сопоставляется с соответствующим View, который вы Затем можно установить видимость для).
Решение @PPartisan CChetan Joshi работает на меня
Вместо того, чтобы передавать идентификатор представления, вы должны передавать представление в методе отображения, что более удобно.
Идентификаторы первых просмотров генерируются автоматически, поэтому, если вы храните эти идентификаторы где-то, а затем используете для получения просмотров, это неправильно, потому что идентификаторы генерируются, и это разные устройства для устройств, и они могут измениться в любое время, когда приложение закрывается и запускается снова.
Вы можете сделать это через getIdentifier()
try {
String buttonID = elementId;//String name of id
int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
View view = findViewById(resID);
if (isVisible) {
view.setVisibility(View.VISIBLE);
} else {
view.setVisibility(View.GONE);
} catch (Exception e) {
e.printStackTrace();
}
как и выше, мы передаем идентификатор представления с комбинацией значений i и j, а затем используем метод getIdentifier() для создания объектов Views.
Я считаю, что приведенный выше код является решением вашей проблемы.
но я хочу скрыть и показать эти представления на основе ответа JSON
вы получаете идентификаторы просмотра из JSON?
да, я получил представление из JSON, и я уже создал элемент с тем же идентификатором, что мне только нужно сделать, я только скрываю и показываю этот элемент на основе ответа JSON.
@ Arbaz.in Но вы получаете нулевое представление, что является проблемой в вашем коде, после того, как вы получите объект представления, вы можете скрывать и отображать представления.
да @ChetanJoshi у меня ноль, и это моя проблема, пожалуйста, помогите мне с тем же
И, как вы сказали, вы получаете идентификаторы из JSON, откуда приходит json
Смотрите мой обновленный ответ, он может помочь вам понять основную причину.
да, вы правы, но вопрос в том, как связать любое представление в Android, как общий способ?
Я бы предложил использовать Kotlin вместо Java и дополнительно использовать основная библиотека ktx (это библиотека полезных расширений Kotlin для Android). С его помощью вы можете сделать что-то вроде этого:
view.isVisible = true устанавливает представление на View.VISIBLE, тогда как view.isVisible = false устанавливает его на View.GONE.
Точно так же у вас есть view.isInvisible, который переключается между невидимым и видимым, и view.isGone, который переключается между исчезнувшим и видимым.
Если вам нужна документация по этим методам, вы можете найти ее здесь.
Кроме того, если вы используете Kotlin вместо Java, вам не нужно делать findViewById(R.id.xxx), вы можете просто выполнить статический импорт любого представления.
Спасибо за предложение, но все приложение разрабатывается на JAVA и готово к публикации.
он показывает ноль, потому что вы не передали ни одного элемента в эту позицию