2011-09-23 86 views
2

我对Android有点新鲜,如果我在一个类中保留几个OnClickListenres,它会改进我的应用程序。我所thiking的是这样的:在一个类中保留多个OnClickListeners

Public class OnClickListeners { 

public Button.OnClickListener open; 
public Button.OnClickListener doSomethingElse; 
public Button.OnClickListener etc; 

    public OnClickListeners() { 
     open = new Button.OnClickListener() 
     { 
       public void onClick(View view) 
       { 
        DetailList.SetId(view.getId()); 
        Intent intent = new Intent(view.getContext(), DetailList.class); 
        startActivityForResult(intent, 100); 
       } 
     }; 
    } 
} 

因此,我可以再引用它在其他B类这样

button1.setOnClickListener(OnClickListeners.open); 

任何虽然该怎么办呢? Android SDK中似乎是对我,我现在可以弄明白,现在大约2天...

感谢您的任何建议和帮助

+0

你为什么想保持他们在一个班?我宁愿将它们放在一个单独的包中,单个文件中只有一个听众。 – ernazm

+0

什么建议可能是一个糟糕的IDEA,但它不是一个糟糕的问题,所以它不应该被低估。我从+1得到补偿。 – NickT

回答

1

有一种简单的方法可以将所有匿名类整合到一个中,并打开视图。这个工作最好,如果你提前知道哪些按钮将使用clicklistener时间:

public class AndroidTestClickListenerActivity extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Button button1 = (Button) findViewById(R.id.button1); 
     button1.setOnClickListener(new MyClickListener()); 

     Button button2 = (Button) findViewById(R.id.button2); 
     button2.setOnClickListener(new MyClickListener()); 

     Button button3 = (Button) findViewById(R.id.button3); 
     button3.setOnClickListener(new MyClickListener()); 
    } 


} 

class MyClickListener implements View.OnClickListener { 
    @Override 
    public void onClick(View arg0) { 
     switch (arg0.getId()) { 
      case R.id.button1: 
       // do soemthign for button1 
       break; 
      case R.id.button2: 
       // do something for button2 
       break; 
      case R.id.button3: 
       // do something for button3 
       break; 
      default: 
       // do something for any other button 

     } 

    } 
} 
+1

很酷的感谢这不是我正在寻找的东西,但是其他人说服我,我的想法保存在一个单独的文件是错误的,这是对我来说“最干净的方式”。 – Alone89

+0

如果您将点击仅用于产生其他活动等静态内容,则可以在单独的文件中实现MyClickListener。但是,正如彼得所说,如果你正在从事与活动有关的事物,这将不会有效。 – Ian

0

你可以,但你必须声明OnClickListener作为静若你想以这种方式使用它。

public static Button.OnClickListener openListener = new Button.OnClickListener() { 
    public void onClick(View view) { 

    } 
}; 

然后你可以使用:

button1.setOnClickListener(OnClickListeners.openListener); 

正如其他用户注意 - 这种方法是最像不好。你应该在同一视图上处理视图监听器,然后调用另一个方法,如openActivity()。我不会做到这一点 - 你也开扩从另一个活动的活动,这将可能不会在所有或会搞乱行动历史堆栈

0

工作,你可以写

button1.setOnClickListener(new OnClickListeners().open); 

代替,但这对我来说似乎是一个奇怪的架构。我建议你保持1名听众在一个文件中,有1包所有的人,并使用类似

button1.setOnClickListener(new OpenListener()); 
0

你方法的问题是,通常听众有操纵一些数据,是部分UI元素所在的类。

如果您将侦听器取出并放入单独的类中,则还必须提供大量对要处理数据的对象的引用。这将创建很多相互依赖的类,这不会很好。

恕我直言,最简洁的方法是使用匿名内部类。

0

由于没有解决方案的实际做了什么,我想实现 - 我需要第二个(或多个)onClickListener是没有覆盖已将分配给控件的onClickListeners。

这里是java类,我写了这个目的:

https://gist.github.com/kosiara/c090dcd684ec6fb2ac42#file-doubleclicklistenerimagebutton-java

public class DoubleClickListenerImageButton extends ImageButton { 

    View.OnClickListener mSecondOnClickListener; 

    public DoubleClickListenerImageButton(Context context) { 
     super(context); 
    } 

    [...] 

    public void setSecondOnClickListener(View.OnClickListener l) { 
     mSecondOnClickListener = l; 
    } 

    @Override 
    public boolean performClick() { 
     if (mSecondOnClickListener != null) 
      mSecondOnClickListener.onClick(this); 
     return super.performClick(); 
    } 

    @Override 
    public boolean performContextClick() { 
     if (mSecondOnClickListener != null) 
      mSecondOnClickListener.onClick(this); 
     return super.performContextClick(); 
    } 
}