我不是JAVA的专业人士,但是我发现自己因Android活动变得过大而发疯。
几页代码长度后,我发现自己一直来回滚动!
不仅OnClickhandlers可以发展壮大,而且很多代码往往会总结成更大的活动。
碎片对我来说不是解决方案。
通常,Java不允许将一个类拆分为多个文件,因此需要进行修改。
关于这一点,我浏览了很多stackoverflow线程,没有一个解决方案。
无论如何我都解决了,也许这对其他人有帮助。
这是Android的一个重点,因为我为所有菜单和按钮所占用的庞大的onClick Handler感到烦恼,但我想它同样适用于其他一般Java问题。
我遵循的一种简单方法是将View关注点移到一个单独的类中(我们称为ViewManager),并使Activity / Fragment仅作为控制器工作。
ViewManager通常负责-
扩大布局
获取所有视图的引用
在视图中显示数据
处理点击/触摸事件
动画制作
活动/片段仅负责-
提取数据并将其传递给ViewManager以显示数据
处理导航
将数据发布到服务器/数据库
对于触发控制器负责的动作的UI控件(例如,单击按钮时启动新活动),ViewManager会收到该单击并调用控制器中负责导航的方法。
如果要进一步消除样板代码(单击处理程序,findViewById()调用等),请考虑使用类似ButterKnife的库。
一种解决方案很简单,您可以将主类字段设为public
但是,这会使您的代码混乱,您应尽可能将字段设为私有。
除了可以更好地完成IDE的代码完成性之外,它还可以保护类免受非法的外部操纵。
现在对我来说,诀窍是内部类。
内部类可以访问其父级的私有字段,但是Java也不允许将内部类放入另一个文件中。
必须在父类内部定义它。
在这里,我开始进行挖掘并找到了可以被接受的解决方案。
如果这伤害了Java专家,我将不胜感激;)
诀窍是在自己的Java文件中创建"抽象类"。
我在惯例之外对它进行了命名,以使其突出:
MainActivity是我的主类(新内部类的父类)
在我的Parentclass中,我定义了此字段,一个普通的内部类,但扩展了新类:
private class inner extends InnerMainActivity_onClickHandlers{
public inner(MainActivity mainActivity)
{
super(mainActivity);
}
};
在我的MainActivity.onCreate中:
Button.setOnClickListener(new inner(this));
如您所见,如您所见,它将MainActivity(父类)传递给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侦听器提供了一个专用的类,可以将第二个类用于其他用途。