【问题标题】:Java - Android - Split Activity/Class into multiple files for better organization (solution)Java - Android - 将 Activity/Class 拆分为多个文件以便更好地组织(解决方案)
【发布时间】:2015-02-01 18:43:30
【问题描述】:

我不是 JAVA 专业人士,但我发现自己对 Android 活动变得过大感到疯狂。
经过几页代码长度后,我发现自己永久地来回滚动!
不仅 OnClickhandler 会变得庞大,而且很多代码往往会汇总为更大的活动。
碎片对我来说不是解决方案。
一般来说,Java 不允许将一个类拆分为多个文件,因此需要 hack。

我浏览了很多关于此的 stackoverflow 线程,没有一个有解决方案。
无论如何我都解决了,也许这对其他人有帮助。

这有点侧重于 Android,因为我对所有菜单和按钮的巨大 onClick 处理程序感到厌烦,但我想它也适用于其他一般 Java 问题。

【问题讨论】:

    标签: java android external onclicklistener inner-classes


    【解决方案1】:

    我遵循的一种简单方法是将 View 关注点移动到一个单独的类中(我们称之为 ViewManager),并使 Activity/Fragment 仅作为控制器工作。

    ViewManager 通常负责 -

    • 膨胀布局
    • 获取所有视图的引用
    • 在视图中显示数据
    • 处理点击/触摸事件
    • 动画

    Activity/Fragment 只负责 -

    • 获取数据并将其传递给 ViewManager 以显示它
    • 处理导航
    • 将数据发布到服务器/数据库

    对于触发控制器负责的操作的 UI 控件,例如在单击按钮时启动新活动,ViewManager 接收单击并调用控制器中负责导航的方法。

    如果您想进一步消除样板代码(点击处理程序、findViewById() 调用等),请考虑使用 ButterKnife 等库。

    【讨论】:

      【解决方案2】:

      一种解决方法很简单,可以将主类字段设为public
      但是,这会弄乱您的代码,您应该尽可能将字段保密。 除了更好地完成 IDE 代码之外,它还可以保护类免受外部非法操纵。

      现在对我来说诀窍是内部类。
      内部类可以访问其父级的私有字段,但是 Java 也不允许将内部类放入另一个文件中。
      它必须在父类内部定义。
      这是我开始挖掘并找到可能被认为可以接受的解决方案的地方。
      如果这伤害了 Java 专家,我会很感激不要被否决;)

      诀窍是在自己的 java 文件中创建一个“抽象类”。
      我将它命名为有点超出惯例以使其脱颖而出:InnerMainActivity_onClickHandlers.java
      MainActivity 是我的主类(新内部类的父类)

      在我的 Parentclass 中,我定义了这个字段,一个普通的内部类,但 扩展 新类:

      private class inner extends InnerMainActivity_onClickHandlers{
          public inner(MainActivity mainActivity)
          {
              super(mainActivity);
          }
      };
      

      在我的 MainActivity.onCreate 中:

      Button.setOnClickListener(new inner(this));
      

      如您所见,它会将 MainActivity(Parent)传递给 Inner 类。

      现在是 Inner 类本身:

      public abstract class InnerMainActivity_onClickHandlers implements View.OnClickListener
      {
          private final MainActivity main;
      
          public InnerMainActivity_onClickHandlers(MainActivity mainActivity)
          {
              this.main = mainActivity;
          }
      
          @Override
          public void onClick(View view)
          {
             // here implement the listener
          }
      }
      

      要使这项工作如宣传的那样,您需要将 MainActivity/Parent 的 private 属性更改为 protected
      现在扩展的内部类具有对父字段的访问权限,但是任何外部类仍然不能访问它。

      在这种情况下,我有一个专门用于所有 onclick 侦听器的类,第二个类可以用于其他事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        相关资源
        最近更新 更多