Android UI показывает RadioButton как выбранный, хотя это не так - PullRequest
0 голосов
/ 28 ноября 2011

Когда мой пользовательский интерфейс воссоздается при смене ориентации, я использую super.onCreate(savedInstanceState) и getLastNonConfigurationInstance() для доступа к пользовательским данным, которые я сохранил, чтобы заполнить динамические части моего макета.

У меня есть RadioGroup, которая имеет две кнопки RadioButton и уже определена в файле XML. XML автоматически делает первый выбранным.

Когда происходит изменение ориентации и выбрана ВТОРАЯ радиокнопка, кажется, все работает нормально; вторая кнопка RadioB все еще выбрана в интерфейсе пользователя.

Но RadioGroup.getCheckedRadioButtonId() говорит, что выбран первый RadioButton. И я на самом деле ХОЧУ выбрать первым. Но ничего не меняется, когда я вызываю rb1.setChecked(true) - второй по-прежнему отображается как выбранный, и все же RadioGroup сообщает мне, что первый выбран (теперь это имеет смысл, но не отображается).

Это ДЕЙСТВИТЕЛЬНО странное поведение, у кого-нибудь есть советы?

(изменить) Части моего кода:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.itemselected);
    (...)
    radioGroupServingType = (RadioGroup) findViewById(R.id.radioGroupServingType);
    (...)

    RadioButton radioOwnServing = (RadioButton) findViewById(R.id.radioOwnServing);
    RadioButton radioUseServing = (RadioButton) findViewById(R.id.radioUseServing);

    radioOwnServing.setOnClickListener(this);
    radioUseServing.setOnClickListener(this);

    //FIXME WTF
    Log.d("", radioOwnServing.isChecked()+"/"+radioUseServing.isChecked()+" own/use checked");
    radioOwnServing.setChecked(true);
    Log.d("", radioOwnServing.isChecked()+"/"+radioUseServing.isChecked()+" own/use checked");

Если я выбираю radioUseServing в пользовательском интерфейсе и меняю ориентацию, журнал сообщает true/false own/use checked оба раза - хотя radioUseServing отображается так, как выбранный в пользовательском интерфейсе.

Кстати, logcat также выводит

W/asset(4040): deep redirect failure from 0x0103003e => 0x02060007, defStyleAttr=0x0101007e, defStyleRes=0x0103001a, style=0x00000000

при смене ориентации, иногда несколько раз. Я ничего не нашел в Google о том, что это значит.

1 Ответ

2 голосов
/ 28 ноября 2011

Я уже говорил с вами по IRC, но я полагаю, что если вы получите представление и опубликуете для него исполняемый файл, который вызовет .setChecked (), это фактически вызовет вызов setChecked в нужное время,и, таким образом, избегая вызова setChecked до того, как иерархия представления была готова к этому.Как то так:

final View myRadioButton  = findViewById(R.id.myradiobutton); 
myRadioButton.post(
    new Runnable() {
        @Override
        public void run() { myRadioButton.setChecked(true); }
    }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...