两个按钮的onClick和onLongClick方法不同

时间:2017-06-02 11:51:49

标签: android onclick onclicklistener onlongclicklistener

我试图创建按钮,只需点击一下,长按即可执行某些不同的指令,但我对如何将所有内容放在一起的理解很少。为每个按钮执行一个定义的方法是可以的,但我认为最好使用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();
        }
    });
    }

 }

[如果您发现任何错误,例如未关闭的parentheris或不完全正确的变量名称,那么由于我复制/粘贴的某些编辑而导致错误]

5 个答案:

答案 0 :(得分: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"/>

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您的代码中存在错误。第一个已经由@Luiz指出,它是视图与按钮对象的绑定:

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

此外,这是一个可能对您有所帮助的主题,因为我看到您在xml中为onClick标记声明了Button属性:How exactly does the android:onClick XML attribute differ from setOnClickListener?

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

答案 3 :(得分:0)

问题是你找到两次相同的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

答案 4 :(得分:0)

从中删除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);