【问题标题】:How to save checkboxes state with onSaveInstanceState如何使用 onSaveInstanceState 保存复选框状态
【发布时间】:2016-04-22 10:30:13
【问题描述】:

我有一个警报对话框,其中显示了几个复选框(更准确地说是 5 个)。复选框过滤了我的地图上显示的 5 个标记列表,这些标记按小时间隔分组。除了我不知道应该如何在 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();
    }

更新

。 . .

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);

【问题讨论】:

  • 如果对您有帮助,请采纳答案。
  • 我之前尝试过这个想法,不幸的是它不起作用。我的意思是我正在添加此代码,但旋转时发生同样的事情,复选框被重置,不仅它们不保留以前的检查,而且在屏幕旋转后它们不工作(不过滤任何东西)......
  • 您是否通过在 onCreate 方法中读取包来设置复选框的值?
  • 是的,或者至少我认为我是...我会更新问题中的代码,以便您看得更清楚

标签: java android checkbox savestate


【解决方案1】:

您可以尝试以下方法。

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

【讨论】:

  • 更新后的代码或多或少是你所说的,不是吗?但它不起作用
  • 您是否调试并查看您的onSaveInstanceState 是否被调用?还可以看看你的onCreate中savedInstanceState的内容是什么
  • 是的,因为它非常适用于 outState.putInt("the_map_type", mapTypeSelected);
  • onCreate() 传入的 bundle 怎么样?
  • 请更明确一点,我是新手,所以我不明白你在问我什么
【解决方案2】:

“默认实现通过在层次结构中具有 id 的每个视图上调用 onSaveInstanceState() 为您处理大部分 UI 每个实例的状态”,请查看 documentation。

所以尝试为所有复选框设置 id。

【讨论】:

  • 我所有的复选框都有 id 并且在旋转后仍然没有保留复选框的勾号...
  • 可能你重写了 onSaveInstanceState() 方法,忘记调用 super.onSaveInstanceState()
猜你喜欢
  • 1970-01-01
  • 2013-01-11
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2018-11-12
  • 1970-01-01
相关资源
最近更新 更多