Android:如何将附加对象引用传递给自定义 View

标签 android object view custom-controls ondraw

目前我有一个自定义 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/

相关文章:

android - 如何将 map 放入 PagerAdapter?是否可以?

java - 更改自定义适配器内容

javascript - 我怎样才能使这个 HTML5 Canvas 绘画应用程序同时适用于触摸和鼠标事件?

java - System.out.println(object) 的输出

javascript - 将对象作为函数调用 JavaScript

arrays - Laravel 5 从数据库结果中形成另一个数组

java - Android - 如何从光标中删除项目?

object - 如何将数据对象内的影片剪辑添加到舞台上? AS3

model-view-controller - 在 "classical"web MVC 中, View 是如何创建的?

sql - 在 SQL Server 中编写 VIEW 时需要帮助