【问题标题】:Why does the findViewById() method work only in the methods of the activity class but not in the class directly?为什么findViewById()方法只在activity类的方法中起作用,而在类中直接不起作用?
【发布时间】:2021-07-24 13:08:59
【问题描述】:
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 及更高级别进行开发

【问题讨论】:

    标签: java android class inheritance android-activity


    【解决方案1】:

    如您所知,setContentView(R.layout.menu_order); 定义了要附加到这个特定 java 类的布局。因此,如果您从该 XML 初始化任何视图,它在任何地方都找不到它。因为它不知道在哪里寻找 id name_header。所以,它会显示错误。

    现在,我阅读了您的评论。如果我是正确的,您将在 onCreate() 之后初始化视图。意思是这样的。

    ...
    public class MainActivity extends AppCompatActivity {
           @Override
           protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
          setContentView(R.layout.menu_order);
     }
       name_header = (TextView) findViewById(R.id.name_header);
    }
    ...
    

    所以,这和这个是一样的。

    ...
    public class MainActivity extends AppCompatActivity {
    
           name_header = (TextView) findViewById(R.id.name_header);
    
           @Override
           protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
          setContentView(R.layout.menu_order);
     }
    
    }
    ...
    

    所以,它会给出一个错误。您必须在任何方法中初始化视图。因为起初java将初始化方法之外的变量。然后它会进入任何其他方法。

    【讨论】:

    • 谢谢,伙计!!!最后有一个很好的解释。所以这意味着就像任何全局变量都会被初始化,而不管它在类中的位置如何,并且只有当这种情况发生时,java才会开始执行代码中存在的其他东西,比如表达式和调试。对吗?
    【解决方案2】:

    在 onCreate(...) 中的 setContentView(...) 函数被调用之前,layout(-file) 尚未膨胀/设置。因此,目前还没有任何东西可以查找 id。

    正如 Android 文档所描述的那样:

    public T findViewById (int id)

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

    但由于您已经将 TextView 声明为“全局”,您可以在 onCreate 函数中对其进行初始化,然后在 MainActivity 的其他任何地方使用它,而不会出现问题。

    【讨论】:

    • 是的,我可以在 onCreate() 方法中初始化变量,但即使我在 onCreate() 方法的实现之后初始化变量,它在类本身中但就在 onCreate() 之后,它仍然无法使用,但可以使用任何其他方法,即使是我自己编写的方法。
    猜你喜欢
    • 2021-05-05
    • 2019-07-18
    • 1970-01-01
    • 2019-01-28
    • 2016-05-23
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多