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