由于我已经熟悉使用活动和自定义视图,我一直不得不决定哪个代码与View和它的父Activity相关.添加两者都需要访问的自定义对象,并且有关如何构造代码的选项是无穷无尽的.这是我的问题的具体细节:
相关的类/文件:
GameActivity扩展Activity:它使用的布局包含一些自定义视图.
MapView扩展了View:它包含在GameActivity使用的布局中
World:定义自定义World对象的自定义类
预期结果:
GameActivity将MapView中的布局拉出来.MapView的onDraw()函数使用来自World对象的信息在画布上绘制地图.
问题:
MapView需要的World对象是从以前保存的文件加载的.我可以通过多种不同的方式将该对象传递给MapView,这就是我变得优柔寡断的地方.我经历了以下迭代.(注意,它们都有效.我正在寻找的是单向使用另一种方式的原因.)
Version1:
GameActivity:它所做的就是setContentLayout(layout_with_mapview_in_it.xml)
MapView:具有从文件加载World对象的所有代码,并使用它来引用所需的绘图参数
World:一个简单的自定义类,其构造函数中包含3个参数
然后我决定从文件加载World对象应该是World类本身的一个方法,而不是在MapView的onCreate()方法中完成的方法.因为加载一个世界文件是你永远不会没有World对象的东西,所以它应该是class方法是有意义的.所以我在World类中创建了一个loadWorld(String world_name)方法.现在文件看起来像这样:
Version2:
GameActivity:它所做的就是setContentLayout(layout_with_mapview_in_it.xml)
MapView:使用构造函数创建一个新的World对象,然后调用它的loadWorld()方法用文件信息更新它
World:一个简单的自定义类,在它的构造函数中有3个参数,还有一个loadWorld()方法
最后,我决定只有绘图活动应该在MapView中.拥有一个World对象的重点是能够传递它,对吧?所以我将World构造/加载移出View并进入Activity.这导致必须在MapView中创建一个setter方法,以便能够从创建它的父活动中传递World对象.
Version3:
GameActivity:设置布局,创建一个World对象并调用它的loadWorld()方法从文件中加载它.通过Id引用MapView,然后调用MapView的setWorld()方法来传递World对象的实例
MapView:World对象是从外部设置的.使用此对象的信息绘制地图
World:一个简单的自定义类,在它的构造函数中有3个参数,还有一个loadWorld()方法.
好的,这就是我现在所处的位置.我的问题是,虽然我喜欢我所选择的约定,但是我只选择了包含绘图相关代码,并将类相关的方法保存在自己的类中 - 当我切换到该方法时,我突然创建临时对象经常将对象从活动传递到活动以查看等等.这似乎是一个更多的开销,但同时这是抽象的整个点吗?抽象出一个类,然后你可以从中实例化一个对象并传递它.然而在某种程度上,在我看来,我抽出的东西越多,处理对象就越复杂.
我想我在这里要问的是,我是不是因为没有从MapView本身的文件中加载World而使事情变得更复杂?我是不是很顽固不想拥有涉及从View类中的文件中读取对象的代码?将它放在自己的类或活动中是否更好?做出这些决定时我需要考虑什么?有没有解决我的困境,我甚至都不知道?
我认为答案将是个人偏好,但我想知道是否有某些惯例以某种方式做到这一点,或者如果有充分的理由为什么要以某种方式构建.我一直在尝试搜索这个问题的答案,但我认为我使用的是错误的搜索字词.我一直在讨论如何构建活动/视图结构的内容,但没有关于内部代码的内容.当有代码时,不可避免地会有人教授如何在活动之间或活动与视图之间传递数据等.我知道所有这些方法.我只是不知道使用哪一个.
我一直在关注的一些链接:
具有多个视图的Android应用程序 - 最佳实践?
Android - 活动与观看
Android活动和视图
Android:什么是更好的 - 多个活动或手动切换视图?
编辑:有关应用程序结构和代码示例的更多详细信息
GameActivity:
/*IMPORT STATEMENTS REMOVED*/
public class GameActivity extends Activity implements OnTouchListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game);
Log.d("LOGCAT", "GameActivity Started");
//get the world_name from …Run Code Online (Sandbox Code Playgroud) android ×1