何时在Activity中调用findViewById

时间:2017-07-07 14:03:42

标签: android

我遇到了以下问题。 我有以下几行代码:

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

}

2 个答案:

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