如何在片段中保留变量值,这样当片段再次启动时,值仍然存在?

时间:2017-05-10 10:50:45

标签: android android-fragments

我正在使用导航视图在应用程序的不同部分之间导航,我正在为每个视图使用片段,我正在设置带有片段的传感器代码,并将值存储在变量但每次导航到另一个片段时,步数的值都会丢失并从零开始。当我在不同的片段之间导航时,我希望值保持不变。

import android.app.Fragment;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class HomeFragment extends Fragment implements SensorEventListener {

SensorManager sensorManager;
TextView tv_steps;
boolean running = false;
View myView;

int initialStepCount = 0;
int stepCount = 0;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    myView = inflater.inflate(R.layout.home_layout, container, false);

    // null pointer exception
    // la fragmenta chon view agarrenitawa and make sure null nia

    RelativeLayout rl = (RelativeLayout) inflater.inflate(R.layout.home_layout, container, false);
    tv_steps = (TextView) rl.findViewById(R.id.tv_steps);
    sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);

    return rl;
}

@Override
public void onResume() {
    super.onResume();
    running = true;
    Sensor countSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
    if (countSensor != null) {
        sensorManager.registerListener(this, countSensor, SensorManager.SENSOR_DELAY_FASTEST);
    } else {
    }
}

@Override
public void onPause() {
    super.onPause();
    running = false;
    // unregister
    //sensorManager.unregisterListener(this);
}

@Override
public void onSensorChanged(SensorEvent event) {
    if (initialStepCount == 0) {
        initialStepCount = (int) event.values[0];
    }

    stepCount = (int)event.values[0] - initialStepCount;

    if (running) {
        tv_steps.setText(String.valueOf(stepCount));

    }
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}
}

4 个答案:

答案 0 :(得分:1)

简单解决方案: 将步骤计数变量声明为静态。

高效解决方案: 使用onSaveInstanceState(Bundle)方法保存值,并在下次onCreate(Bundle)方法中检索它。

答案 1 :(得分:0)

您可以使用saveInstance恢复变量值,如果要将该值设置为任何TextView, TextView可以使用freezesText属性保存其状态:

<TextView
    ...
    android:freezesText="true"/>

有关freezesText的文档:https://developer.android.com/reference/android/widget/TextView.html#attr_android:freezesText

答案 2 :(得分:0)

保存您的值:

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putInt(SOME_KEY, someIntValue);
    super.onSaveInstanceState(outState);
}

并像这样恢复它们:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    someIntValue = savedInstanceState.getInt(SOME_KEY)

答案 3 :(得分:0)

您可以使用共享首选项来存储值。

SharedPreferences sharedpreferences=context.getSharedPreferences("MyPrefs", context.MODE_PRIVATE);


    public String getPreference(String name){ 
            Map<String, ?> reader = sharedpreferences.getAll();
            if(reader.get(name).toString()!= null){
                return reader.get(name).toString();
            }
            return null;
        }

        public void setPreference(String name,String value){
            SharedPreferences.Editor editor = sharedpreferences.edit();
            editor.remove(name);
            editor.putString(name,value);
            editor.commit();

        }