如何更新共享首选项?

时间:2020-07-15 09:15:49

标签: android

我正在收到API的回复,我想更新个人资料。当我单击更新配置文件时。因此,更新的数据不会显示在文本框中。因为我从共享首选项中获取数据。获取数据后,我想在文本字段中显示更新的数据。 因此,我正在尝试实时更新共享首选项。 我可以使用清晰的模型数据解决此问题吗?以及如何?

public class EditProfile extends Fragment implements  Consumes {

@Inject
ViewModelFactorys viewModelFactorys;
Profileviewmodel profileviewmodel;

EditText TVname;
EditText TVemail;
EditText TVmobile;
TextView tvname;
TextView tvemail;
TextView tvdepartment;
Button update;
private Loginmodel loginmodel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_edit_profile, container, false);
    loginmodel = new Gson().fromJson(SharedPref.Getloggeduserdetials(SharedPref.LOGGOEDUSERDATABASE,""), Loginmodel.class);
    Log.d("Login Data", loginmodel.toString());
    profileviewmodel = ViewModelProviders.of(getActivity(), viewModelFactorys).get(Profileviewmodel.class);
    profileviewmodel.apiResponse().observe(this, this::consumeResponsess);

    update = rootView.findViewById(R.id.update);

    TVname = (EditText)rootView.findViewById(R.id.TVname);
    TVemail = (EditText)rootView.findViewById(R.id.TVemail);
    TVmobile = (EditText)rootView.findViewById(R.id.TVmobile);

    tvname = rootView.findViewById(R.id.tv_name);
    tvemail = rootView.findViewById(R.id.tv_email);
    tvdepartment = rootView.findViewById(R.id.tv_type);

    TVname.setText(loginmodel.getName());
    TVemail.setText(loginmodel.getEmail());
    TVmobile.setText(loginmodel.getPhone());

    tvname.setText(loginmodel.getName());
    tvemail.setText(loginmodel.getPhone());
    tvdepartment.setText(loginmodel.getDepartment());

    update.setOnClickListener(view ->{

        if (!TVname.getText().toString().isEmpty()) {
            if (!TVemail.getText().toString().isEmpty()) {
                Utility.showProgressdialog(getContext(), "");
                Log.d("user name",TVname.getText().toString());
               profileviewmodel.updateprofile(TVname.getText().toString().trim(),TVemail.getText().toString().trim(),SharedPref.Gettoken(SharedPref.TOKEN,""),getActivity());
            } else
                Snackbar.make(view, "Please enter Name", Snackbar.LENGTH_LONG).show();
        } else
            Snackbar.make(view, "Please enter email address.", Snackbar.LENGTH_LONG).show();

    });


    return rootView;
}

@Override
public void handleresponse(ApiResponse apiResponse) {


    if (apiResponse.data.getSuccess().equalsIgnoreCase("1")){
        if (apiResponse.data.getData() instanceof Loginmodel) {
            loginmodel = (Loginmodel) apiResponse.data.getData();
            SharedPref.Saveloggeduserdetails(SharedPref.LOGGOEDUSERDATABASE, new Gson().toJson(loginmodel));

        }

    }
}}

public static void Saveloggeduserdetails(String key, String value) {
        SharedPreferences.Editor prefsEditor = mSharedPref.edit();
        prefsEditor.putString(key, value);
        prefsEditor.commit();
    }

3 个答案:

答案 0 :(得分:0)

这样做或您必须使用livedata并在活动中观察它

@Override
public void handleresponse(ApiResponse apiResponse) {


    if (apiResponse.data.getSuccess().equalsIgnoreCase("1")){
        if (apiResponse.data.getData() instanceof Loginmodel) {
            loginmodel = (Loginmodel) apiResponse.data.getData();

              TVname.setText(loginmodel.getName());
              TVemail.setText(loginmodel.getEmail());
              TVmobile.setText(loginmodel.getPhone());

              tvname.setText(loginmodel.getName());
              tvemail.setText(loginmodel.getPhone());
              tvdepartment.setText(loginmodel.getDepartment());
            SharedPref.Saveloggeduserdetails(SharedPref.LOGGOEDUSERDATABASE, new Gson().toJson(loginmodel));

        }

    }
}}

答案 1 :(得分:0)

将设置的文本方法放在一个单独的方法中,而不是像这样的onCreateView:

private void updateScreen() {
    TVname.setText(loginmodel.getName());
    TVemail.setText(loginmodel.getEmail());
    TVmobile.setText(loginmodel.getPhone());

    tvname.setText(loginmodel.getName());
    tvemail.setText(loginmodel.getPhone());
    tvdepartment.setText(loginmodel.getDepartment());
}

然后,当您更新共享的首选项时,调用该方法:

public static void Saveloggeduserdetails(String key, String value) {
   SharedPreferences.Editor prefsEditor = mSharedPref.edit();
   prefsEditor.putString(key, value);
   prefsEditor.commit();
   updateScreen();
}

答案 2 :(得分:0)

可能有多种发生方式。您还没有提供完全如何存储共享首选项的完整代码。例如,“ prefsEditor”可能不正确。取决于您每次访问它的方式。这是一些我用来存储/检索共享首选项的示例代码:

public void setLoginData (String username, String password) {
        SharedPreferences sharedPrefs = getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPrefs.edit();

        editor.putString(PREF_FILE_USERNAME_EXT, username);
        editor.putString(PREF_FILE_PASSWORD_EXT, password);
        editor.apply();
    }

然后

   public String getUsername() {
        return getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE)
                .getString(PREF_FILE_USERNAME_EXT, "");
    }

(另外请注意,如果您使用的是单例,请小心,因为操作系统实际上可能会在您不知情的情况下删除单例的值。对于共享首选项,至少现在至少要像上面一样访问它,以便首先确定是否您的共享首选项正常工作。)

另一个问题可能是您的JSON不正确或不起作用。保存到共享实例之前,请执行一条打印线,以确保您确实在保存内容。 Log.d(“ Login Data”,loginmodel.toString())是什么?打印出您的代码?正确吗?