目前我有自定义视图:
public class MyView extends View {
public MyView(Context c, AttributeSet attrs) {
super(context, attrs);
}
....
....
}
现在,我想访问一个与Android无关的对象,比如数据库连接,我该怎么做? 我目前的解决方案是执行以下操作
public class MyView extends View {
DBConnection connection;
public MyView(Context c, AttributeSet attrs) {
super(context, attrs);
}
....
....
public void setDBConnection(DBConnection c)
this.connection = c;
}
public void onDraw(Canvas canvas) {
this.connection.ensureUser();
...
....
}
我的问题是,有更好的方法吗?目前我需要设置(通过setter)以确保设置将在MyView
类中使用的对象,上面的代码片段有效,但我不知道这是否是优雅/流行的方法?
我正在考虑通过构造函数传递对象,但是我不能这样做,因为Android只调用MyView(Context c, AttributeSets attrs)
构造函数,如果我有MyView(Context c, AttributeSets attrs, DBConnection db)
一个,它就不会调用该版本
请帮助
答案 0 :(得分:1)
当我遇到这样的情况时,我倾向于在创建视图后采用注入可显示数据的方法。因此,如果您的视图需要显示一串文本,则在创建活动期间通过使用View
查找findViewById
然后调用相应的setter来注入该字符串或从中拉出字符串的对象
至于“有没有更好的方法”,我会担心将dbconnection
传递给视图类。它没有通过“气味”测试,似乎你正在将你的逻辑泄漏到你的视野中。对我来说更有意义的是,在Cursor
内为您的观点提供Activity
或某些您填写的对象。这可以防止构建与特定用途/场景紧密耦合的自定义视图。
另一方面,您必须决定您希望视图的可重用性。对于这个特定的项目来说,快速和肮脏是适当的机智。