2016-06-14 74 views
3

我做了一個應用程序,要求用戶註冊。第一次用戶打開應用程序 - 登錄屏幕打開。他們需要點擊「去註冊」按鈕去註冊活動。他們註冊後,他們自動登錄。回來後按登錄屏幕後登錄

現在這是問題 - 當用戶第一次註冊時,他被髮送到MainActivity。他應該壓回來,應用程序應該關閉。但是當他試圖退出應用程序時,他會按下後退按鈕,而不是關閉應用程序,然後返回到登錄屏幕。 下次嘗試登錄時,我沒有任何問題 - 直接進入MainActivity。

這是我的活動怎麼看這樣的:

LoginActivity:

public class LoginActivity extends AppCompatActivity { 
private static final String TAG = "LoginActivity"; 
private static final int REQUEST_REGISTER = 0; 

@InjectView(R.id.input_email) EditText _emailText; 
@InjectView(R.id.input_password) EditText _passwordText; 
@InjectView(R.id.btn_login) Button _loginButton; 
@InjectView(R.id.link_register) TextView _registerLink; 

CheckBox checkBoxShowPassword; 

private SessionManager session; 
private SQLiteHandler db; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
    ButterKnife.inject(this); 

    // SQLite database handler 
    db = new SQLiteHandler(getApplicationContext()); 
    // Session manager 
    session = new SessionManager(getApplicationContext()); 
    // Check if user is already logged in or not 
    if (session.isLoggedIn()) { 
     // User is already logged in. Take him to main activity 
     Intent intent = new Intent(LoginActivity.this, MainActivity.class); 
     startActivity(intent); 
     finish(); 
    } 

    _loginButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      String email = _emailText.getText().toString().trim(); 
      String password = _passwordText.getText().toString().trim(); 

      if (!email.isEmpty() && !password.isEmpty()) { 
       // login user 
       login(email, password); 
      } else { 
       // Prompt user to enter credentials 
       Toast.makeText(getApplicationContext(), 
         "Please enter the credentials!", Toast.LENGTH_LONG) 
         .show(); 
      } 
     } 
    }); 

    //  Go to register screen 
    _registerLink.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // Start the Register activity 
      Intent intent = new Intent(getApplicationContext(), RegisterActivity.class); 
      startActivityForResult(intent, REQUEST_REGISTER); 
     } 
    }); 

    //  Password checkbox 
    checkBoxShowPassword = (CheckBox) findViewById(R.id.checkBoxShowPassword); 
    checkBoxShowPassword.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // checkbox status is changed from uncheck to checked. 
      if (!isChecked) { 
       // show password 
       _passwordText.setTransformationMethod(PasswordTransformationMethod.getInstance()); 
      } else { 
       // hide password 
       _passwordText.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 
      } 
     } 
    }); 
} 

// Login 
public void login(final String email, final String password) { 
    Log.d(TAG, "Login"); 

    if (!validate()) { 
     onLoginFailed(); 
     return; 
    } 

    //  Change to false for disabling after error 
    _loginButton.setEnabled(true); 

    String tag_string_req = "req_login"; 

    final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this, 
      R.style.AppTheme_Dark_Dialog); 
    progressDialog.setIndeterminate(true); 
    progressDialog.setMessage("Authenticating..."); 
    progressDialog.show(); 

    // TODO: Implementing authentication logic 

    StringRequest strReq = new StringRequest(Request.Method.POST, 
      AppConfig.URL_LOGIN, new Response.Listener<String>() { 

     @Override 
     public void onResponse(String response) { 
      Log.d(TAG, "Login Response: " + response.toString()); 
      progressDialog.dismiss(); 

      try { 
       JSONObject jObj = new JSONObject(response); 
       boolean error = jObj.getBoolean("error"); 

       // Check for error node in json 
       if (!error) { 
        // user successfully logged in 
        // Create login session 
        session.setLogin(true); 

        // Now store the user in SQLite 
        String uid = jObj.getString("uid"); 

        JSONObject user = jObj.getJSONObject("user"); 
        String name = user.getString("name"); 
        String email = user.getString("email"); 
        String created_at = user 
          .getString("created_at"); 

        // Inserting row in users table 
        db.addUser(name, email, uid, created_at); 

        // Launch main activity 
        Intent intent = new Intent(LoginActivity.this, 
          MainActivity.class); 
        startActivity(intent); 
        finish(); 
       } else { 
        // Error in login. Get the error message 
        String errorMsg = jObj.getString("error_msg"); 
        Toast.makeText(getApplicationContext(), 
          errorMsg, Toast.LENGTH_LONG).show(); 
       } 
      } catch (JSONException e) { 
       // JSON error 
       e.printStackTrace(); 
       Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 

     } 
    }, new Response.ErrorListener() { 

     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.e(TAG, "Login Error: " + error.getMessage()); 

      Toast toast = Toast.makeText(getApplicationContext(), 
        "Registration failed due to connectivity issues", Toast.LENGTH_LONG); 
      toast.setGravity(Gravity.CENTER, 0, 0); 
      toast.show(); 
    //    _loginButton.setEnabled(true); 
      progressDialog.dismiss(); 

     } 
    }) { 

     @Override 
     protected Map<String, String> getParams() { 
      // Posting parameters to login url 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("email", email); 
      params.put("password", password); 

      return params; 
     } 

    }; 

    // Adding request to request queue 
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req); 


@Override 
public void onBackPressed() { 
    // disable going back to the MainActivity 
    moveTaskToBack(true); 
} 

public void onLoginSuccess() { 
    _loginButton.setEnabled(true); 
    finish(); 
} 

public void onLoginFailed() { 
    Toast.makeText(getBaseContext(), "Login failed", Toast.LENGTH_LONG).show(); 

    _loginButton.setEnabled(true); 
} 

// Validation 
public boolean validate() { 
    boolean valid = true; 

    String email = _emailText.getText().toString(); 
    String password = _passwordText.getText().toString(); 

    if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) { 
     _emailText.setError("Enter a valid email address"); 
     valid = false; 
    } else { 
     _emailText.setError(null); 
    } 

    if (password.isEmpty() || password.length() < 4 || password.length() > 20) { 
     _passwordText.setError("Enter between 4 and 20 alphanumeric characters"); 
     valid = false; 
    } else { 
     _passwordText.setError(null); 
    } 

    return valid; 
} 
} 

RegisterActivity

public class RegisterActivity extends AppCompatActivity { 
private static final String TAG = "RegisterActivity"; 

@InjectView(R.id.input_name) EditText _nameText; 
@InjectView(R.id.input_email) EditText _emailText; 
@InjectView(R.id.input_password) EditText _passwordText; 
@InjectView(R.id.btn_register) Button _registerButton; 
@InjectView(R.id.link_login) TextView _loginLink; 

CheckBox checkBoxShowPassword; 

private SessionManager session; 
private SQLiteHandler db; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_register); 
    ButterKnife.inject(this); 

    // Session manager 
    session = new SessionManager(getApplicationContext()); 
    // SQLite database handler 
    db = new SQLiteHandler(getApplicationContext()); 
    // Check if user is already logged in or not 
    if (session.isLoggedIn()) { 
     // User is already logged in. Take him to main activity 
     Intent intent = new Intent(RegisterActivity.this, 
       MainActivity.class); 
     startActivity(intent); 
     finish(); 
    } 

    //  Register button 
    _registerButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String name = _nameText.getText().toString().trim(); 
      String email = _emailText.getText().toString().trim(); 
      String password = _passwordText.getText().toString().trim(); 
      String phone = getMyPhoneNumber(); 

      if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) { 
       register(name, email, password, phone); 
      } else { 
       Toast.makeText(getApplicationContext(), 
         "Please enter your details!", Toast.LENGTH_LONG) 
         .show(); 
      } 
     } 
    }); 

    //  Go to login screen 
    _loginLink.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Finish the registration screen and return to the Login activity 
      finish(); 
     } 
    }); 

    //  Password checkbox 
    checkBoxShowPassword = (CheckBox) findViewById(R.id.checkBoxShowPassword); 
    checkBoxShowPassword.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // checkbox status is changed from uncheck to checked. 
      if (!isChecked) { 
       // show password 
       _passwordText.setTransformationMethod(PasswordTransformationMethod.getInstance()); 
      } else { 
       // hide password 
       _passwordText.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 
      } 
     } 
    }); 
} 

    // Register 
public void register(final String name, final String email, final String password, final String phone) { 
    Log.d(TAG, "Register"); 

    if (!validate()) { 
     onRegisterFailed(); 
     return; 
    } 

    _registerButton.setEnabled(false); 

    String tag_string_req = "req_register"; 

    final ProgressDialog progressDialog = new ProgressDialog(RegisterActivity.this, 
      R.style.AppTheme_Dark_Dialog); 
    progressDialog.setIndeterminate(true); 
    progressDialog.setMessage("Creating Account..."); 
    progressDialog.show(); 

    // TODO: Implementing register logic 
    StringRequest strReq = new StringRequest(Request.Method.POST, 
      AppConfig.URL_REGISTER, new Response.Listener<String>() { 

     @Override 
     public void onResponse(String response) { 
      Log.d(TAG, "Register Response: " + response.toString()); 
      progressDialog.dismiss(); 

      try { 
       JSONObject jObj = new JSONObject(response); 
       boolean error = jObj.getBoolean("error"); 
       if (!error) { 
        // User successfully stored in MySQL 
        // Now store the user in sqlite 
        String uid = jObj.getString("uid"); 

        JSONObject user = jObj.getJSONObject("user"); 
        String name = user.getString("name"); 
        String email = user.getString("email"); 
        String created_at = user 
          .getString("created_at"); 

        // Inserting row in users table 
        db.addUser(name, email, uid, created_at); 

        //TODO: insert contacts to local db 
        String[] PROJECTION = new String[] { 
          ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
          ContactsContract.CommonDataKinds.Phone.NUMBER 
        }; 

        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION, null, null, null); 
        while (phones.moveToNext()) { 
         if (phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) != -1) 
         { 
          String username = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
          String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

          db.addContact(username, phoneNumber); 
         } 
        } 
        phones.close(); 

        Toast.makeText(getApplicationContext(), "Registration successful!", Toast.LENGTH_LONG).show(); 

    //      Auto login 
        session.setLogin(true); 

        // Launch login activity 
        Intent intent = new Intent(
          RegisterActivity.this, 
          MainActivity.class); 
        startActivity(intent); 
        finish(); 
       } else { 

        // Error occurred in registration. Get the error 
        // message 
        String errorMsg = jObj.getString("error_msg"); 
        Toast.makeText(getApplicationContext(), 
          errorMsg, Toast.LENGTH_LONG).show(); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

     } 
    }, new Response.ErrorListener() { 

     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.e(TAG, "Registration Error: " + error.getMessage()); 
      Toast toast = Toast.makeText(getApplicationContext(), 
        "Registration failed due to connectivity issues", Toast.LENGTH_LONG); 
      toast.setGravity(Gravity.CENTER, 0, 0); 
      toast.show(); 
      _registerButton.setEnabled(true); 
      progressDialog.dismiss(); 
     } 
    }) { 

     @Override 
     protected Map<String, String> getParams() { 
      // Posting params to register url 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("name", name); 
      params.put("email", email); 
      params.put("password", password); 
      params.put("phone", phone); 

      return params; 
     } 

    }; 

    // Adding request to request queue 
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req); 

} 

public void onRegisterSuccess() { 
    _registerButton.setEnabled(true); 
    setResult(RESULT_OK, null); 
    finish(); 
} 

public void onRegisterFailed() { 
    Toast.makeText(getBaseContext(), "Registration failed", Toast.LENGTH_LONG).show(); 

    _registerButton.setEnabled(true); 
} 

    // Validation 
public boolean validate() { 
    boolean valid = true; 

    String name = _nameText.getText().toString(); 
    String email = _emailText.getText().toString(); 
    String password = _passwordText.getText().toString(); 

    if (name.isEmpty() || name.length() < 3) { 
     _nameText.setError("Enter at least 3 characters"); 
     valid = false; 
    } else { 
     _nameText.setError(null); 
    } 

    if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) { 
     _emailText.setError("Enter a valid email address"); 
     valid = false; 
    } else { 
     _emailText.setError(null); 
    } 

    if (password.isEmpty() || password.length() < 4 || password.length() > 20) { 
     _passwordText.setError("Enter between 4 and 20 alphanumeric characters"); 
     valid = false; 
    } else { 
     _passwordText.setError(null); 
    } 

    return valid; 
} 

// Get users phone number 
private String getMyPhoneNumber() { 
    TelephonyManager tMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    String MyPhoneNumber = "0000000000"; 

    try 
    { 
     MyPhoneNumber =tMgr.getLine1Number(); 
    } 
    catch(NullPointerException ex) 
    { 
    } 

    if(MyPhoneNumber.equals("")){ 
     MyPhoneNumber = tMgr.getSubscriberId(); 
    } 

    return MyPhoneNumber; 
} 

private String getMy10DigitPhoneNumber() { 
    String s = getMyPhoneNumber(); 
    return s.substring(2); 
} 
} 
+0

請解釋這句話在更多的細節:「當用戶按下後退按鈕,他們被送回登錄屏幕,而不是應用程序關閉的下。」 – Alex

+1

完成註冊活動,同時繼續使用'完成()' –

+0

@SohailZahid我試過這個,但我得到了同樣的問題。 – Kemo

回答

1

按我的想法,你只需要做一兩件事,當你從登錄活動傳遞給register_activity剛剛完成login_activity這樣

//  Go to register screen 
     _registerLink.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // Start the Register activity 
       Intent intent = new Intent(getApplicationContext(), RegisterActivity.class); 
       startActivityForResult(intent, REQUEST_REGISTER); 
       LoginActivity.this.finish(); 
      } 
     }); 

如果仍然面臨着同樣的問題,那麼,當你打開login_activity第一然後創建該類的一個變量和值分配給該變量這樣

public static LoginActivity mLogin_activity; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mLogin_activity=LoginActivity.this; 

然後檢查該值是空值或沒有在Main_ActivityonBackPressed()方法如果該值是空值,則網絡否則main_activity也會完成login_activity;事情是這樣的:

@Override 
     public void onBackPressed() { 
      super.onBackPressed(); 
      if (LoginActivity.mLogin_activity!=null) { 
       LoginActivity.mLogin_activity.finish(); 
       MainActivity.this.finish(); 
      }else { 
       MainActivity.this.finish(); 
      } 
     } 

希望我已經回答了你的問題......

+0

我第一次嘗試添加LoginActivity.this.finish(); ,但是當用戶試圖在沒有互聯網連接的情況下登錄,然後嘗試按下後退按鈕時,他能夠打開mainActivity而不是關閉應用程序。然後我嘗試這樣做,但我得到了以下錯誤:public static LoginActivity mLogin_activity = LoginActivity.this;無法從靜態上下文中引用 – Kemo

+1

對於遲到響應感到抱歉,但是在login_activity中執行一項操作,將覆蓋方法設置爲onBackPressed(){}並完成想要完成的類,然後它就會工作。我想..並檢查您的manifesto.xml也是您首先打開哪個類。 –

+0

比你的迴應。我正在考慮在註冊活動中重寫onbackpressed,但是如果他不想註冊,我恐怕會禁用用戶返回登錄:)我沒有時間去嘗試這個,但是我希望本週末放假。 應用程序打開的第一項活動是登錄活動,該活動具有用於註冊活動的按鈕。 – Kemo

1

當你寫

Intent intent = new Intent(getApplicationContext(), RegisterActivity.class); 
startActivityForResult(intent, REQUEST_REGISTER); 

這必須需要重寫onAct ivityResult方法來處理該結果。

在該代碼中你只寫

Intent intent = new Intent(getApplicationContext(), RegisterActivity.class); 
startActivity(intent); 
finish(); 

我希望這可以幫助你。

+0

試過,但我得到同樣的問題 - 它回到登錄屏幕。 – Kemo

+1

試試這個Intent intent = new Intent(LoginActivity.this,RegisterActivity.class); –

+0

Panavala我現在有一個不同的問題 - 當我嘗試註冊時(我正在測試沒有互聯網連接的錯誤),我得到我的自定義消息,沒有互聯網連接。這很好,但是當我嘗試按下按鈕關閉應用程序時,主要活動即會打開。 – Kemo