【问题标题】:How to save chronometer time and retrieve it in another activity using sharedpreferences如何使用 sharedpreferences 保存计时器时间并在另一个活动中检索它
【发布时间】:2019-11-09 07:57:08
【问题描述】:

我在 Mainactivity.java 有一个计时器@ 允许它在后台运行,但它失败了,因为它不能将变量传递给另一个活动,人们建议使用 SharedPreferences 会更容易。那么有谁知道如何节省开始时间并在另一个活动中获得价值?这是代码。

MainActivity.java

public class MainActivity extends AppCompatActivity{
private Chronometer chronometer;
protected FirebaseAuth firebaseauth = FirebaseAuth.getInstance();

 @Override
      protected void onStart(){
        super.onStart();
          chronometer.setBase(SystemClock.elapsedRealtime());
          final long startTime = (SystemClock.elapsedRealtime() - chronometer.getBase());
          final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
          final SharedPreferences.Editor editor = pref.edit();   
              @Override
              public void onDataChange (DataSnapshot dataSnapshot){
                    String status = dataSnapshot.getValue(String.class);

                   if (status.equals ("occupied")) {

                        chronometer.start();
                        editor.putLong("time",startTime);
                       editor.commit();

                   }
                   else
                       mValueView1.setBackgroundColor(Color.parseColor("#66d983"));

              }
              @Override
              public void onCancelled (DatabaseError databaseError){

              }

          });

SecondActivity.java

@Override
    protected void onStart() {
        super.onStart();

        final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
        mChildReference1.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String status = dataSnapshot.getValue(String.class);
                // firebase status is occupied start chronometer
                if(status.equals("occupied")) {
                   savedTime = pref.getLong("time",01);

                    chronometer.setBase(savedTime);
                    chronometer.getBase();
                    chronometer.setVisibility(View.VISIBLE);


                }

                if(!status.equals("occupied")){
                        chronometer.setBase(SystemClock.elapsedRealtime());
                        pauseOffset = 0;
                        chronometer.stop();

                    }
                }


            @Override
            public void onCancelled(DatabaseError databaseError) {

            }

        });
    }

【问题讨论】:

    标签: java android sharedpreferences chronometer


    【解决方案1】:

    如果您仅在一项活动中使用 sharedpreference ,则可以在您的活动中使用 getDefaultSharedPreferences() 或 getPreferences() 方法。但在您的情况下(如文档中所述)将一个 sharedPreference 用于多个活动,您应该为共享首选项分配一个名称。
    这样,活动就知道要获取您的哪些共享偏好。只需在您的代码中更改它

    SharedPreferences pref = getSharedPreferences("chornometer", Context.MODE_PRIVATE);
    

    更多信息请阅读documentation

    【讨论】:

    • 所以我只需要将getDefaultSharedPreferences() 改成这个?
    • 是的,在两个activity中,sharedpreference的名字必须相同
    • 但我仍然无法从MainActivity 获取开始时间,计时器仍然从第二个活动中的0:00 开始
    • 那是因为你从 chornometer.getBase() 得到 startTime 并且是 0:00
    • 我已将主要活动中的 startTime 编辑为 (SystemClock.elapsedRealtime() - chronometer.getBase());,但第二个活动中的计时器仍保持为零,但是当我添加一个文本视图以检查该值是否实际上从主要活动传递到第二个活动时,确实如此。所以我真的不知道为什么它在精密时计方面不起作用。我已经更新了代码,你可以看看吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多