当前位置: 首页 > 知识库问答 >
问题:

为什么findViewById()方法只能在activity类的方法中工作,而不能直接在类中工作?

赵灼光
2023-03-14
public class MainActivity extends AppCompatActivity {

       TextView name_header;

       //this results into an error
       name_header = (TextView) findViewById(R.id.name_header);

       @Override
       protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.menu_order);

       //whereas, this works perfectly
       name_header = (TextView) findViewById(R.id.name_header);
...
 }
}

问题是,我试图使用findViewById()全局初始化TextView对象,但它在运行时抛出一个错误,然后,如果我在onCreate()或任何其他方法中使用它,初始化工作就会很好。

我正在为API级别22及以上开发

共有1个答案

邢承弼
2023-03-14

在setContentView(...)之前onCreate(...)中的函数已调用,则布局(-file)尚未膨胀/设置。所以现在还没有什么可以查id的。

正如Android文档所描述的:

公共T findViewById(int id)

查找由onCreate(Bundle)中处理的android:id XML属性标识的视图。

但是由于您已经“全局”声明了您的TextView,您可以在onCreate函数中初始化它,并在MainActivity的任何其他地方使用它,而不会有任何问题。

 类似资料:
  • 为什么这段代码中不允许函数?

  • 问题内容: 我了解抽象类中的方法都可以是抽象的,也可以不是。但是,为什么不能在“普通”的非抽象类中创建抽象方法呢? 在此先感谢您的解释! 问题答案: 抽象 方法从根本上说,该方法没有实现,需要在 子类中 实现。但是,如果您在 非抽象 类中具有 抽象 方法,则可以实例化该类并获取一个对象,该对象将具有未实现的方法,您将无法调用该方法。 __

  • 我试图在一个变量中保存得分为80分或80分以上的学生的姓名,但我无法使用filter进行保存,它返回整个对象,尽管我指定只打印这些对象的键值,即这些学生的姓名。 我的代码: 我怎样才能得到得分在80分以上的学生的名字?

  • 问题内容: 作为Android新手开发人员,我遇到了一个奇怪的问题。我想创建一个类,该类可以使用其他方法以任何特殊方式使用其他类- 活动。为了简单起见,我们将记录一些东西。如果我在一个活动中进行跟踪(例如在OnClick侦听器中),则一切正常: 但是,当我尝试将其封装到某个类中并像这样创建单例时: 并从其他活动中调用它 NullPointerException(与openFileOutput一致)

  • 问题内容: 从上一个私有方法春天在什么@Transactional属性的工作? 使用代理时,应仅将@Transactional注释应用于具有公共可见性的方法。如果使用@Transactional注释对受保护的,私有的或程序包可见的方法进行注释,则不会引发任何错误,但是带注释的方法不会显示已配置的事务设置。 我可以想到排除和方法的充分理由,但是为什么方法不能在事务上表现呢?以下堆栈跟踪显示了公共方法

  • 我可以想出排除和方法的充分理由,但为什么方法不会以事务性方式运行呢?以下stacktrace显示了公共方法(通过接口代理调用)的正确行为: 当调用一个“完全相同”的受保护方法(通过非接口CGLIB代理)时,我们得到如下结果: 这显然是一个设计决定(为什么?),但我认为它很值得怀疑的是,当它显然是开发人员的错误时,它却无声无息地失败了。 编辑这显然不是使用接口(只是接口中的公共方法)时的问题,但由于