改变开关位置

时间:2018-08-22 13:21:34

标签: android

我目前正在开发一个具有配置文件的应用程序,配置文件中的一个选项是“状态”,用户可以从中基本上决定关闭状态或类似的东西。我目前在“个人档案”片段中有一个开关。这是代码:

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。无论如何,我可以解决这个问题吗?谢谢。

4 个答案:

答案 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中。这是常见的情况。

  • 如果您希望即使在卸载/重新安装后仍要记住该值,请将其存储在共享首选项中并设置备份功能。 (不能保证一直工作)。其他选项包括外部数据库等。