设置AppBar的标题

时间:2016-09-10 10:50:39

标签: android

由于我目前正在处理一个带解析的应用程序,我希望有一个用户列表,如果您点击其中一个名称,则会使用其个人资料启动新活动。启动a活动时,会将parse对象的objectId发送到具有intent的活动。这是我的问题:我希望活动的标题是用户名。我找到了一个解决方案,但有点奇怪。也许有人有更好的解决方案?

这是我的代码(工作正常,但我必须设置标题两次,否则它不起作用):

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);
    }
}

2 个答案:

答案 0 :(得分:2)

您无需设置两次。

查询完成后,username将在done方法中可用。循环外的setTitle行不起作用。移除setTitle后的findInBackground

请参阅此代码。

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

答案 1 :(得分:-1)

您正在async使用parse来电。当进行该调用时,下一行(即设置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);,代码也会一样,但只需设置一次标题即可设置磁贴。