2015-04-06 78 views
21

我的理解是,当我创建侦听点击一个按钮对象我必须:setOnclickListener VS OnClickListener VS View.OnClickListener

  1. 创建按钮对象
  2. 使用OnClickListner让它听用户点击
  3. 使用的onClick用户后执行的操作点击按钮

现在

  • 哪里setOnClickListener配合到上述逻辑?
  • 哪一个实际听按钮点击?
  • setOnclickListener?
  • ONclickListener?
  • View.OnClickListener?
  • 那3个之间有什么区别?

以下是我在Android开发人员发现:

The example below shows how to register an on-click listener for a Button. 

// Create an anonymous implementation of OnClickListener 
private OnClickListener mCorkyListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
}; 

protected void onCreate(Bundle savedValues) { 
    ... 
    // Capture our button from layout 
    Button button = (Button)findViewById(R.id.corky); 
    // Register the onClick listener with the implementation above 
    button.setOnClickListener(mCorkyListener); 
    ... 
} 

您也可能会发现更方便地实现OnClickListener作为活动的一部分。这将避免额外的类加载和对象分配。例如:

public class ExampleActivity extends Activity implements OnClickListener { 
    protected void onCreate(Bundle savedValues) { 
     ... 
     Button button = (Button)findViewById(R.id.corky); 
     button.setOnClickListener(this); 
    } 

    // Implement the OnClickListener callback 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
} 

回答

16

逻辑很简单。 setOnClickListener属于步骤2

  1. 您创建按钮
  2. 您创建的OnClickListener实例*就像在例子的完成,并覆盖onClick - 方法。
  3. 您分配OnClickListener到该按钮使用btn.setOnClickListener(myOnClickListener);在你的碎片/活动onCreate - 方法。
  4. 当用户点击该按钮时,所分配的OnClickListeneronClick函数被调用。

*如果您使用import android.view.View;,请使用View.OnClickListener。如果您import android.view.View.*;import android.view.View.OnClickListener;您尽可能使用OnClickListener

另一种方式是让你活动/片段从OnClickListener继承。通过这种方式,您可以将片段/活动分配为按钮的侦听器,并将onClick作为成员函数来实现。

2
  1. 首先,有View.OnClickListenerOnClickListener之间没有什么区别。如果你直接使用View.OnClickListener,那么你不需要写入 -

    import android.view.View。OnClickListener

  2. 您通过setOnclickListener()将OnClickListener实例(例如myListener命名对象)设置为侦听器。当一个click事件被激发时,myListener被通知,并且onClick(View view)方法被调用。那就是我们自己的任务。 希望这可以帮助你。

37

假设我们有例如

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(mCorkyListener); 
     button2.setOnClickListener(mCorkyListener); 
     button3.setOnClickListener(mCorkyListener); 

    } 

    // Create an anonymous implementation of OnClickListener 
    private View.OnClickListener mCorkyListener = new View.OnClickListener() { 
     public void onClick(View v) { 
      // do something when the button is clicked 
      // Yes we will handle click here but which button clicked??? We don't know 

     } 
    }; 

} 

所以我们会做3个按钮?

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(mCorkyListener); 
     button2.setOnClickListener(mCorkyListener); 
     button3.setOnClickListener(mCorkyListener); 

    } 

    // Create an anonymous implementation of OnClickListener 
    private View.OnClickListener mCorkyListener = new View.OnClickListener() { 
     public void onClick(View v) { 
      // do something when the button is clicked 
      // Yes we will handle click here but which button clicked??? We don't know 

      // So we will make 
      switch (v.getId() /*to get clicked view id**/) { 
       case R.id.corky: 

        // do something when the corky is clicked 

        break; 
       case R.id.corky2: 

        // do something when the corky2 is clicked 

        break; 
       case R.id.corky3: 

        // do something when the corky3 is clicked 

        break; 
       default: 
        break; 
      } 
     } 
    }; 

} 

或者,我们可以这样做:

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // do something when the corky is clicked 
      } 
     }); 
     button2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // do something when the corky2 is clicked 
      } 
     }); 
     button3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // do something when the corky3 is clicked 
      } 
     }); 

    } 

} 

或者,我们可以实现View.OnClickListener,我认为这是最好的办法:

public class MainActivity extends ActionBarActivity implements View.OnClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 


     // Capture our button from layout 
     Button button = (Button)findViewById(R.id.corky); 
     Button button2 = (Button)findViewById(R.id.corky2); 
     Button button3 = (Button)findViewById(R.id.corky3); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(this); 
     button2.setOnClickListener(this); 
     button3.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 
     // do something when the button is clicked 
     // Yes we will handle click here but which button clicked??? We don't know 

     // So we will make 
     switch (v.getId() /*to get clicked view id**/) { 
      case R.id.corky: 

       // do something when the corky is clicked 

       break; 
      case R.id.corky2: 

       // do something when the corky2 is clicked 

       break; 
      case R.id.corky3: 

       // do something when the corky3 is clicked 

       break; 
      default: 
       break; 
     } 
    } 
} 

最后这里没有真正的差异就“比其他方式更好”

+0

虽然第二种方式不会比其他方式稍好一些吗?第一种和第三种方法首先找出哪个视图被点击并随后采取行动,而第二种方式则可以直接进入视图。好奇看别人说什么,因为我诚实地不是100%确定我的逻辑是否正确。 – CodyEngel

+1

@赫斯基哈斯基。知道什么时候关注表现,什么时候关注表现。问问自己:用户点击的频率如何?当用户点击时什么是可接受的响应时间?我的目标设备每秒执行多少条Java指令?只有少量的指示才能确定哪个视图是重要的?还要考虑你将要做的工作来处理点击。计算OS内部的代码,可以执行数千,数万,甚至数十万个java指令。我想你会看到这个去哪里... – ToolmakerSteve

+0

是否可以同时使用它们,我的意思不仅是“实现View.OnClickListener”,还有“SetOnClickListener” – Patzu

2

查看是所有小部件的超类和OnClickListener接口都属于这个类。所有小部件都继承这一点。 View.OnClickListener与OnClickListener相同。您将不得不重写此侦听器的onClick(View视图)方法,以实现您想要的按钮操作。

告诉安卓听单击事件窗口小部件,你需要做的:

widget.setOnClickListener(this); // If the containing class implements the interface 
// Or you can do the following to set it for each widget individually 
widget.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // Do something here 
    } 
}); 

“查看”参数中的onClick()方法只是会让Android知道,一个观点已被点击过。它可以是Button或TextView或其他东西。您可以为每个小部件设置一个OnClickListener,或者仅仅让包含所有这些小部件的类实现该接口。在这种情况下,您将为所有窗口小部件提供一个通用的onClick()方法,您只需检查传入该方法的视图的ID,然后将其与每个所需元素的ID匹配即可为这个元素采取行动。

4

请注意,为了简单起见,我已参考仅第一代码段即

// Create an anonymous implementation of OnClickListener 
private OnClickListener mCorkyListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
}; 

protected void onCreate(Bundle savedValues) { 
    ... 
    // Capture our button from layout 
    Button button = (Button)findViewById(R.id.corky); 
    // Register the onClick listener with the implementation above 
    button.setOnClickListener(mCorkyListener); 
    ... 
} 

setOnClickListener(View.OnClickListener l)是View类的公共方法。 Button类扩展了View类,因此可以调用setOnClickListener(View.OnClickListener l)方法。

setOnClickListener注册一个回调,当点击视图(在你的情况下按钮)时被调用。这个答案应该回答你的前两个问题:

1. setOnClickListener在哪里符合上面的逻辑?

Ans。它在按钮被点击时注册一个回调。 (在下一段中详细解释)。

2.哪一个实际听按钮点击?

Ans。 setOnClickListener方法是实际听按钮点击的方法。

当我说它注册了一个回调被调用,我的意思是它会运行View.OnClickListener l这是该方法的输入参数。在您的情况下,它将被mCorkyListenerbutton.setOnClickListener(mCorkyListener);提到然后将执行内

// Create an anonymous implementation of OnClickListener 
private OnClickListener mCorkyListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
}; 

移动上进一步提到onClick(View v)的方法中,OnClickListener是用于待调用的回调接口的定义,当你的情况的图(按钮)被点击。简单地说,当您单击该按钮时,将执行mCorkyListener(因为它是OnClickListener的实施)中的方法。但是,OnClickListener只有一个方法是OnClick(View v)。因此,无论在点击按钮时需要执行的操作都必须在此方法中进行编码。

现在你知道setOnClickListenerOnClickListener的含义,我相信你可以自己区分这两者。第三项View.OnClickListener实际上是OnClickListener本身。您之前有View.的唯一原因是因为程序开始时的import陈述存在差异。如果您只有import android.view.View;作为进口说明,您将不得不使用View.OnClickListener。如果您提及以下任一进口对账单: import android.view.View.*;import android.view.View.OnClickListener;您可以跳过View.并简单地使用OnClickListener

相关问题