与界面的两种方式有什么不同?

时间:2013-12-06 15:33:16

标签: android onitemclicklistener implements

沿着界面写一个或不是这样的,

spinner.setAdapter(this.mAdapter); 
OnItemSelectedListener spinnerListener = new OnItemSelectedListener(this,this.mAdapter);  
spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){ 
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) {
// TODO Auto-generated method stub
Toast.makeText(parent.getContext(),"The planet is "+  parent.getItemAtPosition(pos).toString(),Toast.LENGTH_LONG).show();  
textViewa.setText("You choose :"+ " " + mAdapter.getItem(arg2));
arg0.setVisibility(View.VISIBLE);    
 }    
 public void onNothingSelected(AdapterView<?> arg0) {    
// TODO Auto-generated method stub  
    textViewa.setText("NONE");
            arg0.setVisibility(View.VISIBLE);    
     }    
}); 

和这一个,

public class SpinnerActivity extends Activity implements OnItemSelectedListener {     ...  
    public void onItemSelected(AdapterView<?> parent, View view,  int pos, long id) {         // An item was selected. You can retrieve the selected item using         // parent.getItemAtPosition(pos)     }      public void onNothingSelected(AdapterView<?> parent) {         // Another interface callback     } }

有什么不同?

3 个答案:

答案 0 :(得分:1)

  

有什么不同?

第一个选项创建一个实现接口的匿名内部类。当您需要多个显着不同的OnItemSelectedListener实现时,这非常有用。

在第二个选项中,您的Activity实现OnItemSelectedListener,因此(假设您将this传递给每个Spinners),每个Spinner将转到相同的OnItemSelectedListener实例。

  

这是更标准的写作?

这取决于您的个人偏好和您的使用案例。 如果你的所有Spinners都有类似的行为或简单的行为onItemSelected()将会很短,那么后一种选择就可以了。

但是,如果您的每个Spinner都非常独特并且在onItemSelected()中共享很少的公共代码,那么为每个Spinner创建一个新的OnItemSelectedListener实例可能是一个更好的设计决策。

答案 1 :(得分:1)

使Activity实现一个接口的好处是你将有一个较少的对象来分配和收集。但匿名实施并不是一个很大的缺点。 正如tyczj所说,这确实是一个偏好问题。如果它确实触发可见性,我会将其设为匿名,这样您就不必在Activity类中搜索重写的方法。

答案 2 :(得分:1)

它们都是等价的,就像tyczj所说的那样,这是一个偏好问题。有时实现界面而不是创建匿名内部类的原因是首选,例如,如果您有多个Buttons,您希望从中获取其点击事件。如果为每个人定义匿名内部类,则需要创建额外的Objects。但正如我之前所说,这两种模式在功能上是相同的。