我有登录活动并将数据保存到共享偏好数据存储中。
当我打开应用程序然后第一次登录活动加载并填写用户凭据并存储在sharedpreferences中时,打开主要活动,但当我按下主要活动上的按钮时,共享偏好数据丢失。
下次当我打开应用程序时,它显示登录活动而应该打开主要活动,因为我这次从共享偏好中匹配数据。
我的登录活动完整代码
public class Login extends AppCompatActivity implements View.OnClickListener {
private String output;
private Toolbar toolbar;
private Button button;
EditText Username,Password;
String myURL,userValue,passValue;
public static final String DEFAULT="N/A";
List<DataModel> loginList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
Username = (EditText) findViewById(R.id.etUsername);
Password = (EditText) findViewById(R.id.etPassword);
button = (Button) findViewById(R.id.btn_login);
button.setOnClickListener(this);
SharedPreferences sharedPreferences = getSharedPreferences("loginData",this.MODE_PRIVATE);
String user = sharedPreferences.getString("username",DEFAULT);
String pass = sharedPreferences.getString("password",DEFAULT);
if(user.equals(DEFAULT) || pass.equals(DEFAULT) && user==null && pass ==null)
{
Toast.makeText(this,"No Data was found",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this,"Data was found",Toast.LENGTH_LONG).show();
Toast.makeText(this,user+pass,Toast.LENGTH_LONG).show();
CheckOnline();
}
}
private void CheckOnline() {
if(inOnline())
{
String user,pass="";
SharedPreferences sharedPreferences = getSharedPreferences("loginData", this.MODE_PRIVATE);
user = sharedPreferences.getString("username", DEFAULT);
pass = sharedPreferences.getString("password", DEFAULT);
String getStatus = sharedPreferences.getString("LoggedIn", DEFAULT);
if (getStatus.equals("true")) {
Toast.makeText(this, user + pass, Toast.LENGTH_LONG).show();
myURL = "http://www.example.com/extra/login.php?user=" + user + "&pass=" + pass;
requestData(myURL);
}
}
else
{
Toast.makeText(this, "Network isn't available", Toast.LENGTH_LONG).show();
}
}
protected boolean inOnline()
{
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if(netInfo!=null && netInfo.isConnectedOrConnecting())
{
return true;
}
else{
return false;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void requestData(String uri) {
LoginCheck check=new LoginCheck();
check.execute(uri);
}
@Override
public void onClick(View v) {
// startActivity(new Intent(this, MainActivity.class));
if(v.getId()==R.id.btn_login)
{
if(inOnline())
{
userValue = Username.getText().toString();
passValue = Password.getText().toString();
myURL = "http://www.example.com/extra/login.php?user="+userValue+"&pass="+passValue;
requestData(myURL);
}
else
{
Toast.makeText(this, "Network isn't available", Toast.LENGTH_LONG).show();
}
// LoginCheck loginCheck = new LoginCheck();
// loginCheck.execute(new String[]{"http://www.dialerphilippines.com/predictivedialervoip/extra/login.php"});
}
}
protected String updateDisplay()
{
if(loginList != null) {
for(DataModel login : loginList) {
output = (login.getLoginResult() + "\n");
}
}
else{
output = "null hai";
}
return output;
}
@Override
public void onBackPressed() {
Login.this.finish();
}
private class LoginCheck extends AsyncTask<String,String,String>{
ProgressDialog dialog = new ProgressDialog(Login.this);
@Override
protected void onPreExecute() {
dialog.setMessage("Login....");
dialog.show();
}
@Override
protected String doInBackground(String... params) {
String content = null;
try {
content = HttpManager.getData(params[0]);
} catch (IOException e) {
e.printStackTrace();
return null;
}
return content;
}
@Override
protected void onPostExecute(String result) {
// loginList = JSONParser.parseLogin(result);
// String my = StringUtils.deleteWhitespace
// startActivity(new Intent(this, MainActivity.class));
String strWithoutWhiteSpace = result.trim();
// Integer res = Integer.parseInt(strWithoutWhiteSpace);
if(strWithoutWhiteSpace.equals("success")) {
SharedPreferences sharedPreferences = getSharedPreferences("loginData",MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("username",userValue);
editor.putString("password", passValue);
editor.putString("LoggedIn", "true");
editor.commit();
startActivity(new Intent(Login.this, MainActivity.class));
finish();
}
else{
Toast.makeText(Login.this, "Either Username or Password is not correct", Toast.LENGTH_SHORT).show();
}
dialog.dismiss();
}
}
}
答案 0 :(得分:1)
在共享Prefrences中插入数据
SharedPreferences.Editor editor = getSharedPreferences(FILE_NAME, MODE_PRIVATE).edit();
editor.putString("name", "John");
editor.putInt("fName", "ALEX");
editor.commit();
从存储的共享权限中恢复数据
SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
String name = prefs.getString("name", "default_value");
String fName= prefs.getInt("fName", "default_value");
答案 1 :(得分:0)
您可以创建另一个共享首选项值,该值包含Isloggedin的条件是否为true,并使用此值重定向您的活动。
String getStatus = pref.getString("LoggedIn", "nil");
if (getStatus.equals("true")) {
// go to main or wherever your want.
startActivity(new Intent(this, MYActivity.class));
} else {
// TO DO - go to login page
}
登录验证后,您正在更新共享偏好设置或&#34;放置&#34;你登录的价值观;更新你的isloggedin偏好。
editor.putString("LoggedIn", "true");
editor.commit();
还可以通过覆盖onbackpressed来控制您的反向事件。
@Override
public void onBackPressed() {
// TO DO
}
Providing Proper Back Navigation
修改强>
在您提供其他信息后:
1.我不确定你在onbackpressed事件中的活动是如何有用的。最好将您的活动重定向到其他地方,而不是完成活动。这对我来说没有意义。例如
@Override
public void onBackPressed() {
// TO DO
startActivity(new Intent(this, SomeActivityIWantTheUserToGoto.class));
}
另外,我无法看到你从哪里获得字符串结果。
除此之外。我建议你实施我的建议。完全,回顾你的字符串结果。这个问题正在增长,并且有一个时间点,我无法继续参加 感谢。
<强> EDIT2 强>
我建议您记录postexecute中的结果。实际检查结果是什么。