【问题标题】:Different onClick and onLongClick methods for two buttons两个按钮的不同onClick和onLongClick方法
【发布时间】:2017-06-02 11:51:48
【问题描述】:

我正在尝试创建按钮,这些按钮将基于简单的单击和长按来执行某些不同的指令,但我对如何将所有内容组合在一起的理解不足。为每个按钮执行定义的方法是可以的,但我认为使用 onClickListeners 会更好,不是吗?

所以我的代码如下。如您所见,我试图为每个按钮捕获两种类型的事件,但是当我按下按钮 1A 时,我得到了 2A 的祝酒词,当我单击按钮 2A 时,我得到一个错误并且应用程序崩溃。 要修复的第二件事是将 onClick 和 onLongClick 绑定在一起。

activity_scout.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.android.scout.ScoutActivity">

<LinearLayout
    android:id="@+id/activity_scout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="8dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"
    android:paddingTop="8dp"
    android:orientation="vertical" >

    <Button
        android:id="@+id/but1A"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1a"
        android:onClick="click1a"
        />

    <Button
        android:id="@+id/but2A"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2a"
        android:onClick="click2a" />


   </LinearLayout>
</ScrollView>

ScoutActivity.java

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

import static com.example.android.basketscout.R.id.butPlayer1A;
import static com.example.android.basketscout.R.id.butPlayer2A;
import static com.example.android.basketscout.R.id.butPlayer3A;
import static com.example.android.basketscout.R.id.butPlayer4A;
import static com.example.android.basketscout.R.id.butPlayer5A;
import static com.example.android.basketscout.R.id.textView;

public class ScoutActivity extends AppCompatActivity {

    Button but1A;
    Button but2A;
    Button but3A;
    Button but4A;
    Button but5A;


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

        but1A = (Button) findViewById(R.id.but1A);
        but2A = (Button) findViewById(R.id.but1A);

        but1A.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view){
                Toast.makeText(getApplicationContext(), "Button 1A clicked", Toast.LENGTH_SHORT).show();
            }
        });

        but2A.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view){
                Toast.makeText(getApplicationContext(), "Button 2A clicked", Toast.LENGTH_SHORT).show();
            }
        });

        but1A.setOnLongClickListener(new View.OnLongClickListener(){
            public void onLongClick (View view) {
                Toast.makeText(getApplicationContext(),"Button 1A long clicked", Toast.LENGTH_SHORT).show();
            }
        });

    but2A.setOnLongClickListener(new View.OnLongClickListener(){
        public void onLongClick (View view) {
            Toast.makeText(getApplicationContext(),"Button 2A long clicked", Toast.LENGTH_SHORT).show();
        }
    });
    }

 }

[如果您看到任何错误,例如未闭合的括号或不完全正确的变量名称,那是因为我从复制/粘贴中进行了一些编辑]

【问题讨论】:

  • 删除 android:onClick="click1a" 和 android:onClick="click2a"。这是多余的。
  • 错误日志??...
  • @alphaQ,为什么这是多余的?它们不是两个不同的按钮吗?

标签: android onclick onclicklistener onlongclicklistener


【解决方案1】:

您发现相同的视图两次,您必须更改这部分代码:

but1A = (Button) findViewById(R.id.but1A);
but2A = (Button) findViewById(R.id.but1A);

到这里:

but1A = (Button) findViewById(R.id.but1A);
but2A = (Button) findViewById(R.id.but2A);

另外,从布局中删除android:onClick 属性,它是多余的并且会导致冲突。

  <Button
        android:id="@+id/but1A"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1a"/>

    <Button
        android:id="@+id/but2A"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2a"/>

【讨论】:

  • 好的,第一个问题解决了,但是第二个呢?如何添加 onLongClick 方法?
  • 您正在使用 OnLongItemClickListener 以编程方式进行操作
【解决方案2】:

删除 xml 文件中的 onClick 输入,如果您从 xml 声明了 onClick 方法,则无需在 Buttons 对象上调用 setOnClickListener,只需使用 yourOnClickMethod(View view) 的参数创建该方法

【讨论】:

    【解决方案3】:

    您的代码中有错误。 @Luiz 已经指出首先是视图与按钮对象的绑定:

    but2A = (Button) findViewById(R.id.but2A);
    

    另外,这里有一个可能对你有帮助的线程,因为我看到你已经在你的 xml 中为 Button 标签声明了 onClick 属性:How exactly does the android:onClick XML attribute differ from setOnClickListener?

    基本上有这两种实现点击监听器的方法,如果您使用的是setOnClickListener(),则不需要XML 中的onClick 属性,反之亦然。

    【讨论】:

      【解决方案4】:

      移除 onClick 属性 按钮布局

      并更正此代码

      but1A = (Button)findViewById(R.id.but1A);
      but2A = (Button)findViewById(R.id.but1A);
      

      到

      but1A = (Button)findViewById(R.id.but1A);
      but2A = (Button)findViewById(R.id.but2A); 
      

      【讨论】:

        【解决方案5】:

        问题是您两次找到相同的 id:

            but1A = (Button) findViewById(R.id.but1A);
            but2A = (Button) findViewById(R.id.but1A);
        

        到

          but1A = (Button) findViewById(R.id.but1A);
            but2A = (Button) findViewById(R.id.but2A);
        

        那么,

        对于视图的长按监听器,请参阅how to implement a long click listener on a listview

        【讨论】:

          猜你喜欢
          • 2017-11-16
          • 1970-01-01
          • 1970-01-01
          • 2016-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-01
          相关资源
          最近更新 更多