Android: как передать дополнительную ссылку на объект в пользовательское представление - PullRequest
1 голос
/ 14 февраля 2012

В настоящее время у меня есть собственное представление:

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) one.

пожалуйста, помогите

1 Ответ

1 голос
/ 14 февраля 2012

Когда я сталкиваюсь с подобными ситуациями, я склоняюсь к тому, чтобы вводить отображаемые данные после создания представления.Итак, если вашему представлению нужна строка текста для отображения, вы вводите эту строку или объект, из которого извлекается строка во время создания ваших действий, просматривая View с помощью findViewById и затем вызывая соответствующий установщик.

Что касается "есть ли лучший способ сделать это", я бы нервничал из-за передачи dbconnection в класс представления.Он не проходит тест на «запах» и кажется, что вы пропускаете свою логику в свой взгляд.Для меня было бы больше смысла сказать, дать вашему взгляду Cursor или какой-то объект, который вы заполнили внутри вашего Activity.Это предотвращает создание пользовательских представлений, которые тесно связаны с очень специфическим использованием / сценарием.

С другой стороны, вам придется решить, насколько многократным будет использование представления.Может быть, быстрый и грязный - подходящий такт для этого конкретного проекта.

...