安卓:如何处理按钮点击23

在非Java和非Android领域有扎实的经验,我正在学习Android。

我对不同的领域有很多困惑,其中之一是如何处理按钮点击。至少有4种方法可以做到这一点(!!!),它们在这里简要列出

为了保持一致性,我将列出它们:

  1. 在活动中具有该类的成员,并将其分配给将处理活动方法中逻辑的实例。View.OnClickListeneronClickonCreate

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

  3. 在活动本身中实现“onClickListener”,并将“this”指定为按钮的侦听器。对于活动具有少量按钮的情况,应分析按钮 ID 以执行“onClick”处理程序以获取正确的按钮

  4. 在实现“onClick”逻辑的活动上使用公共方法,并将其分配给活动 xml 声明中的按钮

问题 #1:

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

对我来说,最直观的方式是最新的:它需要最少的代码来键入,并且最易读(至少对我来说)。

不过,我没有看到这种方法被广泛使用。使用它的缺点是什么?

问题 #2:

这些方法的优缺点是什么?请分享您的经验或一个好的链接。

欢迎任何反馈!

附言:我试图谷歌并为这个主题找到一些东西,但我找到的唯一一件事是描述“如何”做到这一点,而不是为什么它是好还是坏。


答案 1

问题1:不幸的是,你说最直观的那个在Android中使用最少的。据我所知,您应该将UI(XML)和计算功能(Java类文件)分开。它还使调试更容易。实际上,以这种方式阅读并考虑Android imo要容易得多。

问题2:我相信主要使用的两个是#2和#3。我将使用按钮单击按钮作为示例。

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***
            }
        });

这是我最喜欢的,因为它有onClick方法,就在使用findViewById设置按钮变量的位置旁边。看起来非常整洁,处理此单击按钮视图的所有内容都位于此处。

我的同事评论的一个骗局是,想象你有很多观点需要点击听众。您可以看到您的onCreate的长度会很长。这就是为什么他喜欢使用:

3

假设你有,5点击按钮:

确保您的活动/片段实现 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. 并且可能位于 onCreate 中由 onClick 方法使用的任何其他对象都必须制作成一个字段。

如果您想了解更多信息,请告诉我。我没有完全回答你的问题,因为这是一个很长的问题。如果我找到一些网站,我会扩展我的答案,现在我只是提供一些经验。


答案 2

#1当布局上有未生成的按钮(但显然是静态的)时,我经常使用最后一个按钮。

如果您在实践中和业务应用程序中使用它,请在此处格外小心,因为当您使用像 ProGuard 这样的源混淆器时,您需要在活动中将这些方法标记为不被混淆。

要使用此方法存档某种编译时安全性,请查看 Android Lint示例)。


#2所有方法的优缺点几乎相同,教训应该是:

使用最合适或最直观的方法。

如果必须将相同的按钮分配给多个按钮实例,请将其保存在类作用域 (#1) 中。如果你需要一个简单的 Button 监听器,做一个匿名实现:OnClickListener

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

我倾向于不在活动中实现,这有时会让人感到困惑(特别是当你实现多个其他事件处理程序并且没有人知道所有事件都在做什么时)。OnClickListenerthis


推荐