2016-09-10 3 views
0

私は現在解析しているアプリケーションで作業していますので、ユーザのリストが必要です。名前の1つをタップすると、そのプロファイルで新しいアクティビティが開始されます。 aアクティビティが起動されると、解析オブジェクトのobjectIdがインテントを持つアクティビティに送信されます。ここに私の問題があります:私は、活動のタイトルをユーザー名にします。私は解決策を見つけましたが、それはやや奇妙です。誰かがより良い解決策を持っているのだろうか?ここで AppBarのタイトルを設定する

は私のコードです(正常に動作しますが、私は二回のタイトルを設定する必要があり、それ以外の場合は動作しません):

public class UserProfileActivity extends AppCompatActivity { 
 

 
    String userId; 
 
    String username; 
 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_user_profile); 
 
     final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
 
     setSupportActionBar(toolbar); 
 

 

 
     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
 
     fab.setOnClickListener(new View.OnClickListener() { 
 
      @Override 
 
      public void onClick(View view) { 
 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
 
         .setAction("Action", null).show(); 
 
      } 
 
     }); 
 

 
     if (getSupportActionBar() != null) { 
 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
 
     } 
 

 
     userId = getIntent().getStringExtra("userId"); 
 

 
     ParseQuery<ParseUser> query = ParseUser.getQuery(); 
 
     query.whereEqualTo("objectId", userId); 
 
     query.setLimit(1); 
 
     query.findInBackground(new FindCallback<ParseUser>() { 
 
      @Override 
 
      public void done(List<ParseUser> objects, ParseException e) { 
 
       if (e == null) { 
 
        if (objects.size() != 0) { 
 
         for (ParseUser user : objects) { 
 
          Log.i("AppInfo", user.getUsername()); 
 
          getSupportActionBar().setTitle(user.getUsername()); 
 
          username = user.getUsername(); 
 
         } 
 
        } 
 
       } 
 
      } 
 
     }); 
 
     getSupportActionBar().setTitle(username); 
 
    } 
 
}

+0

このコードに問題はありますか? –

+0

私はそれを表示するためにタイトルを2回設定する必要があるのだろうと思っています – Dedpul

答えて

2

あなたはそれを2回設定する必要はありません。

usernameは、クエリが完了したときにdoneメソッド内で使用できます。ループ外のsetTitle行は機能しません。 findInBackgroundの後にsetTitleを削除します。

このコードを参照してください。

ParseQuery<ParseUser> query = ParseUser.getQuery(); 
query.whereEqualTo("objectId", userId); 
query.setLimit(1); 
query.findInBackground(new FindCallback<ParseUser>() { 
    @Override 
    public void done(List<ParseUser> objects, ParseException e) { 
     if (e == null) { 
      if (objects.size() != 0) { 
       for (ParseUser user : objects) { 
        Log.i("AppInfo", user.getUsername()); 
        username = user.getUsername(); 
        // adding some null checks 
        if(null != getSupportActionBar() && username != null && !username.equals("")){ 
         getSupportActionBar().setTitle(username); 
        } 
       } 
      } 
     } 
    } 
}); 

getSupportActionBar().setTitle(username); // remove this line 
+0

これは残念なことに動作していないようです。私がこれを好きなら、デフォルトの活動タイトルを表示するだけです。 – Dedpul

+0

エミュレータを再起動しても問題ありません。ありがとうございました! – Dedpul

-1

あなたはparseasync呼び出しを使用しています。その呼び出しが行われると、次の行(すなわち、titleを設定しています)が即座に実行されます。その時、username変数にはnullが含まれています。

そして、解析クエリのコールバックで、タイトルを再度設定しています。実際にこれがあなたのために働いている実際の行です。

query.findInBackground(new FindCallback<ParseUser>() { 
      @Override 
      public void done(List<ParseUser> objects, ParseException e) { 
       if (e == null) { 
        if (objects.size() != 0) { 
         for (ParseUser user : objects) { 
          Log.i("AppInfo", user.getUsername()); 
          getSupportActionBar().setTitle(user.getUsername()); 
          username = user.getUsername(); 
         } 
        } 
       } 
      } 
     }); 

あなたはコールの後、この行getSupportActionBar().setTitle(username);を削除することができ、コードは同じ動作しますが、それは一度だけのタイトルを設定してタイルを設定します。

+0

@downvoter、Care to comment? –

関連する問題