2017-02-10 199 views
0

我試圖實現一個簡單的登錄應用程序,其中像用戶名和密碼的用戶詳細信息被硬編碼到它使用共享首選項。 當我嘗試啓動應用程序時,即使清除應用程序緩存,它也會顯示一個空白的白色屏幕並烘烤我的評論無限時間。 我應該如何解決它。 請幫幫我!這是我發起活動Android應用程序在啓動時顯示一個白色的空白屏幕

public class MainActivity extends AppCompatActivity { 
BaseClass session; 
EditText userName; 
EditText passWord; 
Button logIn; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); 
    session = new BaseClass(getBaseContext()); 
     // <---- run your one time code here 
     // BaseClass.getApp(); 
     userName = (EditText) findViewById(R.id.etusername); 
     passWord = (EditText) findViewById(R.id.etpassword); 
     logIn = (Button) findViewById(R.id.btnlogin); 
    //toasting line 
     Toast.makeText(getBaseContext(),"User Login Status: "+session.isUserLoggedIn(),Toast.LENGTH_LONG).show(); 
    session.checkLogin(); 
     logIn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       String user = userName.getText().toString().trim(); 
       String pass = passWord.getText().toString().trim(); 
       String userVal = session.pref.getString(KEY_USERNAME, "username"); 
       String passVal = session.pref.getString(KEY_PASSWORD, "password"); 
       // userName.setText(userVal); 
       // passWord.setText(passVal); 
       Toast.makeText(getBaseContext(), "Editfield value:" + user, Toast.LENGTH_LONG).show(); 
       Toast.makeText(getBaseContext(), "Actual username:" + userVal, Toast.LENGTH_LONG).show(); 
       if (user.equals(userVal) && pass.equals(passVal)) { 
        session.createUserLoginSession(userVal, 
          passVal); 
        Intent intent = new Intent(MainActivity.this, QRScanning.class); 
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
        startActivity(intent); 

       } else { 
        Toast.makeText(getApplicationContext(), "Wrong Credentials", Toast.LENGTH_SHORT).show(); 
        userName.setText(""); 
        passWord.setText(""); 
       } 
      } 
     }); 
    } 
} 

答應用程序實例是

public class BaseClass extends Application { 
//private static BaseClass sInstance; 
public static final String PREFER_NAME = "Userdetails"; 
private static final String IS_USER_LOGIN = "IsUserLoggedIn"; 
public static final String KEY_USERNAME = "username"; 
public static final String KEY_PASSWORD = "password"; 
public static final String firstTime = "jjj"; 
public SharedPreferences pref; 
SharedPreferences.Editor editor; 
Context mContext; 
int PRIVATE_MODE = 0; 
@Override 
public void onCreate() { 
    super.onCreate(); 
    BaseClass session = new BaseClass(getApplicationContext()); 
    if (!session.pref.getBoolean(firstTime, false)) { 

     session.editor.putString(KEY_USERNAME, "retailer"); 
     session.editor.putString(KEY_PASSWORD, "beco123"); 

     // mark first time has runned. 
     // SharedPreferences.Editor editor = pref.edit(); 
     session.editor.putBoolean("firstTime", true); 
     session.editor.commit(); 
    } 
} 
public BaseClass(Context context) { 
    this.mContext = context; 
    pref = mContext.getSharedPreferences(PREFER_NAME, PRIVATE_MODE); 
    editor = pref.edit(); 
} 
public BaseClass() { 
} 
//Create login session 
public void createUserLoginSession(String username, String password) { 
    // Storing login value as TRUE 
    editor.putBoolean(IS_USER_LOGIN, true); 

    // Storing username in pref 
    editor.putString(KEY_USERNAME, username); 

    // Storing password in pref 
    editor.putString(KEY_PASSWORD, password); 

    // commit changes 
    editor.commit(); 
} 
public void checkLogin() { 
    // Check login status 
    if (!this.isUserLoggedIn()) { 

     // user is not logged in redirect him to Login Activity 
     Intent i = new Intent(mContext, MainActivity.class); 

     // Closing all the Activities from stack 
     i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

     // Add new Flag to start new Activity 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     // Staring Login Activity 
     mContext.startActivity(i); 
    } 
} 
public void logoutUser() { 

    // Clearing all user data from Shared Preferences 
    editor.clear(); 
    editor.commit(); 
    // After logout redirect user to Login Activity 
    Intent i = new Intent(mContext, MainActivity.class); 
    // Closing all the Activities 
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    // Add new Flag to start new Activity 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    // Staring Login Activity 
    mContext.startActivity(i); 
} 
public boolean isUserLoggedIn() { 
    return pref.getBoolean(IS_USER_LOGIN, false); 
} 

}

+2

您不應該通過手動創建應用程序實例來承擔框架責任。我相信這是主要問題。 – Bracadabra

回答

3

你進入一個循環。

當你調用session.checkLogin()從裏面MainActivityonCreate方法,因爲用戶沒有登錄,您再次MainActivity開始,然後你再次展示麪包和再次打電話session.chechLogin(),等等。

您應該嘗試修復您的代碼流。

希望這有助於

更新

嘗試用這種方式來解決:

變化checkLogin方法是這樣的:

public boolean checkLogin() { 
    // Check login status 
    return(this.isUserLoggedIn()); 
} 

,然後在你的MainActivity類做如下:

public class MainActivity extends AppCompatActivity { 
    BaseClass session; 
    EditText userName; 
    EditText passWord; 
    Button logIn; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     session = new BaseClass(getBaseContext()); 
     if (session.checkLogin()) { 
      Intent intent = new Intent(MainActivity.this, QRScanning.class); 
      startActivity(intent); 
      finish(); 
     } 

     setContentView(R.layout.activity_main); 

     // <---- run your one time code here 
     // BaseClass.getApp(); 
     userName = (EditText) findViewById(R.id.etusername); 
     passWord = (EditText) findViewById(R.id.etpassword); 
     logIn = (Button) findViewById(R.id.btnlogin); 
     //toasting line 
     Toast.makeText(getBaseContext(),"User Login Status: "+session.isUserLoggedIn(),Toast.LENGTH_LONG).show(); 

     logIn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // YOUR CODE TO HANDLE LOGIN HERE 
      } 

     }); 
    } 
} 
+0

我應該如何解決它?我是Android的初學者,請幫助我! – vm345

+0

我會創建一個LoginActivity來執行以下操作:檢查用戶是否已登錄。如果是,則啓動MainActivity並完成()LoginActivity。否則,向用戶顯示執行登錄的佈局(EditText(s)或其他)。在這種情況下,必須將LoginActivity設置爲AndroidManifest.xml中的LAUNCHER活動 –

+0

無法正常工作...! – vm345

0

好了,你的代碼的問題是,你正在檢查,如果用戶在在線登錄: Toast.makeText(getBaseContext(),「用戶LoginStatus:」 + session.isUserLoggedIn(),Toast.LENGTH_LONG )。顯示();

打印錯誤,然後你檢查下一行中的session.checkLogin()。

checkLogin()檢查用戶是否已登錄,並且由於它尚未登錄,它會再次啓動mainActivity,因此在向mainActivity中的用戶顯示任何UI之前,您將再次啓動mainActivity,因此沒有UI被顯示,並且您不斷地打開mainActivity並且吐司一次又一次地顯示。

刪除session.checkLogin(),這將解決您的問題。

相關問題