我从书中复制了以下代码。当我运行应用程序时,它无法启动。
违规行为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>
答案 0 :(得分:2)
aboutButton
是null
。在夸大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
给layout inflater
充气之前尝试初始化setContentView()
,则会NPE
致电listener
,在尝试为他们调用某个功能或设置{{1}}时提供{{1}}
答案 1 :(得分:1)
必须将监听器语句 AFTER 放在seContentView命令中。修好了。
我的猜测是,setContentView导入所有变量&amp;来自布局的ID。并且findViewById只返回一个空指针或其他东西。
如果有人能证实我的猜测,我会很感激。
答案 2 :(得分: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
}
});
}
我希望它有所帮助!