2017-07-07 54 views
0

我遇到以下问题。 我有下面的代码行:何时在活动中调用findViewById

Spinner domainSpinner = (Spinner) findViewById(R.id.domain); 
domainSpinner.setVisibility(View.VISIBLE); 

这些获得在UI上的菜单项,用户点击后执行。所以我很确定用户界面是在屏幕上绘制的。微调器应该在屏幕上,并且已经填充了数据。 菜单项是更改屏幕的语言。微调者应该用新选择的语言填充项目。

在GooglePlay中,我有时会得到一个错误报告,其中stackTrace在第二行中给出一个NullPointerException。所以它必须是domainSpinner为空。

我从来没有经历过这个问题。我们还使用该应用的测试版本供我们自己使用,而且我的同事们都没有遇到过这个问题。

我不知道为什么findViewById有时应该返回null。我已经试过往回转,旋转......但我从来没有这个问题。

请注意,项目R.id.domain可以通过编程方式设置GONE的可见性。但我也玩过这个,但不能重现这个问题。

代码菜单项行动:

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    int id = item.getItemId(); 
    if (id == R.id.action_nl) 
    { 
     changeLanguage("nl", true); 
     return true; 
    } 
    else if (id == R.id.action_fr) 
    { 
     changeLanguage("fr", true); 
     return true; 
    } 
    else if (id == R.id.action_en) 
    { 
     changeLanguage("en", true); 
     return true; 
    } 
    else if (id == R.id.action_de) 
    { 
     changeLanguage("de", true); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 

}

+0

请在按钮上分享设置onClickListener的代码片段。 –

+0

在“onPause”调用之后是否有可能调用代码段?也许通过一些异步机制。 – DeeV

+0

可能是某种竞赛状况,例如在某些设备中,当调用者视图被调用时,它不会添加到视图树中。 –

回答

1

您应该始终在活动中初始化OnCreate方法的视图,以确保视图在您想要引用时存在。 如下所示:

private Spinner domainSpinner; 

@Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     domainSpinner = (Spinner) findViewById(R.id.domain); 
    } 

让我知道这是否有用!

更新:如果您需要在on create方法之外使用该变量,则声明一个全局变量并在create上初始化它,然后在需要的地方使用它。

+0

我以前读过这个,但我实际上避免这种情况,因为当设备进入睡眠状态并且android清除内存时,成员变量甚至静态变量都会变为null。我自己也看到了这个,如果你的谷歌'android成员变量变为null'或者'android static成为null',你会发现很多其他人有这个问题。 – Knarf

+0

我已经执行了这个安装程序,并将查看它一个星期,看看会发生什么... – Knarf

0

你可以试试这个。确保domainSpinner在主线程上初始化。仅当domainSpinner不等于null时,才添加一个条件来设置可见性。

Handler mainHandler = new Handler(context.getMainLooper()); 
mainHandler.post(new Runnable() { 

    @Override 
    public void run() { 
     Spinner domainSpinner = (Spinner) findViewById(R.id.domain); 
     if(domainSpinner!=null) { 
      domainSpinner.setVisibility(View.VISIBLE); 
     } 
    } 
}); 
相关问题