首页 > 解决方案 > 是否可以将 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() {
    ...
}

}

标签: androidandroid-activity

解决方案


问题是当我第二次单击该按钮时,应用程序崩溃了。据我了解,这是因为在第二个活动代码中找不到 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.
  }
 });

推荐阅读