我正在开发一款应用程序,可以跟踪用户在一天内吃的食物的营养信息。我使用Double数据类型来获取食物本身的营养价值和一天食用的营养价值,这样我就可以更准确地显示信息(例如每100克12.7克/蛋白质,而不是每100克13克/蛋白质) )。为了保存和增加数据,即使用户关闭应用程序,我也使用了SharedPreferences,这非常合适。
然而,我遇到了一个非常奇怪的错误,如果用户第一次安装我的应用程序,一天吃的卡路里量等于30.7,一天吃的脂肪量等于0.4。当我在手机上运行应用程序,将其从我的设备上删除然后使用Android Studio重新安装时,会发生这种情况。我自然希望在安装应用程序时,一天内吃掉的所有营养价值都等于0,因为用户还没有添加任何值。
我的MainActivity包含一个名为DailyIntakeActivity的片段(我知道它不是一个Activity),在调用它时,它的OnCreateView将TextView设置为SharedPreferences给出的Double数据。此时用户还没有向SharedPreferences添加任何值,因此我希望它在所有TextView中显示为0.
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.activity_daily_intake, container, false);
Calories_text = (TextView) rootView.findViewById(R.id.Calories_text);
protein_text = (TextView) rootView.findViewById(R.id.protein_text);
carbs_text = (TextView) rootView.findViewById(R.id.carbs_text);
fats_text = (TextView) rootView.findViewById(R.id.fats_text);
fab = (FloatingActionButton) rootView.findViewById(R.id.fab);
CTX = getContext();
SharedPreferences sharedPreferences = getActivity().getSharedPreferences("MyData", Context.MODE_PRIVATE);
SPCalories = Double.longBitsToDouble(sharedPreferences.getLong("Calories", Double.doubleToLongBits(0)));
SPProtein = Double.longBitsToDouble(sharedPreferences.getLong("Protein", Double.doubleToLongBits(0)));
SPFats = Double.longBitsToDouble(sharedPreferences.getLong("Fats", Double.doubleToLongBits(0)));
SPCarbs = Double.longBitsToDouble(sharedPreferences.getLong("Carbs", Double.doubleToLongBits(0)));
DecimalFormat db = new DecimalFormat("#.#");
db.setRoundingMode(RoundingMode.CEILING);
if (SPCalories != 0) {
dc_text = db.format(SPCalories);
dp_text = db.format(SPProtein);
d_cartext = db.format(SPCarbs);
df_text = db.format(SPFats);
}
else if (SPCalories <= 30.7 && SPCalories > 30.6){
dc_text = Integer.toString(0);
dp_text = Integer.toString(0);
d_cartext = Integer.toString(0);
df_text = Integer.toString(0);
}
Calories_text.setText(String.format(getString(R.string.Calories), dc_text));
protein_text.setText(String.format(getString(R.string.Protein), dp_text));
carbs_text.setText(String.format(getString(R.string.Carbs), d_cartext));
fats_text.setText(String.format(getString(R.string.Fats), df_text));
你可以看到我已经尝试通过告诉程序如果SPCalories小于30.7且大于30.6来解决这个问题,TextViews应该显示数字0,不幸的是这不起作用。
现在,对于上下文,用户向SharedPreferences添加值的方式是打开第二个活动并在EditText中填入数字,然后将这些数字作为Double数据类型保存到SharedPreferences中,然后在DailyIntakeActivity Fragment中读取我的MainActivity。因为即使用户还没有打开活动就会发生错误,因为这个问题已经很长了,我觉得没有必要在这里包含它的代码。
如果您对我有任何建议并祝你有愉快的一天,请告诉我!
维达尔