Принудительное закрытие при динамическом создании виджета из XML в Android - PullRequest
1 голос
/ 23 апреля 2011

Я пытаюсь создать несколько переключателей и динамически добавить их в RadioGroup.Когда я использую метод LayoutInflater для извлечения xml и добавления его в текущий вид, все работает отлично.Отображаются правильные переключатели.

Однако, когда я пытаюсь привести View, который LayoutInflater.inflate возвратил к RadioButton (чтобы я мог установить Text), я получаю принудительное закрытие с java.lang.ClassCastException.

for (int i = 0; i < options.length(); i++) {
  JSONObject option = options.getJSONObject(i);

  View option_view = vi.inflate(R.layout.poll_option, radio_group, true);
  option_view.setId(i);

  RadioButton rb = (RadioButton) option_view.findViewById(i);

  rb.setText(option.getString("response"));
}

poll_option.xml:

<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
             android:text="RadioButton" 
             android:layout_width="wrap_content" 
             android:layout_height="wrap_content" />

Ответы [ 3 ]

5 голосов
/ 23 апреля 2011

Проблема в том, что вы не получаете взгляды, которые, как вы думаете, вы получаете.LayoutInflater.inflate(), вызываемый с предоставленным корневым представлением, означает, что возвращаемое вам представление является ТАКИМ корневым представлением (не завышенным представлением).Метод, в котором вы вызываете его, надувает новый RadioButton и присоединяет его к группе, но возвращаемое значение (option_view) - это сама группа, а не отдельный элемент.Поскольку вам необходимо поиграть с представлением перед присоединением его к группе, я бы порекомендовал следующий код (который работает):

//I added these for posterity, I'm sure however you get these references is fine
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
RadioGroup radio_group = new RadioGroup(this);
//Get the button, rename it, then add it to the group.
for(int i = 0; i < options.length(); i++) {
    JSONObject option = options.getJSONObject(i);

    RadioButton option_view = (RadioButton)vi.inflate(R.layout.poll_option, null);
    option_view.setText(option.getString("response"));

    radio_group.addView(button);
}

От редакции:

Только мои 0,02 доллара за такую ​​простую схему, запускать процесс инфляции снова и снова в цикле может быть слишком много (инфляция стоит дорого).Вы можете легко создать тот же RadioButton в коде и добавить его с помощью LayoutParams, например:

LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
for (int i = 0; i < options.length(); i++) {
    RadioButton option_view = new RadioButton(this);
    option_view.setText(option.getString("response"));
    radio_group.addView(option_view, params);
}

Этот код я не тестировал, но он должен быть довольно близок: p

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

1 голос
/ 23 апреля 2011

Вы, вероятно, хотите использовать findViewById и найти переключатель в раздутом виде. Что-то вроде:

RadioButton rb = (RadioButton)option_view.findViewById(R.id.yourButtonId);

См. http://developer.android.com/reference/android/view/View.html#findViewById(int)

0 голосов
/ 23 апреля 2011

вы хотите radiobutton.setId (INT) а затем получить его с помощью findViewById (), чтобы получить кнопку.

setID (Int) должен использоваться при динамическом создании кнопки. Теперь вы можете получить к нему доступ позже с помощью findViewById.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...