布局文件大致是这样的结构:
activity_main.xml
<LinearLayout
    android:id="@+id/main_layout">
    <Button
        android:id="@+id/start_button">代码是这样的
setContentView(R.layout.activity_main);//这句可用
button = (Button) findViewById(R.id.start_button);//这句也没问题
mainView = findViewById(R.id.main_layout);//这句会返回空指针请教:
1,同样的通过id来查找view对象,为什么第三行会返回null?
2,xml布局文件生成的R.layout.activity_main资源和文件内容生成的R.id.main_layout资源,二者有什么不同?谢谢解答!

解决方案 »

  1. 1.没看到你的类型转换啊,不过也不至于为空。
    2.R.layout代表整个资源文件。R.id只是引用某表控件
      


  2. 多谢回答。
    1,确实为null了,我也很奇怪。
    2,我想问的就是引用整个布局资源和引用某控件有什么区别?是不是理论上都可用setContentView()?
      

  3. 1.mainView = (LinearLayout)findViewById(R.id.main_layout);
    2.其实意义是一样的。
      

  4. 尝试了一下得出以下结论:
    setContentView(R.layout.activity_main);//可以正常工作
    setContentView(R.id.main_layout);//抛出异常,android.content.res.Resources$NotFoundException问题1,对于setContentView来说,他俩有什么区别?以及,
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mainView1 = (LinearLayout)findViewById(R.id.main_layout);//在setContentView之前,是null
            setContentView(R.layout.activity_main);
            mainView2 = (LinearLayout)findViewById(R.id.main_layout);//在setContentView之后,正常获取
    }问题2,setContentView前后有什么区别?如果我不打算set,直接从布局资源生成一个view,应该用什么方法?
      

  5. 1、简单点来说,R.layout.activity_main是指activity_main布局描述资源,而R.id.main_layout是activity_main中LinearLayout
    2、setContentView以后,findViewById会在根据activity_main布局生成的View中去找id为main_layout的组件,在setContentView之前调用findViewById,基本的View都没有,根本无从找起,当然是null了
    建议仔细的看一下Android Activity相关类的源代码,看google的源码,很多东西就一目了然了
      

  6. 安卓开发生手遇到不能动态创建图片,郁闷啊!后来经过调试发现是layout对象获取总是为null,
    原来获取布局对象不能用布局资源id,必须用id的id LinearLayout lay1=(LinearLayout)findViewById(R.layout.xerllent_main)  //错!!
    LinearLayout lay1=(LinearLayout)findViewById(R.id.xerllent_main);     //对!!
      

类似问题 »