findViewById返回null

时间:2011-05-09 14:02:23

标签: android

我有代码:

public class HelloWorld extends Activity {

private Button buttonOk;
private Button buttonCancel;

private OnClickListener buttonOkListener = new OnClickListener() {
    public void onClick(View v){
        EditText editText = (EditText)findViewById(R.id.input);

        CharSequence textFromInput = (CharSequence) editText.getText();
        Context context = getApplicationContext();
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context,textFromInput,duration);
        toast.show();
    }
};

private OnClickListener buttonCancelListener = new OnClickListener() {
    public void onClick(View v){
        EditText editText = (EditText)findViewById(R.id.input);

        CharSequence textFromInput = (CharSequence) editText.getText();
        Context context = getApplicationContext();
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context,textFromInput,duration);
        toast.show();
    }
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    // ToDo add your GUI initialization code here

    setContentView(R.layout.main);

    buttonOk = (Button)findViewById(R.id.buttonOk);
    buttonCancel = (Button)findViewById(R.id.buttonCancel);

    buttonOk.setOnClickListener(buttonOkListener);
    buttonCancel.setOnClickListener(buttonCancelListener);
}
}

和布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Wpisz swoje imię:"/>
<EditText
    android:id="@+id/input"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@android:drawable/editbox_background"
    android:layout_below="@id/label"/>
<Button
    android:id="@+id/buttonOk"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/input"
    android:layout_alignParentRight="true"
    android:layout_marginLeft="10dip"
    android:text="OK" />
<Button
    android:id="@+id/buttonCancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/buttonOk"
    android:layout_alignTop="@id/buttonOk"
    android:text="Anuluj" />
</RelativeLayout>

使用buttonCancel.setOnClickListener(buttonCancelListener);抛出异常因为buttonCancel为null。我做错了什么?

4 个答案:

答案 0 :(得分:12)

您的代码没有问题,正确的一切都应该正常工作。

通过findViewById()方法遇到null的最常见错误是,当您忘记调用setContentView()或将其调用为错误的布局时。

我建议您清理项目并再试一次!!!!

答案 1 :(得分:2)

我遇到了同样的麻烦,但是在清理完我的项目并再次运行它之后就完美了。

答案 2 :(得分:1)

我不是100%肯定,但你在类初始化中调用findviewbyid。我认为在onCreate方法之前调用此代码,因此无法找到视图。在oncreate方法中初始化监听器应该可以工作。

答案 3 :(得分:1)

有时没有什么要考虑的!

即使对于有经验的开发人员,这也总是可能发生。我建议以下几点,

  • 检查是否在考虑中的活动或片段的适当生命周期中添加了findViewById
    • 还要验证布局是否正确膨胀,并且在setContentView中设置了有效的布局-在我看来这是不正确的。
    • 如上所述,在某些情况下,清理项目可以帮助解决此问题。