Android的:如何处理按钮点击(Android: how to handle button cl

2019-07-19 15:54发布

有非Java和非Android系统的区域了坚实的经验,我学习的Android。

我有很多不同的区域的混乱,其中之一是如何处理按钮点击。 有这样做的至少4路(!),他们简单地列出这里

出于一致性的目的,我将一一列举:

  1. 具有的成员View.OnClickListener在活动类,并将其分配到一个实例,将处理onClick在逻辑onCreate活性的方法。

  2. 在“的onCreate”活动方法创建“onClickListener”,并将其分配给使用按钮setOnClickListener

  3. 在活动实施“onClickListener”本身并指派“本”为按钮的监听器。 因为如果活动有几个按钮的情况下,按钮的ID进行分析,以执行的“onClick”处理程序正确的按钮

  4. 对实现的“onClick”逻辑的活动提供公共方法,它在活动XML声明分配给按钮

问题1:

那些所有的方法,还有没有其他的选择吗? (我不需要任何其他的,只是好奇)

对我来说,最直观的方式将是最新的一个:它需要键入的代码量最少,是最可读的(至少对我来说)。

虽然,我不认为这种方法得到广泛应用。 什么是使用它的利弊?

问题2:

什么是每种方法的优点/缺点? 请分享你的任何经验或一个很好的链接。

欢迎任何的反馈!

PS我一直在努力,谷歌和找到了这个话题,但我发现的唯一的东西是描述“如何”做到这一点,不为什么是好还是坏。

Answer 1:

问题1:不幸的是,在其中你你说的是最直观的是Android中使用最少的。 据我了解,你应该分开你的UI(XML)和计算功能(Java类文件)。 这也使得更容易调试。 它实际上是一个更容易阅读这种方式和国际海事组织思考的Android。

问题2:我认为主要使用的两种是#2,#3。 我会用一个按钮clickButton作为一个例子。

2

是一个匿名类的形式。

Button clickButton = (Button) findViewById(R.id.clickButton);
clickButton.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                ***Do what you want with the click here***
            }
        });

这是我最喜欢的,因为它有旁边到按钮变量是用findViewById设置的onClick方法。 这似乎很干净整洁是与此clickButton按钮查看交易一切就设在这里。

我的同事的意见,是,想象一个骗子,你有需要的onclick听众很多意见。 你可以看到你的onCreate会得到很长的长度。 这样,为什么他喜欢用:

3

假设你有5个clickButtons:

确保您的活动/片段实现OnClickListener

// in OnCreate

Button mClickButton1 = (Button)findViewById(R.id.clickButton1);
mClickButton1.setOnClickListener(this);
Button mClickButton2 = (Button)findViewById(R.id.clickButton2);
mClickButton2.setOnClickListener(this);
Button mClickButton3 = (Button)findViewById(R.id.clickButton3);
mClickButton3.setOnClickListener(this);
Button mClickButton4 = (Button)findViewById(R.id.clickButton4);
mClickButton4.setOnClickListener(this);
Button mClickButton5 = (Button)findViewById(R.id.clickButton5);
mClickButton5.setOnClickListener(this);


// somewhere else in your code

public void onClick(View v) {
    switch (v.getId()) {
        case  R.id.clickButton1: {
            // do something for button 1 click
            break;
        }

        case R.id.clickButton2: {
            // do something for button 2 click
            break;
        }

        //.... etc
    }
}

这样,我的同事解释是整洁在他眼里,因为所有的onClick计算是在一个地方处理,而不是拥挤的onCreate方法。 但我看到的缺点是,即:

  1. 视图本身,
  2. 和可能位于由的onClick方法中所使用的onCreate任何其他对象将不得不被制成一个字段。

让我知道,如果你想了解更多的信息。 我没有完全回答你的问题,因为它是一个相当长的问题。 如果我发现一些网站,我会扩大我的回答,现在我只是给了一些经验。



Answer 2:

#1在其上不产生(但静态明显)的布局具有按钮,当我使用的最后一个频繁。

如果你在实践中,并在业务应用程序中使用它,在这里要额外注意,因为当你使用源obfuscater像ProGuard的,你需要以纪念您的活动这些方法如不进行模糊处理。

对于归档某种编译时的安全性的这种方法,看看Android的林特 ( 例如 )。


#2的优点和所有方法利弊几乎相同和教训应该是:

使用什么都最合适的还是感觉最直观的给你。

如果你必须分配同样OnClickListener到多个按钮的情况下,将其保存在类范围(#1)。 如果你需要一个简单的监听器按钮,使得一个匿名的实现:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Take action.
    }
});

我倾向于不执行OnClickListener的活动,这会有点混乱,不时(尤其是当你实现多个其他事件处理程序,没有人知道this是都在做)。



Answer 3:

我宁愿选择4,但它具有直观意义对我来说,因为我做的远远的Grails,Groovy和JavaFX的工作太多了。 视图和控制器之间的“魔”的连接在所有常见的。 它命名方法也很重要:

在视图中,所述的onClick方法添加到按钮或其他窗口小部件:

    android:clickable="true"
    android:onClick="onButtonClickCancel"

然后在类,处理方法:

public void onButtonClickCancel(View view) {
    Toast.makeText(this, "Cancel pressed", Toast.LENGTH_LONG).show();
}

再次,明确命名方法,你应该做的反正,和维护变得第二天性。

一个大好处是,你可以编写单元测试,现在的方法。 选项1可以做到这一点,但2和3是比较困难。



Answer 4:

最常用的方法是,匿名声明

    Button send = (Button) findViewById(R.id.buttonSend);
    send.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // handle click
        }
    });

你还可以创建View.OnClickListener对象,并在以后设置按钮,但你仍然需要重写例如OnClick方法

View.OnClickListener listener = new View.OnClickListener(){
     @Override
        public void onClick(View v) {
            // handle click
        }
}   
Button send = (Button) findViewById(R.id.buttonSend);
send.setOnClickListener(listener);

当你的活动实现OnClickListener接口必须重写的onClick(视图v)上的活动水平的方法。 然后,你可以assing将此活动作为监听器按钮,因为它已经实现了接口并重写的onClick()方法

public class MyActivity extends Activity implements View.OnClickListener{


    @Override
    public void onClick(View v) {
        // handle click
    }


    @Override
    public void onCreate(Bundle b) {
        Button send = (Button) findViewById(R.id.buttonSend);
        send.setOnClickListener(this);
    }

}

(IMHO)4个方法中使用时,多个按钮具有相同的处理程序,并且可以声明在活动类中的一个方法和XML布局分配此方法以多个按钮,也可以为一个按钮来创建一个方法,但在这种情况下,我喜欢申报活动类内部处理程序。



Answer 5:

选项1和2涉及使用内部类,这将使代码那种混乱。 选择2是有点乱,因为那里将是每一个按钮收听。 如果你有小的数字按钮,这是好的。 对于选项4,我认为这将是难以调试,你会要回去和第四XML和Java代码。 我个人使用选项3时,我有处理多个按钮点击。



Answer 6:

我的样品,在Android Studio中2.1测试

在XML布局定义按钮

<Button
    android:id="@+id/btn1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

Java的脉动检测

Button clickButton = (Button) findViewById(R.id.btn1);
if (clickButton != null) {
    clickButton.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            /***Do what you want with the click here***/
        }
    });
}


Answer 7:

为了让事情变得更简单的ASP问题2所述,您可以使用拉姆达法像这样保存下来可变存储,避免导航并在您的视图类

//method 1
findViewById(R.id.buttonSend).setOnClickListener(v -> {
          // handle click
});

但如果你想点击事件的方法同时应用到您的按钮。

您可以通过@D利用问题3。 陈回答。 但是不要忘记,以实现您的视图类View.OnClickListener

在其他使用问题3正确



Answer 8:

问题1 - 这些是处理视图点击的唯一途径。

问题2 -
选项1 /选项#4 - 这里没有选项#1和第4个选项多大区别。 我看到的唯一的区别是在一种情况下活动执行OnClickListener,而在其他情况下,会是一个匿名的实现。

选项#2 - 在此方法中,将产生一个匿名类。 这种方法是有点cumborsome,因为,你需要多次这样做,如果你有多个按钮。 对于匿名类,你必须要小心处理内存泄漏。

选项#3 - 虽然,这是一个简单的方法。 通常情况下,程序员尝试,直到他们写的,因此这种方法没有被广泛使用不使用任何避孕方法。 你会看到大部分人使用第4个选项。 因为它是在代码项清洁。



Answer 9:

也有可供选择的各种库的形式,可以使这个过程已经使用其他MVVM框架的人很熟悉。

https://developer.android.com/topic/libraries/data-binding/

显示了官方库,它允许你绑定喜欢这个按钮的例子:

<Button
    android:text="Start second activity"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="@{() -> presenter.showList()}"
/>


Answer 10:

第1步:创建一个XML文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnClickEvent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me" />
</LinearLayout>

第2步:创建MainActivity:

package com.scancode.acutesoft.telephonymanagerapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {

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

        btnClickEvent = (Button) findViewById(R.id.btnClickEvent);
        btnClickEvent.setOnClickListener(MainActivity.this);

    }

    @Override
    public void onClick(View v) {
        //Your Logic
    }
}

HappyCoding!



文章来源: Android: how to handle button click