我目前正在开发一个具有配置文件的应用程序,配置文件中的一个选项是“状态”,用户可以从中基本上决定关闭状态或类似的东西。我目前在“个人档案”片段中有一个开关。这是代码:
String Status;
@BindView(R.id.btnAvail)
Switch mySwitch;
@BindView(R.id.statusPenservice)
TextView switchStatus;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile_penservice, container, false);
unbinder = ButterKnife.bind(this, view);
mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
cekStatus(isChecked);
}
});
cekStatus(mySwitch.isChecked());
return view;
}
private void cekStatus(boolean checked) {
if (checked) {status="1";} else {status="0";}
StringRequest request = new StringRequest(
Request.Method.POST,
URL.updateStatus,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject object = new JSONObject(response);
if (status.equals("1")) {
switchStatus.setText("Active");
} else {
switchStatus.setText("Not Active");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (error.getMessage() != null) {
VolleyHandler.handleVolleyError(getContext(), error);
Log.e("Error Switch", error.getMessage());
}
}
}), {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<>();
map.put("id_penservice", new UserSession(getContext()).getIdPenservice());
map.put("is_ready", status);
return map;
}
};
MySingleton.getInstance(getContext()).addToRequestQueue(request);
}
当我返回个人档案片段的通用性并返回此选项活动时,无论用户说什么,该开关的状态都将返回其默认值true。无论如何,我可以解决这个问题吗?谢谢。
答案 0 :(得分:0)
您需要将状态保存在内存中,否则UI会恢复为默认状态。
boolean isActive;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
....
mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
cekStatus(isChecked);
}
});
cekStatus(mySwitch.isChecked());
// personally I would call this method before setting the OnCheckedChangeListener, this way it won't call the web service each time you create the view
...
}
private void cekStatus(boolean checked) {
isActive = checked;
...
@Override
public void onResponse(String response) {
try {
JSONObject object = new JSONObject(response);
switchStatus.setText(isActive ? "Active" : "Not Active");
mySwitch.setChecked(isActive);
} catch (JSONException e) {
e.printStackTrace();
}
}
答案 1 :(得分:0)
您必须将其保存在SharedPreferences实现的SharedPreferences,在线数据库,内部存储或外部存储(SD卡)中。
private SharedPreferences pref;
然后加载
pref = getContext().getSharedPreferences("myAppPref",MODE_PRIVATE);
现在用户何时检查开关
pref.edit().putBoolean("switchChecked",true).commit();
如果未选中
pref.edit().putBoolean("switchChecked",false).commit();
当用户现在重新打开该片段时,您必须从prefs加载该片段,然后再进行一些检查
pref.getBoolean("switchChecked",false);
更多说明
if(pref.getBoolean("switchChecked",false)){
//turn on switch
}
else{
//turn off switch
}
现在,如果值是NULL(未找到),它将返回false(这种情况是他第一次打开配置文件),如果选中了开关,它将返回true,如果不是false则将返回错误
注意:如果用户清除了应用程序数据,此值将丢失,所以这不是完美的方法,在线数据库将是最好的方法。
答案 2 :(得分:0)
Create a sharedPreference and store the state of the switch
答案 3 :(得分:0)
每当您增加布局时,都必须恢复值(开/关)以初始化开关状态。
为此,每当用户翻转开关时,都必须保存开关状态的新值。
保存值的位置取决于所需的行为:
如果只希望在此活动期间记住该值,则可以将其存储在活动类的静态变量中。
如果只希望在应用打开和关闭之间的时间内记住该值,则可以将其存储在应用级别的静态变量中。
如果您希望在用户关闭应用程序后再次打开该应用程序时记住该值,请将其存储在SharedPreferences中。这是常见的情况。
如果您希望即使在卸载/重新安装后仍要记住该值,请将其存储在共享首选项中并设置备份功能。 (不能保证一直工作)。其他选项包括外部数据库等。