Android-OnClick监听器在一个单独的类中
是否可以创建一个二级类来容纳OnClick侦听器?意思是不在活动类中创建Android-OnClick监听器在一个单独的类中,android,class,onclicklistener,Android,Class,Onclicklistener,是否可以创建一个二级类来容纳OnClick侦听器?意思是不在活动类中创建 我只是发现把OnClick的听者放在主活动类是很混乱的,我宁愿把他们放在单独的类中。谢谢你,你能行。但是只要想想,您就不会有对活动的引用,也不会有对它的属性(包括所有视图)的引用。(除非您将它们公开或使用getter方法进行访问) 另外,在侦听器上存储对活动或任何成员的引用时要格外小心,因为它们可能会避免垃圾收集器收回侦听器内存。与其将onCLicklistener放在单独的类中,不如尝试在onCreate()外部定义on
我只是发现把OnClick的听者放在主活动类是很混乱的,我宁愿把他们放在单独的类中。谢谢你,你能行。但是只要想想,您就不会有对活动的引用,也不会有对它的属性(包括所有视图)的引用。(除非您将它们公开或使用getter方法进行访问)
另外,在侦听器上存储对活动或任何成员的引用时要格外小心,因为它们可能会避免垃圾收集器收回侦听器内存。与其将
onCLicklistener
放在单独的类中,不如尝试在onCreate()外部定义onCLicklistener
例如:像这样
onCreate()
外部onCreate()
是的,你可以。然而,使侦听器成为一个内部类有一个优点——它可以直接访问活动类的字段和变量。如果将其作为一个单独的类,并且您的侦听器实际上需要访问5个视图,那么您的侦听器构造函数可能如下所示:
MyListener listener=新建MyListener(上下文、按钮、textView1、textView2、分级栏、图像视图)代码>
也有点笨重。如果你的听者很简单,那就把它作为一个单独的类。否则,可读性取决于您。当然,这是可能的。只需创建一个实现View.OnClickListener
的类,并将其设置为视图的侦听器。例如:
public class ExternalOnClickListener implements View.OnClickListener {
public ExternalOnClickListener(...) {
// keep references for your onClick logic
}
@Override public void onClick(View v) {
// TODO: add code here
}
}
然后将上述类的一个实例设置为侦听器:
view.setOnClickListener(new ExternalOnClickListener(...));
参数化构造函数是可选的,但很可能您需要传递一些信息才能真正使onClick(…)
逻辑工作
不过,匿名实现类通常更容易使用。只是一个想法。让我分享一下我是如何使用MVP编写代码的。这是编写干净代码的最佳方法。记住,每个类都必须有一个接口来控制它。我会给你看最简单的
假设您想在单击一个文本并从另一个类控制它。下面是它的工作原理。创建接口只是为了相互连接,您可以轻松地查看代码
为该MainActivity类创建接口
public interface MainActivityView {
void showToast();
}
为Presenter类创建另一个接口
public interface IMainPresenter<V extends MainActivityView> {
/*Generic Type is to make sure it comes from MainActivity class only and to avoid other class to access it.*/
void onAttach(V mainView);
void onButtonClick();
}
我只想告诉你。如果在类中创建对象,它将无法进行单元测试。这就是为什么你没有看到任何新的对象在android中调用。所以,您可以在Presenter类中使用单例模式(这里是惰性类型)。我将删除它的接口和泛型,以便清楚地看到它
public class MainPresenter {
private static final MainPresenter mainPresenter = new MainPresenter();
MainPresenter() {}
public static MainPresenter getInstance() {
return mainPresenter;
}
//Some methods here can be get it once you create an object with getInstance();
}
所以你可以像这样从MainActivity获取它的方法。
而不是像这样创建对象
MainPresenter mainPresenter = new MainPresenter();
MainPresenter mainPresenter = mainPresenter.getInstance();
你可以这样得到它
MainPresenter mainPresenter = new MainPresenter();
MainPresenter mainPresenter = mainPresenter.getInstance();
这里可以找到更多关于单例模式的示例,
最后,使用static不是一个很好的选择,因为无论您是否使用它,它都会占用内存空间。所以,您可以在应用程序层中创建对象,并通过类型转换获得它。我确信您不需要对应用程序层进行单元测试
public class AppLayer extends Application {
private MainPresenter mainPresenter;
@Override
public void onCreate() {
super.onCreate();
mainPresenter = new MainPresenter();
}
public MainPresenter getMainPresenter() {
return mainPresenter;
}
您需要在manifest.xml中给出应用程序中的类名
<application
android:name=".AppLayer"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
</application>
为了进一步学习,我建议你学习巴特刀,匕首2和坚实的原则。它将帮助您创建干净的编码。玩得开心李>
public类CommonClick{
公共静态void commonClick(最终AppCompatActivity上下文){
context.findviewbyd(R.id.appbar).setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
}
});
}
}
看看这个,我以前做过,但这不是我想要的。谢谢anyway@PztaruserSeven7s的链接应该可以回答您的问题。否则,请澄清您的问题。我遇到了完全相同的问题,并在这里解决了它:答案的不同之处在于,您仍然可以通过这种方式访问成员属性。如果你在答案中这样做,你会在保护变量或私有变量上失败。我明白你想说什么,我知道怎么做。但那不是我想要的。我不希望它出现在主要活动中。谢谢你,因为如果你经常这样做,主要的活动就会变得很长,很难阅读。通过将其分为不同的类,MainActivity的长度可以缩短。谢谢,这就是我所需要的。我是从这个开始的,但是我完全忘记了构造函数。如果你把这个类作为一个内部类来使用,你应该使这个类成为静态的。你将有一个对上下文的引用和被点击的视图。。。(视图方法支持getContext())
public class AppLayer extends Application {
private MainPresenter mainPresenter;
@Override
public void onCreate() {
super.onCreate();
mainPresenter = new MainPresenter();
}
public MainPresenter getMainPresenter() {
return mainPresenter;
}
<application
android:name=".AppLayer"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
</application>
MainPresenter mainPresenter = ((AppLayer)getApplication()).getMainPresenter();