android - 是否可以将 onClick 绑定到特定活动?
问题描述
我正在尝试构建一个单一的窗口应用程序。我有一个布局(一个 xml 文件)和两个活动。第一个活动上的按钮启动第二个活动,这是一个无限测验。然后第二个活动修改了一些视图(显示一系列问题)。
该按钮的目的是完成第二个活动(如果它已启动),然后再次启动它。
问题是当我第二次单击该按钮时,应用程序崩溃了。据我了解,这是因为在第二个活动代码中找不到 onClick 方法。这是错误消息:
java.lang.IllegalStateException:无法在父或祖先上下文中找到方法 startQuiz(View) 为 android:onClick 属性定义在视图类 android.support.v7.widget.AppCompatButton 与 id 'buttonStart'
我正在寻找一种方法将该按钮的 onClick 绑定到仅主要活动。可能吗?我将不胜感激任何帮助。
我的按钮xml:
<Button
android:id="@+id/buttonStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="32dp"
android:background="@android:color/holo_orange_dark"
android:onClick="startQuiz"
android:text="@string/start"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/arithMul" />
我的主要活动:
/** Called when the user taps the Start button */
public void startQuiz(View view) {
finishActivity();
initQuiz();
}
public void initQuiz() {
Intent intent = new Intent(this, QuizActivity.class);
startActivity(intent);
}
public void finishActivity() {
Intent intent = new Intent("finish.quiz");
sendBroadcast(intent);
}
我的第二个活动(QuizActivity):
public class QuizActivity extends AppCompatActivity {
TextView textQuestion = null;
EditText textAnswer = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// register to finish broadcast message
IntentFilter filter = new IntentFilter();
filter.addAction("finish.quiz");
registerReceiver(broadcast_reciever, filter);
// access main activity layout
setContentView(R.layout.activity_main);
// main layout text views
ConstraintLayout layoutChoose = findViewById(R.id.constraintLayoutQuiz);
layoutChoose.setVisibility(View.VISIBLE);
textQuestion = (TextView) findViewById(R.id.textViewQuestion);
textAnswer = (EditText) findViewById(R.id.editTextAnswer);
// start the quiz
startQuizSequence();
}
// register for broadcast to finish this activity
BroadcastReceiver broadcast_reciever = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent intent) {
//finish the activity
finish();
}
};
private void startQuizSequence() {
...
}
}
解决方案
问题是当我第二次单击该按钮时,应用程序崩溃了。据我了解,这是因为在第二个活动代码中找不到 onClick 方法。
你是对的。当您使用具有android:onClick
如下属性的 Button 时:
<Button
android:id="@+id/buttonStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="startQuiz"
...
/>
您应该创建一个与属性值类似的方法,如下所示:
public void startQuiz(View v) {
}
您需要使用 XML 布局将相同的方法添加到另一个活动。
但是,当您尝试重命名按钮视图并重命名android:onClick
值以反映更改时,就会出现问题。但是后来你忘记重命名 Activity 中的方法了。
因此,您需要将布局与代码分离。而不是使用android:onClick
属性,您需要设置按钮单击侦听器。将您的 Button 视图更新为如下所示:
<!-- I usually use a more readable id for the button -->
<Button
android:id="@+id/start_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
...
/>
然后,设置点击监听器:
Button button = (Button) findViewById(R.id.start_btn);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// do something here.
}
});