何时在 Activity 中调用 findViewById

2023-12-03

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

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

这些在用户单击 UI 中的菜单项后执行。所以我很确定 UI 是在屏幕上绘制的。旋转器应该出现在屏幕上,并且已经填充了数据。 该菜单项用于更改屏幕语言。旋转器应该填充新选择的语言的项目。

在 GooglePlay 中,我有时会收到错误报告,其中 stackTrace 在第二行给出 NullPointerException。所以肯定是domainSpinner为null。

我自己从未经历过这个问题。此外,我们还使用该应用程序的测试版供自己使用,我的同事都没有遇到过这个问题。

我不知道为什么 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);

}


您应该始终在活动中的 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);
    }

让我知道这是否有帮助!

更新:如果您需要在创建方法之外使用变量,请声明一个全局变量并仍然在创建时初始化它,然后在需要的地方使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时在 Activity 中调用 findViewById 的相关文章

随机推荐