我正在关注一本书的例子,我无法理解为什么findViewById会返回null。
这是我的活动:
package it.mt.compass;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class CompassActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CompassView cv = (CompassView)this.findViewById(R.id.compassView1);
// this crashes the application
//cv.setBearing(45);
// some debug code
Toast test_result;
if(cv == null) {
test_result = Toast.makeText(this, "1", Toast.LENGTH_SHORT);
test_result.show();
}
else {
test_result = Toast.makeText(this, "0", Toast.LENGTH_SHORT);
test_result.show();
}
// it shows 1
}
}
这是res / layout / main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<it.mt.compass.CompassView
android:id="@+id/compassView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
已经清理过了(正如其他类似主题中所说的那样;“干净”做了什么?)项目没有运气。
非常感谢提前。 米尔科
根据要求,构造函数的代码:
// Constructors
public CompassView(Context context) {
super(context);
initCompassView();
}
public CompassView(Context context, AttributeSet attrs) {
super(context);
initCompassView();
}
public CompassView(Context context, AttributeSet ats, int defaultStyle) {
super(context);
initCompassView();
}
这是正确的版本(问题是我没有正确地将参数传递给超类构造函数):
// Constructors
public CompassView(Context context) {
super(context);
initCompassView();
}
public CompassView(Context context, AttributeSet attrs) {
super(context, attrs);
initCompassView();
}
public CompassView(Context context, AttributeSet ats, int defaultStyle) {
super(context, ats, defaultStyle);
initCompassView();
}
答案 0 :(得分:4)
CompassView
构造函数实现不正确。您没有将属性传递给超类,因此id
将丢失。
在这里更改超类构造函数调用
public CompassView(Context context, AttributeSet attrs) {
super(context);
到super(context, attrs);
和
public CompassView(Context context, AttributeSet ats, int defaultStyle) {
super(context);
到super(context, attrs, defaultStyle);
如果超类有一个接受三个args的ctor。否则只需使用super(context, attrs)
。哦,并且从ats
重命名arg名称,即使名称无关紧要。
答案 1 :(得分:1)
在日食中:
这将清除生成的旧R类。
答案 2 :(得分:0)
我会尝试完全关闭eclipse然后再打开它。我看到过一些非常奇怪的事情,比如这种情况。你可以尝试这种方法的另一种方法是只添加一个“textView”并尝试对其执行findById并查看它是否返回null。您可能正在加载错误的xml视图..
即:您正在从一个目录加载布局,但它实际上是在具有相同名称的不同目录中加载不同的视图...
答案 3 :(得分:0)
添加import it.mt.compass.R;
并尝试另一个视图,如图像或TextView