2013-08-05 57 views
1

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

违规行是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> 

回答

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); 

} 

Viewslayout中存在,这意味着他们将返回null如果你试图夸大你的layout,使用layout inflater或之前初始化它们通过调用setContentView(),试图在这将给你一个NPE调用它们上的函数或设置一个listener

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 
     } 
    }); 

} 

我希望它有帮助!

+0

我确实尝试用Button更改声明。这并没有解决它。谢谢。 –

1

不得不把听众陈述AFTER seContentView命令。修复它。

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

如果有人可以证实我的猜测,我会很感激。

+0

你甚至看过我的回答吗?它在发布此消息之前一小时确认了你的猜测。 – codeMagic

+0

对不起。我猜测后我只得到你的答案。 –

+0

这很好。我很高兴你明白了。你仍然可以接受或自己接受,以便将来可以帮助别人 – codeMagic