有非Java和非Android系统的区域了坚实的经验,我学习的Android。
我有很多不同的区域的混乱,其中之一是如何处理按钮点击。 有这样做的至少4路(!),他们简单地列出这里
出于一致性的目的,我将一一列举:
具有的成员View.OnClickListener
在活动类,并将其分配到一个实例,将处理onClick
在逻辑onCreate
活性的方法。
在“的onCreate”活动方法创建“onClickListener”,并将其分配给使用按钮setOnClickListener
在活动实施“onClickListener”本身并指派“本”为按钮的监听器。 因为如果活动有几个按钮的情况下,按钮的ID进行分析,以执行的“onClick”处理程序正确的按钮
对实现的“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方法。 但我看到的缺点是,即:
- 视图本身,
- 和可能位于由的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