1

我从书中复制了以下代码。当我运行该应用程序时,它无法启动。

违规行是aboutButton.setOnClickListener(this);. 如果我把它敲掉,应用程序就可以工作。

有什么线索吗?

谢谢。

G。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View aboutButton = findViewById(R.id.main_about_button);
    aboutButton.setOnClickListener(this);
    setContentView(R.layout.activity_main);
}


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:gravity="center"
    tools:context=".MainMenu"  
    >

    <TextView 
        android:id="@+id/welcome_title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textStyle="bold"
        android:textSize="25sp"
        android:text="@string/welcome_title"
        />

    <Button
        android:id="@+id/search_button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/search_button"
        />

    <Button
        android:id="@+id/new_button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/new_button"
        />

    <Button
        android:id="@+id/help_button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/help_button"
        />

    <Button
        android:id="@+id/exit_button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/exit_button"
        />

   <Button 
        android:id="@+id/main_about_button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/exit_button"
        android:layout_alignLeft="@+id/exit_button"
        android:text="@string/main_about_button"
        android:clickable="true"
        />

</LinearLayout>
4

3 回答 3

2

aboutButtonnull。在膨胀layout. 将其更改为

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);   // Switch these two lines
    View aboutButton = findViewById(R.id.main_about_button);
    aboutButton.setOnClickListener(this);

}

Views存在于您的内部layout,这意味着null如果您在layout使用 alayout inflater或通过调用膨胀之前尝试初始化它们,它们将返回setContentView(),这将NPE在尝试对它们调用函数或设置 a 时为您提供listener

于 2013-08-05T16:11:52.283 回答
1

必须将侦听器语句放在seContentView命令之后。解决了它。

我的猜测是,setContentView 从布局中导入所有变量和 ID。并且 findViewById 只是返回了一个空指针或其他东西。

如果有人能证实我的猜测,我将不胜感激。

于 2013-08-05T16:54:44.940 回答
0

我建议您将 aboutButton 声明为 Button。试试这个:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button aboutButton = (Button) findViewById(R.id.main_about_button);
    aboutButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // Do something
        }
    });

}

我希望它有帮助!

于 2013-08-05T16:25:23.833 回答