Как программно получить доступ к текстовому представлению или индикатору выполнения в относительной компоновке, если их несколько?

Я программно создаю несколько относительных макетов в действии. Каждый из них идентичен и имеет текстовое представление, а также счетчик ProgressBar.

Я хочу программно изменить их, когда это необходимо, но не знаю, как получить доступ к соответствующему. Я считаю, что мне нужно добавить уникальный SetId() к каждому элементу (или, возможно, к самому относительному макету), но не уверен, что это лучший способ сделать это.

Я также не уверен, что использую findViewById для доступа к однажды созданным представлениям для внесения изменений (SetText, SetVisibility и т. д.).

Вот код

RelativeLayout.LayoutParams tvpName = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    tvpName.addRule(RelativeLayout.ALIGN_PARENT_LEFT);

RelativeLayout.LayoutParams pbpSpinner = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    pbpSpinner.addRule(RelativeLayout.CENTER_IN_PARENT);
    pbpSpinner.addRule(RelativeLayout.ALIGN_PARENT_TOP);

 for (int i = 0; i < 5; i++) {
        RelativeLayout acctrl = new RelativeLayout(this);

        TextView tvName = new TextView(this);

        ProgressBar pbSpinner = new ProgressBar(this);
        pbSpinner.setVisibility(View.GONE);

        // Add items to Account Interal Layout
        acctrl.addView(tvName, tvpName);
        acctrl.addView(pbSpinner, pbpSpinner);
 }

Любые рекомендации/предложения?


person Peter    schedule 26.10.2015    source источник
comment
Почему бы не создать массив RelativeLayout и просто сохранить их в массиве по мере их создания? Тогда у вас будет ссылка на каждый из них.   -  person Steve    schedule 26.10.2015
comment
Думаю, я не уверен, как сделать массив RelativeLayouts, а затем ссылаться на представления внутри них.   -  person Peter    schedule 27.10.2015


Ответы (1)


Когда вы создаете View программно, рекомендуется использовать setId(). Кроме того, вы можете продолжить и setTag() тоже. Установив Tag, вы можете узнать, что такое каждый RelativeLayout или любой другой вид. Таким образом, вы можете получить вид, который вы ищете.

Если вы не собираетесь получать доступ к RelativeLayout или изменять его, вам не нужно устанавливать для него идентификатор, но установка идентификатора упрощает эту задачу, так что вы можете просто отправить идентификатор RelativeLayout в качестве параметра методу, и он будет выполнить все операции с Views, которые он содержит, поскольку вы сказали, что все RelativeLayout идентичны.

Если вы используете setId(), вы можете использовать findViewById() для получения представления.
Если вы используете setTag(), вы можете сослаться на то, как использовать его для получения представления: https://stackoverflow.com/a/5291891/4747587

person Henry    schedule 26.10.2015
comment
Как уже упоминалось, я думал, что должен setId()... но установить ли его для RelativeLayout или для представлений в RelativeLayout? После установки, как лучше всего программно получить доступ к этим представлениям... findViewById? - person Peter; 27.10.2015
comment
Вы должны setId(int) на RelativeLayouts и внутренних Views. Затем вы можете просто вызвать findViewById(int) с int, используемым в setId, и вы получите ссылку на View, будь то один из ваших макетов или внутренних представлений. - person Steve; 27.10.2015