Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-OnClick监听器在一个单独的类中_Android_Class_Onclicklistener - Fatal编程技术网

Android-OnClick监听器在一个单独的类中

Android-OnClick监听器在一个单独的类中,android,class,onclicklistener,Android,Class,Onclicklistener,是否可以创建一个二级类来容纳OnClick侦听器?意思是不在活动类中创建 我只是发现把OnClick的听者放在主活动类是很混乱的,我宁愿把他们放在单独的类中。谢谢你,你能行。但是只要想想,您就不会有对活动的引用,也不会有对它的属性(包括所有视图)的引用。(除非您将它们公开或使用getter方法进行访问) 另外,在侦听器上存储对活动或任何成员的引用时要格外小心,因为它们可能会避免垃圾收集器收回侦听器内存。与其将onCLicklistener放在单独的类中,不如尝试在onCreate()外部定义on

是否可以创建一个二级类来容纳OnClick侦听器?意思是不在活动类中创建


我只是发现把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();