是否可以将onClick绑定到特定活动?

时间:2018-06-13 21:09:10

标签: android android-activity

我正在尝试构建一个窗口应用。 我有一个布局(一个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() {
    ...
}

}

2 个答案:

答案 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.
  }
 });
相关问题