2016-04-22 4 views
0

У меня есть диалоговое окно оповещений, которое отображает пару флажков (точнее, 5). Флажки фильтруют 5 списков маркеров, которые отображаются на моей карте, маркеры, которые сгруппированы в часовые интервалы. Мне удалось сделать все, кроме факта, что я не знаю, как написать код в onSaveInstanceState, чтобы значения флажков сохранялись после поворота экрана. Вот часть кода, который, по моему мнению, имеет отношение к вопросу. Заранее благодарю за любую помощь!Как сохранить флажки state with onSaveInstanceState

public void filterTheMarkers(View view) { 

     if (dialog == null) { 

      AlertDialog.Builder builder; 
      builder = new AlertDialog.Builder(this); 
      LayoutInflater inflater = this.getLayoutInflater(); 
      @SuppressLint("InflateParams") View checkBoxView = inflater.inflate(R.layout.markers_filtering, null); 
      builder.setView(checkBoxView); 
      cbAllDay = (CheckBox) checkBoxView.findViewById(R.id.checkBox1); 
      cbBefore12 = (CheckBox) checkBoxView.findViewById(R.id.checkBox2); 
      cbBetween1216 = (CheckBox) checkBoxView.findViewById(R.id.checkBox3); 
      cbBetween1620 = (CheckBox) checkBoxView.findViewById(R.id.checkBox4); 
      ccbAfter20 = (CheckBox) checkBoxView.findViewById(R.id.checkBox5); 

      dialog = builder.create(); 

     } 
     dialog.show(); 
    } 


public void displaySelectedMarkers(View view) { 


     dialog.dismiss(); 
     Log.i("TAG", "All Day " + cbAllDay.isChecked() + " Before 12 " + cbBefore12.isChecked() + " Between 12-16 " + cbBetween1216.isChecked() + " Between 16-20" + cbBetween1620.isChecked() + " After 20 " + ccbAfter20.isChecked()); 
     //according these check boxes status execute your code to show/hide markers 

     if (cbAllDay.isChecked() && cbBefore12.isChecked() && cbBetween1216.isChecked() && cbBetween1620.isChecked() && ccbAfter20.isChecked()) { 
      // show all markers 
      for (Marker marker : allDayList) { 
       marker.setVisible(true); 
      } 
      for (Marker marker : before12List) { 
       marker.setVisible(true); 
      } 
      for (Marker marker : between1216List) { 
       marker.setVisible(true); 
      } 
      for (Marker marker : between1620List) { 
       marker.setVisible(true); 
      } 
      for (Marker marker : after20List) { 
       marker.setVisible(true); 
      } 
     } else if (cbAllDay.isChecked() && !cbBefore12.isChecked() && !cbBetween1216.isChecked() && !cbBetween1620.isChecked() && !ccbAfter20.isChecked()) { 
      // show only All Day Markers 
      for (Marker marker : allDayList) { 
       marker.setVisible(true); 
      } 
      for (Marker marker : before12List) { 
       marker.setVisible(false); 
      } 
      for (Marker marker : between1216List) { 
       marker.setVisible(false); 
      } 
      for (Marker marker : between1620List) { 
       marker.setVisible(false); 
      } 
      for (Marker marker : after20List) { 
       marker.setVisible(false); 
      } // and it goes like this forever covering every possible interval 
         . 
         . 
         . 
    } 

    } 

    public void doNothing(View view) { 

     dialog.dismiss(); 
    } 

UPDATE

. . .

Boolean keepMarkerFiltersCB1; 
Boolean keepMarkerFiltersCB2; 
Boolean keepMarkerFiltersCB3; 
Boolean keepMarkerFiltersCB4; 
Boolean keepMarkerFiltersCB5; 

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

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 


     if (savedInstanceState == null){ 
      mapTypeSelected = GoogleMap.MAP_TYPE_NORMAL; 
      mSetCameraPosition = true; 
      mapFragment.setRetainInstance(true); 
      initialMarkers = true; 

     } else { 
      mapTypeSelected = savedInstanceState.getInt("the_map_type", GoogleMap.MAP_TYPE_NORMAL); 
      mSetCameraPosition = false; 
      initialMarkers = false; 
      keepMarkerFiltersCB1 = savedInstanceState.getBoolean("checkBox1"); 
      keepMarkerFiltersCB2 = savedInstanceState.getBoolean("checkBox2"); 
      keepMarkerFiltersCB3 = savedInstanceState.getBoolean("checkBox3"); 
      keepMarkerFiltersCB4 = savedInstanceState.getBoolean("checkBox4"); 
      keepMarkerFiltersCB5 = savedInstanceState.getBoolean("checkBox5"); 
     } 

    public void filterTheMarkers(View view) { 

     if (dialog == null) { 

      AlertDialog.Builder builder; 
      builder = new AlertDialog.Builder(this); 
      LayoutInflater inflater = this.getLayoutInflater(); 
      @SuppressLint("InflateParams") View checkBoxView = inflater.inflate(R.layout.markers_filtering, null); 
      builder.setView(checkBoxView); 
      cbAllDay = (CheckBox) checkBoxView.findViewById(R.id.checkBox1); 
      cbBefore12 = (CheckBox) checkBoxView.findViewById(R.id.checkBox2); 
      cbBetween1216 = (CheckBox) checkBoxView.findViewById(R.id.checkBox3); 
      cbBetween1620 = (CheckBox) checkBoxView.findViewById(R.id.checkBox4); 
      ccbAfter20 = (CheckBox) checkBoxView.findViewById(R.id.checkBox5); 

      keepMarkerFiltersCB1 = cbAllDay.isChecked(); 
      keepMarkerFiltersCB2 = cbBefore12.isChecked(); 
      keepMarkerFiltersCB3 = cbBetween1216.isChecked(); 
      keepMarkerFiltersCB4 = cbBetween1620.isChecked(); 
      keepMarkerFiltersCB5 = ccbAfter20.isChecked(); 


      dialog = builder.create(); 

     } 
     dialog.show(); 
    } 

    public void displaySelectedMarkers(View view) { 


     dialog.dismiss(); 
     Log.i("TAG", "All Day " + cbAllDay.isChecked() + " Before 12 " + cbBefore12.isChecked() + " Between 12-16 " + cbBetween1216.isChecked() + " Between 16-20" + cbBetween1620.isChecked() + " After 20 " + ccbAfter20.isChecked()); 
     //according these check boxes status execute your code to show/hide markers 



     if (cbAllDay.isChecked() && cbBefore12.isChecked() && cbBetween1216.isChecked() && cbBetween1620.isChecked() && ccbAfter20.isChecked()) { 
      // show all markers 
      for (Marker marker : allDayList) { 
       marker.setVisible(true); 
      } 
      for (Marker marker : before12List) { 
       marker.setVisible(true); 
      } 
      for (Marker marker : between1216List) { 
       marker.setVisible(true); 
      } 
      for (Marker marker : between1620List) { 
       marker.setVisible(true); 
      } 
      for (Marker marker : after20List) { 
       marker.setVisible(true); 
      } 
     } else if (cbAllDay.isChecked() && !cbBefore12.isChecked() && !cbBetween1216.isChecked() && !cbBetween1620.isChecked() && !ccbAfter20.isChecked()) { 
      // show only All Day Markers 
      for (Marker marker : allDayList) { 
       marker.setVisible(true); 
      } 
      for (Marker marker : before12List) { 
       marker.setVisible(false); 
      } 
      for (Marker marker : between1216List) { 
       marker.setVisible(false); 
      } 
      for (Marker marker : between1620List) { 
       marker.setVisible(false); 
      } 
      for (Marker marker : after20List) { 
       marker.setVisible(false); 
      } 
     } else if 
. 
. 
. 


    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("the_map_type", mapTypeSelected); 
     outState.putBoolean("checkBox1", keepMarkerFiltersCB1); 
     outState.putBoolean("checkBox2", keepMarkerFiltersCB2); 
     outState.putBoolean("checkBox3", keepMarkerFiltersCB3); 
     outState.putBoolean("checkBox4", keepMarkerFiltersCB4); 
     outState.putBoolean("checkbox5", keepMarkerFiltersCB5); 

    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     savedInstanceState.get("the_map_type"); 
     savedInstanceState.get("checkBox1"); 
     savedInstanceState.get("checkBox2"); 
     savedInstanceState.get("checkBox3"); 
     savedInstanceState.get("checkBox4"); 
     savedInstanceState.get("checkBox5"); 

    } 

    private void initialLocation(double lat, double lng, float zoom){ 
     LatLng latLng = new LatLng(lat, lng); 
     CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng, zoom); 
     mMap.moveCamera(update); 
+0

ответьте, если это вам поможет. – notsopopularguy

+0

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

+0

вы настраиваете значения флажков путем чтения из пакета в методе onCreate? – notsopopularguy

ответ

0

«Реализация по умолчанию берет на себя большую часть пользовательского интерфейса каждого экземпляра состояния для вас по телефону onSaveInstanceState() на каждом представлении в иерархии , что имеет идентификатор», проверьте documentation.

Так что попробуйте установить идентификаторы на все ваши флажки.

+0

Все мои флажки имеют идентификаторы, и по-прежнему галочка галочка не сохраняется после вращения ... –

+0

Возможно, вы переписали метод onSaveInstanceState() и забыли позвонить super.onSaveInstanceState() –

+0

Нет, это не так, я не забыл об этом ... –

1

Вы можете попробовать следующее.

@Override 
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { 
    super.onSaveInstanceState(outState, outPersistentState); 
    outState.putBoolean("checkbox1",true); 
} 
+0

обновленный код, это более или менее то, что вы говорили, это не? Но он не работает –

+0

Вы отлаживали и видели, вызвано ли ваше 'onSaveInstanceState'? также посмотрите, что такое содержимое 'savedInstanceState' в вашем' onCreate' – notsopopularguy

+0

Yest, оно называется, поскольку оно отлично работает для outState.putInt («the_map_type», mapTypeSelected); –