我正在尝试构建一个窗口应用。 我有一个布局(一个xml文件)和两个活动。第一个活动上的按钮开始第二个活动,这是一个无限测验。然后第二个活动修改一些视图(显示一系列问题)。
按钮的目的是完成第二项活动,如果它已启动,则再次启动。
问题是当我第二次点击按钮时,应用程序崩溃了。根据我的理解,它是因为它无法在第二个活动代码中找到onClick方法。这是错误消息:
java.lang.IllegalStateException:无法在父级或祖先语句中找到方法startQuiz(View)for android:onClick属性在视图类android.support.v7.widget.AppCompatButton上定义,ID为' buttonStart&#39 ;
我正在寻找一种方法将该按钮的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() {
...
}
}
答案 0 :(得分:0)
您可以在两个活动中使用findByViewId
来查找按钮,并在每个活动中明确设置onClickListener
。
答案 1 :(得分:0)
问题是当我第二次点击按钮时,应用程序崩溃了。根据我的理解,它是因为它无法在第二个活动代码中找到onClick方法。
你是对的。当您使用具有android:onClick
属性的按钮时,如下所示:
<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
值以反映更改时,这就成了一个问题。但是你忘了重命名活动中的方法。
因此,您需要将布局与代码分离。而是使用android:onClick
属性,您需要设置Button click侦听器。将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.
}
});