【问题标题】:Shared Preferences not passing data between activities共享首选项不在活动之间传递数据
【发布时间】:2013-09-13 03:34:37
【问题描述】:

我已经有这个问题好几天了。当我设置我的数据时,我的共享偏好似乎不起作用。用户从main开始,显示“oncreate”,然后进入设置页面(自动设置数据的地方(暂时)),当他们返回主Activity时,数据似乎不想过来.我正在使用 joda Time 库,并且正在尝试计算两个日期之间的时间差。

Main:(onCreate代码和onResume代码相同)

public class MainActivity extends Activity {

    TextView tv; 
    Button set;

    //CONST
    final static long MILLIS_IN_DAY = 86400000;
    final static long MILLIS_IN_HOUR = 3600000;
    final static long MILLIS_IN_MINUTE = 60000;
    long day, hour, minute;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.textViewx);
        set = (Button) findViewById(R.id.setting);
        tv.setText("ONCREATE!");

        //LOAD DATA
        SharedPreferences prefs = getPreferences(MODE_PRIVATE);
        long loadedTime = prefs.getLong("quitDate", 0); //Load Settings Data
        boolean test = prefs.getBoolean("test", false);

        //get Comparison Data
        DateTime newDate = new DateTime();
        long updateTime = newDate.getMillis();
        long diffInMillis =  (updateTime-loadedTime);

        //Calculate
        minute = (diffInMillis/MILLIS_IN_MINUTE)%60;
        hour = (diffInMillis/MILLIS_IN_HOUR)%24;
        day = (diffInMillis/MILLIS_IN_DAY);

        tv.setText(""+Long.toString(loadedTime));
        if(test==true){
            tv.setText("" + "\nDay|Hour|Minute: " + Long.toString(day) +":" + Long.toString(hour) + ":" + Long.toString(minute));   
        }


        set.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Intent x = new Intent(MainActivity.this, Settings.class);
                startActivity(x);

            }
        });

设置:

import org.joda.time.DateTime;
import android.content.SharedPreferences;

public class Settings extends Activity implements View.OnClickListener {
    Button bAbout,bSettings,bFacebook;
    //(5000);
            final long MILLIS_IN_DAY = 86400000;
            final long MILLIS_IN_HOUR = 3600000;
            final long MILLIS_IN_MINUTE = 60000;
    //Variables
    long loadedTime;
    int packs;
    float cost;
    long day, hour, minute, second;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle("Settings");
        setContentView(R.layout.activity_settings);
        setUpButtons();

        DateTime d1 = new DateTime(2013,9,11,0,0);

        long today = d1.getMillis();        

        //SAVE DATA
        SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
         editor.putLong("quitDate", today);
         editor.putBoolean("test", true);
         editor.commit();

        minute = (today/MILLIS_IN_MINUTE)%60;
        hour = (today/MILLIS_IN_HOUR)%24;
        day = (today/MILLIS_IN_DAY);

        TextView tv = (TextView) findViewById(R.id.TEMPDATE);
        TextView tv2 = (TextView) findViewById(R.id.todayis);
    tv2.setText("Today is: " + Long.toString(today));

    }

【问题讨论】:

  • 这不是对共享首选项的良好使用,而且您的代码过于复杂。共享首选项旨在保持应用程序实例之间的值。相反,请尝试startActivityForResult。 Android 开发者网站有您需要的文档。我建议您放弃尝试解决此问题并以正确的方式重新编写代码。
  • Simon,虽然我很欣赏您的回复,但我试图理解为什么 Shared Preferences 在这种情况下似乎不起作用。这是代码的淡化版本,最后我将在共享首选项中存储两个以上的数据以用于其他操作。
  • 将您的代码移至onStart()。从d1的创建到结束。

标签: android sharedpreferences jodatime


【解决方案1】:

您正在使用每个活动专用的首选项。这意味着您有两组首选项:一组用于 MainActivity,一组用于设置。

这里是相关文档sn-p:

Activity 持久状态是用方法管理的 getPreferences(int),允许您检索和修改一组 与活动关联的名称/值对。使用首选项 在多个应用程序组件(活动、 接收者、服务、提供者),您可以使用底层 Context.getSharedPreferences() 方法来检索首选项对象 以特定名称存储

http://developer.android.com/reference/android/app/Activity.html#getPreferences(int)

您可以使用 getSharedPreferences("MY_PREFERENCES", MODE_PRIVATE) 之类的名称,或者直接调用 PreferenceManager.getDefaultSharedPreferences(Context context) 来获取默认的共享偏好设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多