【问题标题】:Button not working when activity is changed更改活动时按钮不起作用
【发布时间】:2020-02-13 17:30:12
【问题描述】:

我正在尝试编写一个简单的待办事项列表,由一个标题屏幕(这是一个主要活动)和一个切换到实际列表(这是另一个活动)的按钮组成。但是,在单击另一个活动上的“添加”按钮时,什么也没有发生——甚至没有调用 onClick 函数。我应该如何完成这项工作?

我已尝试根据此解决方案重写代码,但没有任何改变:Android Studio onClick and OnclickListener not working once changed to another Activity 此外,我尝试使用此处提到的第一种方法来实现代码,但无济于事: https://medium.com/@CodyEngel/4-ways-to-implement-onclicklistener-on-android-9b956cbd2928

这是 MainActivity 类:

package com.example.kandydatpl;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void openChecklist(View view) {
        Intent intent = new Intent(this, TaskListActivity.class);
        startActivity(intent);
    }

}

MainActivity.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="openChecklist"
        android:text="Open Checklist"
        tools:layout_editor_absoluteX="136dp"
        tools:layout_editor_absoluteY="407dp" />

</android.support.constraint.ConstraintLayout>

还有TaskListActivity类:

package com.example.kandydatpl;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.io.File;
import java.util.ArrayList;

public class TaskListActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener {

    private EditText itemET;
    private Button btn;
    private ListView itemsList;
    private ArrayList<String> items;
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_task_list);

        itemET = findViewById(R.id.item_edit_text);
        btn = findViewById(R.id.add_btn);
        itemsList = findViewById(R.id.items_list);

        items = FileHelper.readData(this);

        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
        itemsList.setAdapter(adapter);

        btn.setOnClickListener(this);
        itemsList.setOnItemClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.add_btn:
                String itemEntered = itemET.getText().toString();
                adapter.add(itemEntered);
                itemET.setText("");
                FileHelper.writeData(items, this);
                Toast.makeText(this, "Item Added!", Toast.LENGTH_SHORT).show();
                break;
        }
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        items.remove(position);
        adapter.notifyDataSetChanged();
        FileHelper.writeData(items, this);
        Toast.makeText(this, "Delete", Toast.LENGTH_SHORT).show();
    }
}

以及相应的 XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".TaskListActivity">

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/item_edit_text"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:hint="Enter Item" />

        <Button
            android:id="@+id/add_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="onClickAdd"
            android:text="Add" />

    </LinearLayout>

    <ListView
        android:id="@+id/items_list"
        android:layout_width="395dp"
        android:layout_height="667dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout"
        tools:layout_editor_absoluteX="8dp" />

</android.support.constraint.ConstraintLayout>

【问题讨论】:

  • 您的TaskListActivity 类看起来不错(它实现了View.OnClickListener,并将onClickListener 正确设置为按钮,最后正确处理了onClick() 事件)。也就是说,您可以包含您的布局文件 (XML) 吗?您是否尝试过调试以查看 onClick() 事件是否触发?
  • @TomLacher 是的,我尝试调试代码,这就是我发现这个函数没有被调用的原因。我会在我们说话的时候添加 XML 文件。

标签: java android android-studio android-intent android-activity


【解决方案1】:

由于您在 xml 文件中使用 android:onClick="onClickAdd,因此您需要将 onClickAdd 方法添加到您的 TaskListActivity,如下所示:

public void onClickAdd(View view) 
{
      switch (view.getId()) 
      {
           case R.id.add_btn:
             String itemEntered = itemET.getText().toString();
             adapter.add(itemEntered);
             itemET.setText("");
             FileHelper.writeData(items, this);
             Toast.makeText(this, "Item Added!", Toast.LENGTH_SHORT).show();
             break;
      }
}

当您在 xml 文件中使用onClick 属性时,您的TaskListActivity 不需要实现View.OnClickListener 接口,因此您不需要将onClickListener 添加到您的Button .

【讨论】:

  • 如果我将android:onClick="onClickAdd" 改为android:onClick="onClick 会起作用吗?
  • 我不太确定,因为我很少使用onClick 属性,但它应该可以工作。在我的观点中,您应该实现 View.OnClickListener 或将属性添加到您的 xml 文件中。两者对我来说都没有意义(除非您有更多视图,其中一些使用属性,而另一些使用View.OnClickListener 接口)
  • 你说的方法我加了,还是不行。这可能是什么问题?
  • 请删除此行:btn.setOnClickListener(this)。只需使用该属性,看看它是否有效 - 或者 - 删除该属性并使用 btn.setOnClickListener(this) 来处理点击事件。
  • 我决定坚持第二个选项,从 XML 文件中删除 onClick 属性,但仍然没有成功。这是我当前的 TaskListActivity 代码:pastebin.com/dgT3rHzv
【解决方案2】:

尝试在按钮下方设置监听器:

btn = findViewById(R.id.add_btn);
btn.setOnClickListener(this);

并使用 Invalidate Caches and Restart 选项

【讨论】:

    【解决方案3】:

    我同意 kAliert

    使用其中一个
    A) 实现你到目前为止所做的 View.OnClickListener,但在 xml 中删除这一行

    android:onClick="onClickAdd"
    

    B) 不要实现 View.OnClickListener,而使用

    public void onClickAdd(View view) 
    {
      switch (view.getId()) 
      {
           case R.id.add_btn:
             String itemEntered = itemET.getText().toString();
             adapter.add(itemEntered);
             itemET.setText("");
             FileHelper.writeData(items, this);
             Toast.makeText(this, "Item Added!", Toast.LENGTH_SHORT).show();
             break;
      }
    }
    

    同时在 xml 中维护这一行

    android:onClick="onClickAdd"
    

    如果它仍然不起作用,请告诉我们。

    【讨论】:

    • 这些方法都不起作用。我决定坚持方法 A),我从 XML 文件中删除了“onClick”属性,但按钮仍然没有正确响应。这是我当前的 TaskListActivity 代码状态:pastebin.com/dgT3rHzv
    • 对于 pastebin 中的代码 1. 请在 pastebin 中包含 xml。 2. 从 'public void onClickAdd(View view)' 到 'public void onClickAdd()' 3. 从 'onClickAdd(v)' 到 'onClickAdd()' 在你的 'public void onClick(View v)' 下
    • 我按照此链接中的说明和您的建议进行操作,但仍然没有效果。
    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多