Android中的共享优先逻辑问题

时间:2016-08-23 05:31:42

标签: android sharedpreferences

我是Android开发的新手,我正在开发我的第一个Android应用程序,其中我使用共享首选项的概念来存储按钮的值。

我的要求

自安装以来第一次打开应用程序时,用户单击该按钮并打开计时器选择器对话框。用户选择首选时间并点击“确定”。按钮。点击'确定'按钮,用户选择的时间在按钮本身上设置为文本。所以现在按钮显示用户设置的时间。我希望每当用户第一次打开应用程序时,此值都可用。

为了保存该按钮值,我使用共享首选项。因此,无论何时用户在第一次打开主活动时,该按钮都会显示用户先前选择的时间值。

在下面的代码中,我使用我的知识实现了共享首选项,并尝试运行我的应用程序。当应用程序第一次打开时,在主活动中我设置了时间值,并且该时间在按钮上正确显示。

面临的问题:

当我按下后退按钮(On Stop())或通过点击最近的应用程序按钮(On Destroy())从内存中删除应用程序并再次打开我的应用程序时,按钮上的时间值可由用户选择先前。现在,当我关闭应用程序而不设置任何时间并再次打开应用程序按钮时,先前显示的值将被默认文本替换(即"设置时间")。 问题是,当我没有设置时间并关闭应用程序时,按钮中的值会在应用程序再次打开时重置。

我无法理解为什么共享偏好从第二次开始就无法正常工作。

有人请帮我纠正以下代码。在此先感谢:)

注意:下面不包含类和布局xml文件的导入。

我的代码:

    public class MainActivity extends Activity implements OnClickListener {

    SharedPreferences storedata;

    public static final String filename = "StoredData";



    Button ATfrom;

    int ATfromHour;
    int ATfromMinute;

    static long ATfrom_to_millisec;

    String Active_From_Time;

    String SP_Active_From_Time = null;



    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub

        super.onDestroy();
        storedata = getSharedPreferences(filename, 0);
        SharedPreferences.Editor editor = storedata.edit();
        editor.putString("Active_From_Time", Active_From_Time);

        editor.commit();

    }

        @Override
    protected void onStop() {
        // TODO Auto-generated method stub
            super.onStop();
            storedata = getSharedPreferences(filename, 0);
            SharedPreferences.Editor editor = storedata.edit();
            editor.putString("Active_From_Time", Active_From_Time);

            editor.commit();
    } 

    @Override
    protected void onRestart() {
        // TODO Auto-generated method stub

        super.onRestart();
        storedata = getSharedPreferences(filename, 0);
        SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time");

        ATfrom.setText(SP_Active_From_Time);

    }
    @Override
    protected void onResume() {

        super.onResume(); 
        storedata = getSharedPreferences(filename, 0);
        SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time");


    ATfrom.setText(SP_Active_From_Time);
    }



    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        storedata = getSharedPreferences(filename, 0);
        SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time");

        ATfrom.setText(SP_Active_From_Time);

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);



        ATfrom = (Button) findViewById(R.id.ATfrom);
        ATfrom.setOnClickListener(this);



        //calling shared preference to get the value of the button ATfrom

        storedata = getSharedPreferences(filename, 0);
        SP_Active_From_Time = storedata.getString("Active_From_Time", "Set time");


        ATfrom.setText(SP_Active_From_Time);

    }

    @Override
    protected void onSaveInstanceState(Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        String statetosave = ATfrom.getText().toString();
        savedInstanceState.putString("saved_state", statetosave);


        super.onSaveInstanceState(savedInstanceState);
    }



    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onRestoreInstanceState(savedInstanceState);
        String statesaved = savedInstanceState.getString("saved_state");
        ATfrom.setText(statesaved);


    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {


        case R.id.ATfrom:

            final Calendar ATfromC = Calendar.getInstance();
            ATfromHour = ATfromC.get(Calendar.HOUR_OF_DAY);
            ATfromMinute = ATfromC.get(Calendar.MINUTE);

            // Launch Time Picker Dialog
            TimePickerDialog ATfromtpd = new TimePickerDialog(MainActivity.this,
                    new TimePickerDialog.OnTimeSetListener() {

                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                            String AM_PM;
                            if (hourOfDay < 12) {
                                AM_PM = "AM";
                            } else {
                                AM_PM = "PM";
                                if (hourOfDay > 12) {
                                    hourOfDay = hourOfDay - 12;
                                }
                            }
                            if (minute < 10) {
                                ATfrom.setText(hourOfDay + ":0" + minute + " " + AM_PM);
                            } else {
                                ATfrom.setText(hourOfDay + ":" + minute + " " + AM_PM);
                            }

                            //Converting time to string for shared preference
                            Active_From_Time = ATfrom.getText().toString();

                            ATfrom_to_millisec = (ATfromHour * 60 * 60 * 1000) + (ATfromMinute * 60 * 1000);


                        }
                    }, ATfromHour, ATfromMinute, false);


            ATfromtpd.show();

            break;
                  }


    }
}

1 个答案:

答案 0 :(得分:1)

不需要onStop和onDestroy方法。删除onStop和onDestroy并更新您的点击监听器,如下所示:

@Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {


        case R.id.ATfrom:

            final Calendar ATfromC = Calendar.getInstance();
            ATfromHour = ATfromC.get(Calendar.HOUR_OF_DAY);
            ATfromMinute = ATfromC.get(Calendar.MINUTE);

            // Launch Time Picker Dialog
            TimePickerDialog ATfromtpd = new TimePickerDialog(MainActivity.this,
                    new TimePickerDialog.OnTimeSetListener() {

                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                            String AM_PM;
                            if (hourOfDay < 12) {
                                AM_PM = "AM";
                            } else {
                                AM_PM = "PM";
                                if (hourOfDay > 12) {
                                    hourOfDay = hourOfDay - 12;
                                }
                            }
                            if (minute < 10) {
                                ATfrom.setText(hourOfDay + ":0" + minute + " " + AM_PM);
                            } else {
                                ATfrom.setText(hourOfDay + ":" + minute + " " + AM_PM);
                            }

                            //Converting time to string for shared preference
                            Active_From_Time = ATfrom.getText().toString();

                            ATfrom_to_millisec = (ATfromHour * 60 * 60 * 1000) + (ATfromMinute * 60 * 1000);
    storedata = getSharedPreferences(filename, 0);
                SharedPreferences.Editor editor = storedata.edit();
                editor.putString("Active_From_Time", Active_From_Time);

                editor.commit();

                        }
                    }, ATfromHour, ATfromMinute, false);


            ATfromtpd.show();

            break;
                  }


    }

每次启动应用程序并退出Active_From_Time值时,都会覆盖并以共享首选项更新。

快乐编码!!!