Java 将改装响应设置到NavigationDrawer标题中

Java 将改装响应设置到NavigationDrawer标题中,java,android,navigation-drawer,retrofit2,Java,Android,Navigation Drawer,Retrofit2,这是Android Studio使用我的方法initAccount()生成的标准代码,在这里我获取用户模型并将其写入myAccount变量。当我执行Snackbar或其他操作时,数据是存在的,但当我想将用户数据写入导航标题时,会出现一个错误: java.lang.RuntimeException:无法启动活动 ComponentInfo{com.vegevgsdsfa/com.sgdbsdg.activities.MainActivity}: java.lang.NullPointerExcep

这是Android Studio使用我的方法initAccount()生成的标准代码,在这里我获取用户模型并将其写入myAccount变量。当我执行Snackbar或其他操作时,数据是存在的,但当我想将用户数据写入导航标题时,会出现一个错误:

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.vegevgsdsfa/com.sgdbsdg.activities.MainActivity}: java.lang.NullPointerException:尝试调用虚拟方法 'java.lang.String com.nfjg;拉赫吉;上的glsg.models.User.get昵称() 空对象引用

它是line
nick.setText(myAccount.get昵称())

public类MainActivity扩展了AppCompatActivity
实现NavigationView.OnNavigationItemSelectedListener{
ApiCaller用户信息;
用户myAccount;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initAccount();
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Snackbar.make(查看“替换为您自己的操作”,Snackbar.LENGTH\u LONG)
.setAction(“Action”,null).show();
}
});
抽屉布局抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
ActionBarDrawerToggle切换=新建ActionBarDrawerToggle(
这,抽屉,工具栏,R.string.navigation\u drawer\u open,R.string.navigation\u drawer\u close);
抽屉。添加抽屉链接器(切换);
toggle.syncState();
NavigationView NavigationView=(NavigationView)findViewById(R.id.nav_视图);
navigationView.setNavigationItemSelectedListener(此);
视图头视图=导航视图。充气头视图(右布局。导航头视图);
TextView nick=(TextView)headerView.findViewById(R.id.txt_昵称);
nick.setText(myAccount.get昵称());
}
@凌驾
public void onBackPressed(){
抽屉布局抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
if(抽屉isDrawerOpen(重力压缩机启动)){
抽屉。关闭抽屉(重力压缩机启动);
}否则{
super.onBackPressed();
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
@SuppressWarnings(“StatementWithEmptyBody”)
@凌驾
公共布尔值onNavigationItemSelected(MenuItem项){
//处理导航视图项单击此处。
int id=item.getItemId();
if(id==R.id.nav_摄像机){
//处理相机的动作
}否则如果(id==R.id.nav_画廊){
}else if(id==R.id.nav_幻灯片){
}else if(id==R.id.nav_manage){
}else if(id==R.id.nav_共享){
}else if(id==R.id.nav_send){
}
抽屉布局抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
抽屉。关闭抽屉(重力压缩机启动);
返回true;
}
私人帐户(){
userInfo=Core.buildInterceptCaller();
Call Call=userInfo.showcount();
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
myAccount=response.body();
}否则
Snackbar.make(getCurrentFocus(),response.code(),Snackbar.LENGTH\u LONG.show();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});
}
}

我是新手,我不明白问题出在哪里。感谢您的关注。

在调用改装的onResponse后,您应该在响应到达后设置昵称。但现在您正在onCreate中设置nick name意味着改装尚未完成其工作,但您正在尝试设置昵称。因此,它在setnickname中返回null

private void initAccount() {
    userInfo = Core.buildInterceptCaller();
    Call<User> call = userInfo.showAccount();
    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            if (response.isSuccessful()) {
                myAccount = response.body();
                nickname.setText(myAccount.getNickName); //Nickname global
            } else
                Snackbar.make(getCurrentFocus(), response.code(), Snackbar.LENGTH_LONG).show();
        }

        @Override
        public void onFailure(Call<User> call, Throwable t) {

        }
    });
}
private void initAccount(){
userInfo=Core.buildInterceptCaller();
Call Call=userInfo.showcount();
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
myAccount=response.body();
昵称.setText(myAccount.get昵称);//昵称全局
}否则
Snackbar.make(getCurrentFocus(),response.code(),Snackbar.LENGTH\u LONG.show();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});
}

这意味着视图的初始化必须在initAccount()中执行?当然可以。我确实更新了我的答案。使昵称文本视图成为全局视图。您可以尝试使用butterknife获取视图id。我会很简单。不需要findViewByID。这是额外的建议D
private void initAccount() {
    userInfo = Core.buildInterceptCaller();
    Call<User> call = userInfo.showAccount();
    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            if (response.isSuccessful()) {
                myAccount = response.body();
                nickname.setText(myAccount.getNickName); //Nickname global
            } else
                Snackbar.make(getCurrentFocus(), response.code(), Snackbar.LENGTH_LONG).show();
        }

        @Override
        public void onFailure(Call<User> call, Throwable t) {

        }
    });
}