目前我有一个自定义 View :
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
类中使用的对象,上面的代码 fragment 有效但我不知道这是否优雅/流行的方法?
我想通过构造函数传递对象,但我不能这样做,因为 Android 只调用 MyView(Context c, AttributeSets attrs)
构造函数,它不会调用版本如果我有 MyView(Context c, AttributeSets attrs, DBConnection db)
一个。
请帮忙
最佳答案
当我遇到这种情况时,我倾向于采取在创建 View 之后注入(inject)可显示数据的方法。因此,如果您的 View 需要显示一串文本,您可以通过使用 findViewById
查找 View
来注入(inject)该字符串或在创建 Activity 期间从中提取该字符串的对象然后调用适当的 setter 。
至于“有没有更好的方法来做到这一点”,我会担心将 dbconnection
传递到 View 类中。它没有通过“气味”测试,看起来你正在将你的逻辑泄漏到你的 View 中。对我来说更有意义的说法是,给您的 View 一个 Cursor
或您在 Activity
中填充的某个对象。这可以防止构建与非常特定的使用/场景紧密耦合的自定义 View 。
另一方面,您必须决定 View 的可重用程度。对于这个特定项目来说,快速而肮脏的策略可能是合适的。
关于Android:如何将附加对象引用传递给自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9270874/