アプリのレイアウトは次のとおりです。
どうすればこれを達成できますか?
ここに私のMainActivityがあります:
@Override
protected void onResume(){
super.onResume();
isLoggedIn = prefs.getBoolean("isLoggedIn", false);
if(!isLoggedIn){
showLoginActivity();
}
}
LoginActivityは次のとおりです。
@Override
protected void onPostExecute(JSONObject json) {
String authorized = "200";
String unauthorized = "401";
String notfound = "404";
String status = new String();
try {
// Get the messages array
JSONObject response = json.getJSONObject("response");
status = response.getString("status");
if(status.equals(authorized)){
Toast.makeText(getApplicationContext(), "You have been logged into the app!",Toast.LENGTH_SHORT).show();
prefs.edit().putBoolean("isLoggedIn",true);
setResult(RESULT_OK, getIntent());
finish();
}
else if (status.equals(unauthorized)){
Toast.makeText(getApplicationContext(), "The username and password you provided are incorrect!",Toast.LENGTH_SHORT).show();
prefs.edit().putBoolean("isLoggedIn",true);
}
else if(status.equals(notfound)){
Toast.makeText(getApplicationContext(), "Not found",Toast.LENGTH_SHORT).show();
prefs.edit().putBoolean("isLoggedIn",true);
}
} catch (JSONException e) {
System.out.println(e);
} catch (NullPointerException e) {
System.out.println(e);
}
}
}
ユーザーが正常にログインした後:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show();
}
}
問題は、onActivityResult()の前にonResume()が呼び出されるため、ユーザーが正常にログインしたときに、onResume()が最初に呼び出されるため、メインアクティビティが通知されないことです。
ログインを促す最適な場所はどこですか?
OnActivityResultの呼び出しは、実際にはonResumeの前に発生します( ドキュメント を参照)。 startActivityForResult
を使用して必要なアクティビティを実際に開始していて、アクティビティに値を返す前に、呼び出されたアクティビティの結果をRESULT_OK
に設定していると確信していますか? Log
にonActivityResult
ステートメントを挿入して、その値を記録し、ヒットすることを確認してください。また、isLoggedIn
設定の値をどこで設定していますか?とにかく戻る前に、ログインアクティビティでtrue
に設定する必要があるようですが、それは明らかに起きていません。
フラグメントでは、onActivityResult()
への呼び出しの前にonResume()
が呼び出されるほど簡単ではありません。戻り先のアクティビティが暫定的に破棄された場合、(たとえば)getActivity()
からonActivityResult()
への呼び出しはnullを返します。ただし、アクティビティが破棄されていない場合、getActivity()
を呼び出すと、含まれているアクティビティが返されます。
この不整合は、診断が困難な欠陥の原因となる可能性がありますが、開発者オプション「アクティビティを保持しない」を有効にすることで、アプリケーションの動作を確認できます。私はこれをオンにしておく傾向があります-本番よりも開発中にNullPointerException
が見たいです。
アクティビティからログイン状態を抽象化することを検討することもできます。たとえば、ユーザーがコメントを投稿できる場合、onPostアクションにログイン状態をpingさせ、アクティビティ状態からではなくそこから移動します。