Tho*_*mas 238 android android-view
首先:是的,我阅读了关于这个主题的所有其他主题.不仅是来自这个网站的人......(你看,我有点沮丧)
他们中的大多数都提供了使用建议,android:id而不仅仅是id在XML文件中.我做到了.
我从其他人那里了解到,View.findViewById与众不同Activity.findViewById.我也是这样处理的.
在我location_layout.xml,我使用:
<FrameLayout .... >
    <some.package.MyCustomView ... />
    <LinearLayout ... >
        <TextView ...
            android:id="@+id/txtLat" />
        ...
    </LinearLayout>
</FrameLayout>
在我的活动中,我做了:
...
setContentView( R.layout.location_layout );
在我的自定义视图类中:
... 
TextView tv = (TextView) findViewById( R.id.txtLat );
返回null.这样做,我的活动工作正常.也许这是因为Activity.findViewById和View.findViewById差异.所以我在本地存储了传递给海关视图构造函数的上下文并尝试:
...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );
这也回来了null.
然后,我改变了我的自定义视图扩展ViewGroup,而不是View和改变location_layout.xml让TextView我的自定义视图的直接子,从而使View.findViewById应该工作的设想.惊喜:它没有解决任何问题.
那么我做错了什么?
我会感激任何评论.
Com*_*are 254
返回null
可能是因为你太早称它.等到onFinishInflate().这是一个示例项目,演示View访问其内容的自定义.
小智 142
可能,你在打电话findViewById之前打电话setContentView?如果是这样的情况下,尝试调用findViewById 后调用setContentView
小智 98
确保您的布局没有多个版本用于不同的屏幕密度.我在向现有布局添加新ID但忘记更新hdpi版本时遇到此问题.如果您忘记更新布局文件的所有版本,它将适用于某些屏幕密度,但不适用于其他屏幕密度.
inf*_*net 15
就我而言,我的项目中有2个活动,main.xml并且main2.xml.从一开始,main2是一个副本main,一切运作良好,直到我添加新TextView的main2,所以它R.id.textview1可用于其余的应用程序.然后我尝试通过标准调用来获取它:
TextView tv = (TextView) findViewById( R.id.textview1 );
它总是空的.事实证明,在onCreate构造函数中我没有实例化main2,而是另一个实例化.我有:
setContentView(R.layout.main);
代替
setContentView(R.layout.main2);
我到达这里后,在网站上注意到了这一点.
小智 15
如果在自定义视图中调用错误的超级构造函数,则FindViewById可以为null.ID标记是attrs的一部分,因此如果忽略attrs,则删除ID.
这是错误的
public CameraSurfaceView(Context context, AttributeSet attrs) {
        super(context);
}
这是对的
public CameraSurfaceView(Context context, AttributeSet attrs) {
        super(context,attrs);
}
Nei*_*end 13
除了其他地方提到的经典原因:
setContentView()前findViewById()id您想要的是您所提供的视图或布局setContentView()id不会在不同的布局中意外复制我在标准布局中找到了一个自定义视图,这违反了文档:
理论上,您可以创建自定义视图并将其添加到布局中(请参阅此处).但是,我发现在这种情况下,有时该id属性适用于布局中除自定义视图之外的所有视图.我使用的解决方案是:
FrameLayout与自定义视图相同的布局属性.id比如说,给它一个合适的frame_for_custom_view.在onCreate:
setContentView(R.layout.my_layout);
FrameView fv = findViewById(R.id.frame_for_custom_layout);
MyCustomView cv = new MyCustomView(context);
fv.addView(cv);
它将自定义视图放在框架中.
    @Override
protected void onStart() {
         // use findViewById() here instead of in onCreate()
    }
使用ExpandableListView的人的答案,并根据它的标题运行这个问题.
我尝试在我的子视图和组视图中使用TextViews作为ExpandableListView实现的一部分时出现此错误.
您可以在getChildView()和getGroupView()方法的实现中使用类似下面的内容.
        if (convertView == null) {
            LayoutInflater inflater =  (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.child_layout, null);
        }
我在这里找到了这个.
我是Android/Eclipse的新手,错误地我添加了UI的东西activity_main.xml而不是fragment_main.xml.花了我几个小时来搞清楚......
小智 5
FWIW,我看不到有人以与我完全相同的方式解决了这个问题。编译时没有任何抱怨,但是我在运行时得到了一个空视图,并以正确的顺序调用事物。也就是说,在 setContentView()之后找到 findViewById ()。问题原来是我的视图是在content_main.xml中定义的,但是在我的activity_main.xml中,我缺少这一条语句:
<include layout="@layout/content_main" />
当我将其添加到activity_main.xml时,不再需要NullPointer。
| 归档时间: | 
 | 
| 查看次数: | 158999 次 | 
| 最近记录: |