Я хочу программно скрыть элемент/представления в Android

Я получил ответ 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); для привязки, но я получил нуль.

он показывает ноль, потому что вы не передали ни одного элемента в эту позицию

Ashish 05.02.2019 10:17

Что вы передаете как elementId?

Fragment 05.02.2019 10:17

Представление необходимо инициализировать в методе onCreate. В противном случае вы получите исключение с нулевым указателем.

esQmo_ 05.02.2019 10:18

@Ashish Я передаю elementId из моего onCreate()

Arbaz.in 05.02.2019 10:20

В вашем xml есть этот elementId?

rgaraisayev 05.02.2019 10:20

покажи этот elementid

Ashish 05.02.2019 10:20

@esQmo_ да, я передал идентификатор элемента после onCreate()

Arbaz.in 05.02.2019 10:21

@Ashish Я обновил вопрос, что я передаю в функцию

Arbaz.in 05.02.2019 10:23

Что такое templateDefinationItem.getTemplateDefinationId()? Как вы можете настроить вид на этот элемент?

Faysal Ahmed 05.02.2019 10:51

@FaysalAhmed я разбираю ответ JSON и сохраняю его в объекте, так что это мои объекты

Arbaz.in 05.02.2019 10:52

Хорошо понял. Но этому findViewById(elementId); нужен идентификатор элемента представления. Предположим, у вас есть файл макета, такой как item_layout.xml, и в файле xml есть изображение с идентификатором +@id/imageView. Теперь, если вы используете findViewById(R.id.imageView), вы можете получить представление. И тогда легко можно показать/скрыть вид. В вашей ситуации elementId не является ссылкой на представление. Вот почему представление равно нулю.

Faysal Ahmed 05.02.2019 11:01

Я сомневаюсь, что это сработает - насколько я понимаю, статически определенные (т.е. в XML) идентификаторы представлений не согласованы между сборками. Я бы порекомендовал вам использовать технику, описанную в ответе Четана Джоши, или, что еще лучше, иметь промежуточный слой, на котором вы сопоставляете свои представления с содержимым в вашем JSON (например, Map<String, View>, а ваша полезная нагрузка JSON содержит ключ, который сопоставляется с соответствующим View, который вы Затем можно установить видимость для).

PPartisan 05.02.2019 11:46

Решение @PPartisan CChetan Joshi работает на меня

Arbaz.in 05.02.2019 14:37
0
13
2 086
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вместо того, чтобы передавать идентификатор представления, вы должны передавать представление в методе отображения, что более удобно.

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

Вы можете сделать это через 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

Arbaz.in 05.02.2019 10:26

вы получаете идентификаторы просмотра из JSON?

Ifta 05.02.2019 10:33

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

Arbaz.in 05.02.2019 10:35

@ Arbaz.in Но вы получаете нулевое представление, что является проблемой в вашем коде, после того, как вы получите объект представления, вы можете скрывать и отображать представления.

Chetan Joshi 05.02.2019 10:41

да @ChetanJoshi у меня ноль, и это моя проблема, пожалуйста, помогите мне с тем же

Arbaz.in 05.02.2019 10:42

И, как вы сказали, вы получаете идентификаторы из JSON, откуда приходит json

Chetan Joshi 05.02.2019 10:43

Смотрите мой обновленный ответ, он может помочь вам понять основную причину.

Chetan Joshi 05.02.2019 10:46

да, вы правы, но вопрос в том, как связать любое представление в Android, как общий способ?

Arbaz.in 05.02.2019 10:54

Я бы предложил использовать 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 и готово к публикации.

Arbaz.in 24.05.2019 05:23

Другие вопросы по теме