1

目前我有一个自定义视图:

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();
     ...
     ....
  }

我的问题是有没有更好的方法来做到这一点?目前我需要设置(通过设置器)以确保设置将在MyView类中使用的对象,上面的代码片段有效,但我不知道这是否是优雅/流行的方法?

我正在考虑通过构造函数传递对象,但我不能这样做,因为Android只调用MyView(Context c, AttributeSets attrs)构造函数,如果我有它就不会调用版本MyView(Context c, AttributeSets attrs, DBConnection db)

请帮忙

4

1 回答 1

1

当我遇到这样的情况时,我倾向于采取在视图创建后注入可显示数据的方法。因此,如果您的视图需要显示一个文本字符串,您可以通过查找ViewusingfindViewById然后调用适当的 setter 来注入该字符串或在创建活动期间从中提取该字符串的对象。

至于“有没有更好的方法来做到这一点”,我会担心将 a 传递dbconnection给视图类。它没有通过“气味”测试,似乎您正在将逻辑泄漏到您的视图中。对我来说更有意义的是,给你的视图一个Cursor或一些你已经在你的Activity. 这可以防止构建与非常特定的使用/场景紧密耦合的自定义视图。

On the other hand, you'll have to decide how reusable you want the view to be. It might be that quick and dirty is the appropriate tact for this particular project.

于 2012-02-14T04:07:35.180 回答