Android:如何处理按钮点击

Bud*_*dda 88 java android android-button onclicklistener

我在非Java和非Android领域拥有丰富的经验,我正在学习Android.

我对不同领域有很多困惑,其中之一就是如何处理按钮点击.至少有4种方法(!!!),这里简要列出

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

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

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

  3. 在活动本身中实现'onClickListener'并将'this'指定为按钮的监听器.对于活动按钮很少的情况,应该分析按钮ID以执行适当按钮的'onClick'处理程序

  4. 对实现'onClick'逻辑的活动有公共方法,并将其分配给activity xml声明中的按钮

问题#1:

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

对我来说,最直观的方式是最新的方式:它需要输入最少量的代码并且是最可读的(至少对我而言).

虽然,我没有看到这种方法被广泛使用.使用它有什么用处?

问题2:

每种方法的优缺点是什么?请分享您的经验或良好的链接.

欢迎任何反馈!

PS我试过谷歌并找到了一些关于这个话题的东西,但我发现的唯一的东西就是描述"如何"做到这一点,而不是为什么它好或坏.

Dog*_*n C 136

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

问题2:我认为主要使用的是#2和#3.我将使用Button 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***
            }
        });
Run Code Online (Sandbox Code Playgroud)

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

我的同事评论的一个骗局是,想象你有很多需要onclick听众的观点.你可以看到你的onCreate的篇幅会很长.这就是他喜欢使用的原因:

3

说你有,5 clickButtons:

确保您的Activity/Fragment实现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
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方式,因为我的同事解释他的眼睛更整洁,因为所有onClick计算都在一个地方处理,而不是拥挤onCreate方法.但我看到的缺点是:

  1. 观点自己,
  2. 并且可能必须将onClick方法使用的onCreate中的任何其他对象放入字段中.

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


Luk*_*uth 10

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

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

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


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

使用最合适或最直观的方式.

如果必须将相同的内容分配OnClickListener给多个按钮实例,请将其保存在类范围内(#1).如果您需要一个简单的Button监听器,请进行匿名实现:

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

我倾向于不在OnClickListener活动中实现,这有时会让人感到有些困惑(特别是当你实现多个其他事件处理程序而没有人知道this所做的事情时).


Ste*_*man 8

我更喜欢选项4,但它对我来说很直观,因为我在Grails,Groovy和JavaFX中做了太多工作.视图和控制器之间的"魔术"连接是共同的.为方法命名很重要:

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

    android:clickable="true"
    android:onClick="onButtonClickCancel"
Run Code Online (Sandbox Code Playgroud)

然后在类中,处理方法:

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

再次,清楚地命名方法,无论如何应该做的事情,维护成为第二性质.

一个很大的优点是您现在可以为该方法编写单元测试.选项1可以做到这一点,但2和3更难.