(FrameLayout)findViewById(...)给出null

时间:2013-01-24 21:26:24

标签: android android-layout android-widget

我是android的新手,非常感谢任何帮助。我正在尝试使用背景作为我的视图,并假设我想创建一个包含以下文件的简单Credits页面: credits.xml Credits.java

Credits.java:

public class Credits extends Activity implements OnTouchListener
{   
    private FrameLayout fl;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            fl = (FrameLayout)findViewById(R.id.credits_screen);
            if ( fl == null ) Log.e("Credits", "fl is null");
            else {
                  fl.setOnTouchListener(this);
                  setContentView(fl);
            }
    }
    @Override 
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
}

在我的credits.xml中,我有:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="fill_parent"
 android:focusable="true" android:id="@+id/credits_screen">

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:src="@drawable/credits" android:scaleType="fitXY" />

</FrameLayout>

显然,fl在(FrameLayout)findViewById()处返回null。虽然我看到R.id.credits_screen是在R文件中生成的。我可以知道我的代码有什么问题吗?为什么它无法找到FrameLayout?

1 个答案:

答案 0 :(得分:3)

您需要在findViewById()之前调用setContentView()。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.credits);
    fl = (FrameLayout) findViewById(R.id.credits_screen);
    fl.setOnTouchListener(this);
}