我遇到了以下问题。 我有以下几行代码:
Spinner domainSpinner = (Spinner) findViewById(R.id.domain);
domainSpinner.setVisibility(View.VISIBLE);
这些在用户点击UI中的菜单项后执行。所以我很确定UI是在屏幕上绘制的。微调器应该在屏幕上,并且已经填充了数据。 菜单项用于更改屏幕的语言。微调器应该用新选择的语言填充项目。
在GooglePlay中,我有时会收到错误报告,其中stackTrace在第二行中给出了NullPointerException。所以它必须是domainSpinner为空。
我自己从未经历过这个问题。我们也使用该应用程序的beta版本供我们自己使用,我的同事都没有遇到过这个问题。
我不知道为什么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 :(得分: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);
}
请告诉我这是否有帮助!
UPDATE:如果你需要在on create方法之外使用变量,那么声明一个全局变量并在create上初始化它,然后在需要的地方使用它。
答案 1 :(得分: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);
}
}
});