读研的莴苣 · 为什么React没有功能强大且免费的表格Ta ...· 9 月前 · |
活泼的奔马 · ELK学习笔记之Kibana查询和使用说明- ...· 11 月前 · |
儒雅的绿茶 · elfinder支持中文目录版-CSDN博客· 1 年前 · |
胡子拉碴的八宝粥 · UniTask中文使用指南(一) - 知乎· 1 年前 · |
重情义的椰子 · 【1.26 SQL ...· 1 年前 · |
我有一个包含这些元素和其他元素的
res/layout/main.xml
:
<some.package.MyCustomView android:id="@+id/foo" (some other params) />
<TextView android:id="@+id/boring" (some other params) />
在我的活动的onCreate中,我这样做:
setContentView(R.layout.main);
TextView boring = (TextView) findViewById(R.id.boring);
// ...find other elements...
MyCustomView foo = (MyCustomView) findViewById(R.id.foo);
if (foo == null) { Log.d(TAG, "epic fail"); }
成功找到其他元素,但
foo
返回null。MyCustomView有一个构造器
MyCustomView(Context c, AttributeSet a)
,该构造器结尾处的
Log.d(...)
在“史诗失败”之前成功出现在logcat中。
为什么
foo
为空?
因为在构造函数中,我用
super(context)
代替了
super(context, attrs)
。
这是有道理的,如果您不传入属性,比如id,那么视图将没有id,因此无法使用该id进行查找。:-)
对我来说,当我在项目设置中将res文件夹添加到Java Build Path中的Source时,这个问题就解决了。
我也有同样的问题。我的错误是:我写了
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout=inflater.inflate(R.layout.dlg_show_info, null);
alertDlgShowInfo.setView(layout);
TableRow trowDesc=(TableRow)findViewById(R.id.trowDesc);
当我使用充气器从XML文件中“加载”视图时,最后一行是错误的。为了解决这个问题,我不得不写道:
TableRow trowDesc=(TableRow)layout.findViewById(R.id.trowDesc);
我写下了我的解决方案,以防有人遇到同样的问题。
似乎有各种各样的原因。我刚用了“干净...”在Eclipse中解决类似的问题。(FindViewByID以前工作过,但由于某种原因开始返回null。)
我的问题是打字错误。我写的是
android.id
(点)而不是
android:id
。:P
显然,在我的自定义组件xml中没有语法检查。:(
也有同样的问题。
我有几个孩子的布局。从其中一个函数的构造函数中,我试图(通过使用context.findViewById)获取对其他子对象的引用。它不起作用,因为第二个子元素在布局中被进一步定义。
我是这样解决的:
setContentView(R.layout.main);
MyView first = findViewById(R.layout.first_child);
first.setSecondView(findViewById(R.layout.second_child));
如果孩子的顺序是相反的,它也会起作用,但我想通常应该像上面这样做。
当布局的根没有
android:id
属性时,
findViewById()
方法有时会返回
null
。用于生成布局xml文件的Eclipse向导不会自动为根元素生成
android:id
属性。
在我的例子中,findViewById返回的是null,因为我的自定义视图在主XML中如下所示:
<com.gerfmarquez.seekbar.VerticalSeekBar
android:id="@+id/verticalSeekBar"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
/>
我发现,当我添加xmlns内容时,它是这样工作的:
<com.gerfmarquez.seekbar.VerticalSeekBar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/verticalSeekBar"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
/>
在我的例子中,视图在父视图中,而不是在我试图调用的视图中。因此,在子视图中,我必须调用:
RelativeLayout relLayout = (RelativeLayout) this.getParent();
View view1 = relLayout.findViewById(R.id.id_relative_layout_search);
确保在
findViewById(...)
语句之前调用
setContentView(R.layout.main)
语句;
“干净”的选项对我很有效。
在我的例子中,根本原因是源代码驻留在网络共享上,而我的工作站和文件服务器没有正确同步,并且漂移了5秒。Eclipse创建的文件上的时间戳是过去的(因为它们是由文件服务器分配的) w.r.t。工作站的时钟,导致Eclipse错误地解析生成的文件和源文件之间的依赖关系。在这种情况下,“清理”似乎是有效的,因为它强制执行完整的重建,而不是依赖于错误的时间戳的增量构建。
一旦我修复了工作站上的NTP设置,问题就再也没有出现过。如果没有适当的NTP设置,它将每隔几个小时发生一次,因为时钟漂移得很快。
如果您有多个布局版本(取决于屏幕密度、SDK版本),请确保所有版本都包含您要查找的元素。
要在答案中添加另一个需要注意的小错误:
检查您是否正在编辑正确的布局XML文件...
我也遇到了同样的问题,因为我忘记了更新所有布局文件夹中的视图id。
这发生在我的Wear定制组件上,但这是一个通用的建议。如果您正在使用存根(例如我使用的是
WatchViewStub
),则不能只将调用放在
findViewById()
anywhere中。存根中的所有东西都必须先膨胀,这不是在
setContentView()
之后才发生的。因此,您应该编写类似下面这样的代码,以便等待它的发生:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wear);