2017-08-27 389 views
0

我使用共享首选项类来保存登录后用户的信息,以便以后更新我使用的信息保存在共享首选项类中,但当我更新用户信息时,I必须从配置文件注销,然后登录查看更改。任何人都可以帮助我在更新用户信息时如何更改SharedPrefManager类中的信息? Bellow是SharedPrefManager类和用户更新类。在更新用户信息时更新共享首选项

public class SharedPrefManager { 

    private static SharedPrefManager mInstance; 
    private static Context mCtx; 

    private static final String SHARED_PREF_NAME = "mysharedpref"; 
    private static final String KEY_USERNAME = "name"; 
    private static final String KEY_USER_EMAIL = "email"; 
    private static final String KEY_USER_ID = "id"; 
    private static final String KEY_USER_DESCRIPTION = "description"; 


    private SharedPrefManager(Context context) { 
     mCtx = context; 

    } 

    public static synchronized SharedPrefManager getInstance(Context context) { 
     if (mInstance == null) { 
      mInstance = new SharedPrefManager(context); 
     } 
     return mInstance; 
    } 

    public boolean userLogin(int id, String name, String email , String description){ 

     SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 

     editor.putInt(KEY_USER_ID, id); 
     editor.putString(KEY_USERNAME, name); 
     editor.putString(KEY_USER_EMAIL, email); 
     editor.putString(KEY_USER_DESCRIPTION, description); 
     editor.apply(); 

     return true; 
    } 

    public boolean isLoggedIn(){ 
     SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); 
     if(sharedPreferences.getString(KEY_USERNAME, null) != null){ 
      return true; 
     } 
     return false; 
    } 

    public boolean logout(){ 
     SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.clear(); 
     editor.apply(); 
     return true; 
    } 


    public String getUsername(){ 
     SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); 
     return sharedPreferences.getString(KEY_USERNAME, null); 
    } 

    public String getUserEmail(){ 
     SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); 
     return sharedPreferences.getString(KEY_USER_EMAIL, null); 
    } 

    public String getUserDesc(){ 
     SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); 
     return sharedPreferences.getString(KEY_USER_DESCRIPTION, null); 
    } 


} 

这是用户更新类。

public class EditProfile extends AppCompatActivity implements View.OnClickListener { 
    EditText name, description; 
    String email; 
    private ProgressDialog progressDialog; 
    Button update, delete; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_edit_profile); 

     name = (EditText) findViewById(R.id.editText); 
     description = (EditText) findViewById(R.id.editDes); 
     update = (Button) findViewById(R.id.editUpdate); 
     delete = (Button) findViewById(R.id.DeletePro); 
     name.setText(SharedPrefManager.getInstance(this).getUsername()); 
     description.setText(SharedPrefManager.getInstance(this).getUserDesc()); 
     email = SharedPrefManager.getInstance(this).getUserEmail(); 
     progressDialog = new ProgressDialog(this); 
     update.setOnClickListener(this); 
     delete.setOnClickListener(this); 
    } 

    private void updateUser() { 
     final String username = name.getText().toString().trim(); 
     final String desc = description.getText().toString().trim(); 


     if (username == "" || desc.length()>100) { 
      Toast.makeText(getApplicationContext(),"Invalid User Name or Description is exceeding thr limit",Toast.LENGTH_SHORT).show(); 
     } else { 

      progressDialog.setMessage("Updating Information ..."); 
      progressDialog.show(); 
      StringRequest stringRequest = new StringRequest(Request.Method.POST, 
        Constants.URL_updatePro, 
        new Response.Listener<String>() { 
         @Override 
         public void onResponse(String response) { 
          progressDialog.dismiss(); 

          try { 
           JSONObject jsonObject = new JSONObject(response); 

           Toast.makeText(getApplicationContext(), jsonObject.getString("message"), Toast.LENGTH_LONG).show(); 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 
        }, 
        new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          progressDialog.hide(); 
          Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); 
         } 
        }) { 
       @Override 
       protected Map<String, String> getParams() throws AuthFailureError { 
        Map<String, String> params = new HashMap<>(); 
        params.put("name", username); 
        params.put("email", email); 
        params.put("description", desc); 
        return params; 
       } 
      }; 

      RequestHandler.getInstance(this).addToRequestQueue(stringRequest); 
      finish(); 
     } 


    } 

    @Override 
    public void onClick(View v) { 
     if (v == update) { 
      updateUser(); 
     } 
     if (v == delete) 
     { 
      startActivity(new Intent(EditProfile.this, DeleteProfile.class)); 
      finish(); 
     } 
    } 
} 

回答

0

检查此链接:Answered here

我展示了一个人如何实现sharedPrefs,这是相当简单的,更新的喜好和每次重新初始化的活动或片段你的代码应该自动检索无论是时间存储在SharedPrefs中。这意味着,如果您在活动A中更新用户名,则当您加载活动B时,它将获取sharedPrefs并找到此新名称(假设您的getSharedPrefs代码位于片段/活动的onCreate或onResume方法中)。

如果在活动中没有看到sharedPrefs信息更新,则可能是因为活动不刷新(或者因为您没有告诉它,或者因为某些内容已损坏)。您可以尝试向活动添加一个“刷新”按钮来测试此操作,这将重新启动活动,而不是注销/进入 - 与刷新操作相同。

0

我想在这里你得到更新配置文件信息。

@Override 
      protected Map<String, String> getParams() throws AuthFailureError { 
       Map<String, String> params = new HashMap<>(); 
       params.put("name", username); 
       params.put("email", email); 
       params.put("description", desc); 
       name.setText(username); 
       description.setText(desc); 
       return params; 
      } 

希望这将工作

+0

我用它在许多地方,所以只有name.setText也无济于事。 – Tariq

+0

对不起,共享首选项没有自动调用方法。你必须尽你所能去做。 –

+0

似乎是这样,谢谢 – Tariq