Java 未保存共享首选项值
我正在开发一个应用程序,用户在共享偏好中输入一个值,然后被检索以减去卡路里的数量 现在,我的卡路里应用程序硬编码为2000。用户每天的消费限额为2000英镑。我希望用户能够更改共享首选项的消费量,但由于某些原因,它没有被保存。这就是我硬编码的原因 PreferenceScreenActivity.javaJava 未保存共享首选项值,java,android,listview,android-fragments,sharedpreferences,Java,Android,Listview,Android Fragments,Sharedpreferences,我正在开发一个应用程序,用户在共享偏好中输入一个值,然后被检索以减去卡路里的数量 现在,我的卡路里应用程序硬编码为2000。用户每天的消费限额为2000英镑。我希望用户能够更改共享首选项的消费量,但由于某些原因,它没有被保存。这就是我硬编码的原因 PreferenceScreenActivity.java public class PreferenceScreenActivity extends Activity { @Override protected void onCrea
public class PreferenceScreenActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_preference);
// Replace the default view with the preference fragment
getFragmentManager().beginTransaction().replace(R.id.preference_container,
new PreferenceScreenFragment()).commit();
}
public static class PreferenceScreenFragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.activity_preference);
}
}
}
activity_preference.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="User Settings">
<EditTextPreference
android:title="Daily Calorie Amount"
android:inputType="number"
android:defaultValue="2000"
android:key="@string/prefs_key_daily_calorie_amount"
android:summary="@string/prefs_description_daily_calorie_amount"
/>
</PreferenceCategory>
</PreferenceScreen>
FragmentHome.JAVA
public class FragmentHome extends DialogFragment
implements View.OnClickListener {
private TextView caloriesTotal;
private TextView caloriesRemain;
private ListView listView;
private LinearLayout mLayout;
ImageButton AddEntrybtn;
CalorieDatabase calorieDB;
Context context;
int goalCalories;
AlarmManager am;
private int CaloriesRemain;
Button mButton;
//Database
private DatabaseHandler dba;
private ArrayList<Food> dbFoods = new ArrayList<>();
private CustomListViewAdapter foodAdapter;
private Food myFood ;
//fragment
private android.support.v4.app.FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
public FragmentHome() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View myView = inflater.inflate(R.layout.fragment_home, container, false);
AddEntrybtn = (ImageButton) myView.findViewById(R.id.AddItems);
AddEntrybtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
((appMain) getActivity()).loadSelection(4);
}
});
caloriesTotal = (TextView) myView.findViewById(R.id.tv_calorie_amount);
caloriesRemain = (TextView) myView.findViewById(R.id.calorieRemain);
listView = (ListView) myView.findViewById(R.id.ListId);
refreshData();
return myView;
}
public void refreshData (){
dbFoods.clear();
dba = new DatabaseHandler(getContext());
ArrayList<Food> foodsFromDB = dba.getFoods();
int totalCalorie = dba.totalCalories();
String formattedCalories = Utils.formatNumber(totalCalorie);
String formattedRemain = Utils.formatNumber( 2000- totalCalorie);
*Hard coded 2000 amount here * *this works and does get 2000 but
want to get the shared value here **
//setting the editTexts:
caloriesTotal.setText("Total Calories: " + formattedCalories);
caloriesRemain.setText(formattedRemain);
CaloriesRemain = loadPrefs(formattedRemain, totalCalorie);
SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(getContext());
PreferenceManager.setDefaultValues(getActivity(),
R.xml.activity_preference, false);
String
etCalorieRemain=prefs.getString("prefs_key_daily_calorie_amount",
"default_edit_text_value");
goalCalories =
Integer.parseInt(prefs.getString("prefs_key_daily_calorie_amount",
"2000"));
//Loop
for (int i = 0; i < foodsFromDB.size(); i ++){
String name = foodsFromDB.get(i).getFoodName();
String date = foodsFromDB.get(i).getRecordDate();
int cal = foodsFromDB.get(i).getCalories();
int foodId = foodsFromDB.get(i).getFoodId();
Log.v("Food Id", String.valueOf(foodId));
myFood= new Food();
myFood.setFoodId(foodId);
myFood.setFoodName(name);
myFood.setCalories(cal);
myFood.setRecordDate(date);
dbFoods.add(myFood);
}
dba.close();
//setting food Adapter:
foodAdapter = new CustomListViewAdapter(getActivity(),
R.layout.row_item,dbFoods);
listView.setAdapter(foodAdapter);
foodAdapter.notifyDataSetChanged();
}
//save prefs
public void savePrefs(String key, int value) {
SharedPreferences sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt(key, value);
editor.apply();
}
//get prefs
public int loadPrefs(String key, int value) {
SharedPreferences sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(getContext());
return sharedPreferences.getInt(key, value);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle username = getActivity().getIntent().getExtras();
String username1 = username.getString("Username");
TextView userMain= (TextView) getView().findViewById(R.id.User);
userMain.setText(username1);
}
@Override
public void onDetach() {
super.onDetach();
startActivity( new Intent(getContext(),MainActivity.class));
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.AddItems:
AddEntry addEntry = new AddEntry();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.FragmentHolder,addEntry)
.commit();
break;
case R.id.action_settings:
Intent preferenceScreenIntent = new Intent(getContext(),
PreferenceScreenActivity.class);
startActivity(preferenceScreenIntent);
break;
}
}
}
公共类FragmentHome扩展了DialogFragment
实现View.OnClickListener{
私有文本视图卡路里总量;
私有文本视图热量管理;
私有列表视图列表视图;
私人线路布局;
图像按钮加法器;
卡雷达酶卡雷达B;
语境;
int goalCalories;
报警管理器am;
私人内特热疗;
钮扣;
//数据库
专用数据库处理程序dba;
private ArrayList dbFoods=new ArrayList();
私有CustomListViewAdapter foodAdapter;
私人食品;
//碎片
私有android.support.v4.app.FragmentManager FragmentManager;
私人碎片交易;
公共家庭(){
//必需的空公共构造函数
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图myView=充气机。充气(R.layout.fragment\u home,container,false);
AddEntrybtn=(ImageButton)myView.findViewById(R.id.AddItems);
AddEntrybtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图arg0){
((appMain)getActivity()).loadSelection(4);
}
});
卡路里总量=(TextView)myView.findViewById(R.id.tv\u卡路里量);
caloriesRemain=(TextView)myView.findViewById(R.id.CalorieMain);
listView=(listView)myView.findViewById(R.id.ListId);
刷新数据();
返回myView;
}
公共数据(){
dbFoods.clear();
dba=newDatabaseHandler(getContext());
ArrayList foodsFromDB=dba.getFoods();
int totalcarrie=dba.totalcarries();
字符串formattedcarries=Utils.formattNumber(总卡路里);
字符串formattedlevel=Utils.formattNumber(2000-总热量);
*此处硬编码的2000金额**这起作用,并得到2000,但
想要在这里获得共享值吗**
//设置编辑文本:
卡路里总量.setText(“总卡路里:+形成的卡路里”);
卡路里残留量(格式化残留量);
卡路里剩余量=装载量(格式化剩余量,总卡路里);
SharedReferences优先权=
getDefaultSharedReferences(getContext());
PreferenceManager.setDefaultValues(getActivity(),
R.xml.activity_preference,false);
一串
etcarorieremain=prefs.getString(“prefs\u key\u daily\u carorie\u amount”,
“默认值(编辑文本值”);
目标成本=
整数.parseInt(prefs.getString(“prefs\u key\u daily\u carorie\u amount”,
"2000"));
//环路
for(int i=0;i
正如我所看到的,您有卡路里释放
变量和savePrefs()
方法,但是