Как обрабатывать ** Grid View ** при изменении конфигурации? - PullRequest
6 голосов
/ 19 декабря 2011

Я использую вид сетки в активности моего приложения. Каждая строка представления сетки содержит три флажка, которые можно установить на выбранный / не выбранный в зависимости от того, что пользователь хочет запросить из базы данных. Действие также включает editText , который вызывает onScreenKeyboard при каждом запуске действия, и здесь у меня возникают проблемы. OnScreenKeyboard , когда появляется сообщение, мешающее просмотру сетки, и некоторые из его флажков просто исчезают. Моя идея состояла в том, чтобы обновлять сетку каждый раз, когда изменяется конфигурация. Я попытался обработать это, возвращая объект через onRetainNonConfigurationInstance () . Объект содержит список массивов, чтобы заполнить мои gridview строки но но onCreate () , когда я использую getLastNonConfigurationInstance () , чтобы получить возвращенный объект, он показывает ноль. Может кто-нибудь предложить мне, как решить эту проблему, или если есть какой-либо другой подход, с помощью которого я могу заставить свой gridView вести себя нормально при изменении конфигурации. Ниже приведен код, и я хочу прояснить, что я добавил keyboardHidden изменение конфигурации в файле манифеста, но когда появляется клавиатура, это иногда не вызывает onConfigurationChanged ()

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.failureselection);
    findLocalWidgets(); //Initializes Layout Objects

    if(configchanged){
                    //Re populate grid view
                        customDataGridRows = (ArrayList<CustomGridViewRow>) getLastNonConfigurationInstance();
                        dgvwFailures.setAdapter(new CustomGridViewAdapter(this,
                                customDataGridRows));

                                configchanged = false;
                      }else{
                            fillFailuresList(customDataGridRows);
                            dgvwFailures.setAdapter(new CustomGridViewAdapter(this,
                                    customDataGridRows));
                    }

    }


@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.failureselection);

    configchanged = true;
}


@Override
public Object onRetainNonConfigurationInstance() {

    return customDataGridRows;
}

private boolean fillFailuresList(
        ArrayList<CustomGridViewRow> customDataGridRows) {
    boolean isFilled = false;
    try {
        // Adding Failures data
        customDataGridRows.add(new CustomGridViewRow(false, "Hood", false,
                "Assembly Defect", false, "Masking Poor"));
        customDataGridRows.add(new CustomGridViewRow(false, "Floor", false,
                "Forget Work", false, "Assembly Defect"));
        customDataGridRows.add(new CustomGridViewRow(false, "Grill", false,
                "Incorrect Assembly", false, "Bad Company"));
        customDataGridRows.add(new CustomGridViewRow(false,
                "R Right Frame", false, "Interference", false,
                "Fix Large Effort"));
        customDataGridRows.add(new CustomGridViewRow(false, "R Left Frame",
                false, "Leakage", false, "High Incidence"));
        customDataGridRows.add(new CustomGridViewRow(false, "R Frame",
                false, "Dirt", false, "Recurrence"));
        customDataGridRows.add(new CustomGridViewRow(false,
                "Outside R Frame", false, "Decal", false, "Checking"));
        customDataGridRows.add(new CustomGridViewRow(false,
                "F Right Frame", false, "Other", false, "Foreign Body"));
        customDataGridRows.add(new CustomGridViewRow(false, "F Left Frame",
                false, "", false, "Not Caulking"));
        customDataGridRows.add(new CustomGridViewRow(false, "F Frame",
                false, "", false, "Painting Defect"));
        customDataGridRows.add(new CustomGridViewRow(false,
                "Outsie F Frame", false, "", false, "Other"));
        customDataGridRows.add(new CustomGridViewRow(false, "", false, "",
                false, ""));

        // Populating Failures grid view
//      dgvwFailures.setAdapter(new CustomGridViewAdapter(this,
//              customDataGridRows));

        isFilled = true;

    } catch (Exception e) {
        e.getMessage();
    }
    return isFilled;

}

Ответы [ 3 ]

4 голосов
/ 09 января 2014

Пара вариантов:

  1. Как предотвратить потерю состояния пользовательских видов при изменении ориентации экрана для вашего CustomGridViewRow.
  2. Создайте метод в своем адаптере, поместите значения в пакет и восстановите его при создании, используя savedInstanceState

Совет: Удалите все <requestFocus /> из вашего макета EditText. Хотя Android установит фокус на первый фокусируемый вид.

Еще один взлом: Как убрать фокус, не устанавливая фокус на другой элемент управления?

2 голосов
/ 07 января 2014

Вместо этого вы можете перезаписать onSaveInstanceState(Bundle bundle) и в этом bunde сохранить все текущее состояние всех компонентов пользовательского интерфейса (например, bundle.putBoolean("check_box_1", true)).Когда произойдет какое-либо изменение конфигурации, система Android будет вызывать этот метод.

После изменения конфигурации, когда система будет воссоздавать вашу деятельность, вызывая onCreate(Bundle saveInstanceState), будет предоставлен тот же самый экземпляр Buldle, поэтому на этот раз saveInstanceState будетне null.Из этого Bundle извлеките ранее сохраненные значения (например, saveInstanceState.getBoolean("check_box_1")) и установите их для соответствующих полей.

Это стандартный способ обработки этого, и из-за этого onCreate() имеет Bundle в качестве входных данныхпараметр.

2 голосов
/ 20 декабря 2011

Если ваш onConfigurationChanged не вызывается всегда, рассмотрите возможность добавления

android:configChanges="keyboardHidden|orientation"

в вашем Манифесте. Это также вызовет вызов onConfigurationChanged, когда ориентация устройства изменится. Кроме того, я не уверен с setContentView внутри вашего onCOnfigurationChanged. Удачи

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