Java - Android - 将Activity Activity/Class拆分为多个文件以便更好地组织(解决方案)

Joh*_*ohn 10 java android external inner-classes onclicklistener

我不是JAVA的PRO,但我发现自己因为Android活动太大而变得疯狂.
在几页代码长度后,我发现自己永久地来回滚动!
不仅OnClickhandlers可以增长很多,只是很多代码往往会在更大的活动中总结.
碎片对我来说不是解决方案.
通常,Java不允许将类拆分为多个文件,因此需要进行黑客攻击.

我浏览了很多关于它的stackoverflow线程,没有人有解决方案.
无论如何我解决了,也许这有助于其他人.

这是一个Android专注,因为我对我的所有菜单和按钮的巨大的onClick处理程序感到厌烦,但我想这将适用于其他一般Java问题以及相同的方式.

Mus*_*Mus 5

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

ViewManager通常负责-

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

活动/片段仅负责-

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

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

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


Joh*_*ohn 3

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

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

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

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

private class inner extends InnerMainActivity_onClickHandlers{
    public inner(MainActivity mainActivity)
    {
        super(mainActivity);
    }
};
Run Code Online (Sandbox Code Playgroud)

在我的 MainActivity.onCreate 中:

Button.setOnClickListener(new inner(this));
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,正如您所看到的,它将MainActivity(Parent)传递给内部类。

现在是内部类本身:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

要使其按广告所示工作,您需要将privateMainActivity/Parent 的属性更改为protected.
现在扩展的内部类具有对父字段的访问权限,但是任何外部类仍然无法访问它。

在本例中,我为所有 onclick 侦听器提供了一个专用类,第二个类可用于其他用途。