2012-04-26 3 views
1

Что мое приложение первый делает это загружает ListView элементы которого имеют невидимую CheckBoxes, установив его видимость View.Gone. Когда пользователь нажимает кнопку меню, он включается и выключается видимость CheckBox и некоторые другие макеты. Ниже приведен код, я удалил некоторые ненужные части:CheckBoxes в ListView исчезает, когда экран вращается

private void editmodeSwitch(boolean flag){ 
    // get topbar, bottombar, and bottombar2 
    LinearLayout topbar = (LinearLayout) findViewById(R.id.task_topbar_linearLayout); 
    LinearLayout bottombar = (LinearLayout) findViewById(R.id.task_bottombar1_linearlayout); 
    LinearLayout bottombar2 = (LinearLayout) findViewById(R.id.task_bottombar2_linearlayout); 

    if(flag){ 
     isEditmodeOn = true;    

     // make topbar and bottombar2 visilble, but bottombar gone 
     topbar.setVisibility(View.VISIBLE); 
     bottombar.setVisibility(View.GONE); 
     bottombar2.setVisibility(View.VISIBLE); 

     // make checkboxes visible in listview visible as well 
     for(int i=0; i<listView.getChildCount(); i++){ 
      LinearLayout ll = (LinearLayout) listView.getChildAt(i); 
      CheckBox cb = (CheckBox) ll.findViewById(R.id.task_row_checkBox1); 
      cb.setVisibility(View.VISIBLE); 
     } 
    } 
    else{ 
     isEditmodeOn = false; 

     topbar.setVisibility(View.GONE); 
     bottombar.setVisibility(View.VISIBLE); 
     bottombar2.setVisibility(View.GONE); 

     // set each checkbox false and its visibility gone 
     for(int i=0; i<listView.getChildCount(); i++){ 
      LinearLayout ll = (LinearLayout) listView.getChildAt(i); 
      CheckBox cb = (CheckBox) ll.findViewById(R.id.task_row_checkBox1); 
      cb.setVisibility(View.GONE); 
      cb.setChecked(false); 
     } 
    } 
} 

Он отлично работает, но проблема в том, что приложение не работает, когда экран вращается (меняет ориентацию экрана). Все работало хорошо, как он отображается несколько макетов, но только CheckBoxes in list items. Below is the code in OnCreate() `:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.task_layout); 

    initialize(); 
    loadDB(); 
    updateListAdapter(list_title, list_date); 

    // in case of screen rotation 
    if(savedInstanceState != null){ 
     isEditmodeOn = savedInstanceState.getBoolean(EDITMODE_CHECK); 
     isItemChecked = savedInstanceState.getBoolean(ITEM_CHECK); 

     if(isEditmodeOn){ 
      if(!isItemChecked){ 
       Log.i(tag, "item NOT checked"); 
       editmodeSwitch(true); 
      } else{ 
       //this is something different so please don't mind 
       deditmodeSwitch(savedInstanceState.getBooleanArray(LIST_CB_CHECK)); 
      } 
     } 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    // save values for rotation 
    outState.putBoolean(EDITMODE_CHECK, isEditmodeOn); 
    outState.putBoolean(ITEM_CHECK, isItemChecked); 
    outState.putBooleanArray(LIST_CB_CHECK, list_cb_check); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    Log.i(tag, "you're in onRestoreInstanceState()"); 

    // in case of screen rotation 
    if(savedInstanceState != null){ 
     isEditmodeOn = savedInstanceState.getBoolean(EDITMODE_CHECK); 
     isItemChecked = savedInstanceState.getBoolean(ITEM_CHECK); 

     if(isEditmodeOn){ 
      if(!isItemChecked){ 
       Log.i(tag, "item NOT checked"); 
       editmodeSwitch(true); 
      } else{ 
       // this is for something else so please ignore this part 
       editmodeSwitch(savedInstanceState.getBooleanArray(LIST_CB_CHECK)); 
      } 
     } 
    } 

То, что я догадалась это ListView загружается в конце. Поэтому, даже если код в onCreate() отображает CheckBoxes, CheckBoxes снова станет невидимым, так как его инициализация в xml сделает это. Тем не менее, я застрял здесь и нуждаюсь в вашем совете для решения этой проблемы. Может кто-нибудь мне помочь?

На всякий случай ниже приведен флажок кода макета xml-файла для получения.

<CheckBox android:id="@+id/task_row_checkBox1" android:gravity="right" 
    android:layout_width="wrap_content" android:layout_height="wrap_content" 
    android:visibility="gone" 
    /> 
+0

Вы не сохраняете состояния флажка в onSaveInstanceState перед его извлечением. поэтому сначала сохраняйте состояния в onSaveInstanceState путем переопределения 'onSaveInstanceState' –

+0

Извините Imran. Я поставлю свой код в onSaveInstanceState() через минуту. Спасибо за ваш совет! – June

ответ

0

Основываясь на моем опыте, GetView, кажется, срабатывает в конце, и это было почему «onRestoreInstanceState()» и «onConfigurationChanged() 'не удалось сделать так, как getview сбросит мои флажки, невидимые в качестве инициализации в XML-файле макета.

Таким образом, единственное решение, которое я смог выяснить, это я должен контролировать их в getview для ответа.

0

Подобно тому, как переопределить OnCreate, вы можете переопределить onConfigurationChanged (...), которые вы можете настроить для запуска, когда экран меняет ориентацию.

Для того, чтобы OnConfigurationChanged (...), чтобы быть спусковой крючок, когда экран поворачивается, вам необходимо отредактировать ваш манифест и положить, что отношения/правила в.

Это легко сделать, но занимает немного объяснить и он ответил, прежде чем в этом вопросе: Activity restart on rotation Android

Edit: Вот DEV руководство о том, как обрабатывать изменения конфигурации http://developer.android.com/guide/topics/resources/runtime-changes.html

Edit # 2: во-первых, позвольте мне предложить использовать решение Имрана. Это следует за Руководство разработчика лучше, и конечные результаты будут одинаковыми.

Теперь для решения onConfigurationChanged.

Посмотрите на то, что вы делаете с вашим OnCreate:

1) Установите вид. (Флажки скрыты в этой точке. Правильно?)

2) Обратитесь к БД и определить, следует ли отображать флажки (режим редактирования)

3) Сделать все галочки видны.

Теперь onConfigurationChanged также вызывает setContentView, после чего все ваши флажки снова скрыты. Поэтому вам нужно повторить процесс отображения ваших флажков (№ 3 выше). Вероятно, вам не нужно повторять шаг №2, потому что значение должно быть сохранено, но я не уверен, как работает логика вашего приложения, поэтому вы должны : нужно повторить шаг №2.

Это имеет смысл?

+0

Зачем требовать OnConfigurationChanged для этого вопроса? –

+0

Благодарим вас за вашу идею и хорошие ссылки Gophermofur. Я мог бы научиться новым технологиям. и используется метод onConfiguraionChanged(), но он все еще не делает видимыми флажки (другие макеты работали нормально). После некоторых тестов я думаю, что макет xml getview, который имеет флажки View.Gone как инициализацию, по-прежнему загружается в конце. Поэтому именно поэтому флажки становятся невидимыми, поскольку в файле xml есть флажки. Ящики View.Gone и reset, невидимые после onConfigurationChanged() и onRestoreInstanceState(), делают их видимыми. Я знаю, что вы уже много мне помогаете, могу ли я попросить вас о помощи? – June

+0

Слишком долго, чтобы объяснить это здесь, см. Мой пересмотренный ответ. – Gophermofur

1

Override onSaveInstanceState для сохранения значения на поворот экрана и onRestoreInstanceState как:

protected void onCreate(Bundle savedInstanceState) { 

    if(null != savedInstanceState) 
      { 
       Boolean IntTest = savedInstanceState.getBoolean("ITEM_CHECK"); 
       Boolean StrTest = savedInstanceState.getBoolean("ITEM_CHECK"); 
       Log.e(TAG, "onCreate get the savedInstanceState+IntTest="+IntTest+"+StrTest="+StrTest);   
      } 
} 
     @Override 
     public void onSaveInstanceState(Bundle savedInstanceState) { 
      // Save away the CheckBoxes states, so we still have it if the activity 
      // needs to be killed while paused. 

      savedInstanceState.putBoolean(EDITMODE_CHECK, 0); 
      savedInstanceState.putBoolean(ITEM_CHECK, 0); 
      super.onSaveInstanceState(savedInstanceState); 
      Log.e(TAG, "onSaveInstanceState"); 
     } 
     @Override 
     public void onRestoreInstanceState(Bundle savedInstanceState) { 
      super.onRestoreInstanceState(savedInstanceState); 
      Boolean IntTest = savedInstanceState.getBoolean(EDITMODE_CHECK); 
      Boolean StrTest = savedInstanceState.getBoolean(ITEM_CHECK); 
      Log.e(TAG, "onRestoreInstanceState+IntTest="+IntTest+"+StrTest="+StrTest); 
     } 
+0

Благодарим вас за идею Imran. Однако это не решило мою проблему. После некоторых тестов кажется, что XML-файл макета getview, который имеет видимость невидимого флажка, все еще загружается в конце после onSaveInstanceState и onRestoreInstanceState. Поэтому, я думаю, они сбросили мои флажки View.Gone. Я знаю, что ты уже дал мне отличную идею, но если возможно, могу я снова попросить твою помощь? – June

+0

june, ok спросите меня о проблеме –

+0

Я предполагаю, что onRestoreInstanceSate() или пакетный параметр onCreate() действительно работал нормально, но единственная проблема, на мой взгляд, заключается в том, что макет xml-файла для getview кажется загруженным в конце. Поскольку этот файл макета устанавливает флажки View.Gone как инициализацию, поэтому все остальные функции работают, но только видимость флажков, поскольку он будет сбрасываться файлом макета. Поэтому, я думаю, мне нужно вызвать мой код после загрузки, но я застрял здесь (или, может быть, моя идея НЕПРАВИЛЬНО) У вас есть идея для этого Имрана? Спасибо в advace и спасибо за ваш быстрый ответ! – June

Смежные вопросы