Android - findViewById返回null

时间:2014-01-09 23:11:54

标签: android view findviewbyid

我正在关注一本书的例子,我无法理解为什么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();
    }

4 个答案:

答案 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)

在日食中:

  • 项目 - &gt;干净。
  • Eefresh你的应用程序。
  • 运行。

这将清除生成的旧R类。

答案 2 :(得分:0)

我会尝试完全关闭eclipse然后再打开它。我看到过一些非常奇怪的事情,比如这种情况。你可以尝试这种方法的另一种方法是只添加一个“textView”并尝试对其执行findById并查看它是否返回null。您可能正在加载错误的xml视图..

即:您正在从一个目录加载布局,但它实际上是在具有相同名称的不同目录中加载不同的视图...

答案 3 :(得分:0)

添加import it.mt.compass.R; 并尝试另一个视图,如图像或TextView