Доступ к Parent-View на многих уровнях выше

У меня есть linearlayout, который содержит мой TextView, к которому я хочу получить доступ. В этом linearlayout есть список, где каждый элемент является linearlayout и содержит также настраиваемые представления.

Глубоко внутри есть кнопка с onclickListener. После выполнения onClick() я хочу вызвать метод, который устанавливает текст моего текстового представления. На данный момент делаю так:

(View)this.getParent().getParent().getParent().getParent().getParent().getParent().getParent().findViewById(R......)

Работает, но выглядит плохо. Есть ли возможность сделать это лучше?

Изображение


person Ef Ge    schedule 07.04.2014    source источник
comment
Почему бы просто не установить TextView в качестве члена в onCreate или onCreateView?   -  person Yaroslav Mytkalyk    schedule 07.04.2014


Ответы (2)


Да, это некрасиво, не делайте этого.

В вашем onClick(View v) завладейте TextView, попросив Activity сохранить макет:

@Override
public void onClick(View v) {
    TextView tv = (TextView) YourActivity.this
        .findViewById(R.id.your_text_view_id);
    tv.setText("blabla");
}

если вы делаете это из фрагмента вместо использования активности:

YourFragment.this.getView().findViewById(R.id.your_text_view_id) 

Или просто создайте участника TextView mTv, инициализируйте его в своем #OnCreate и используйте везде, как это предлагается в комментариях к вашему вопросу.

person kiruwka    schedule 07.04.2014

Выглядит это плохо, потому что для представления обычно плохая идея знать что-то вне себя. Так что, наверное, нормально знать о своих детях, но не о них.

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

См. Круговая зависимость.

person Korniltsev Anatoly    schedule 07.04.2014