Подтвердить что ты не робот

Привязка данных Android (аналогично WPF)?

Я искал некоторые подобные вопросы перед публикацией - однако у меня есть общий вопрос, когда дело доходит до Android и привязки данных (и другие ответы, которые я проверял, действительно не помогли мне намного дальше...). Предположим, у вас есть класс Vehicle:

public class Vehicle {

private Owner owner;
private String brand;

//getter and setter for above attributes...

}

и вот класс владельца....

public class Owner {

private String name;

}

Теперь - я недавно изучал шаблон MVVM (ModelView-ViewModel), используемый Microsoft WPF. Что заставило меня задаться вопросом: Предполагая, что я хочу привязать свойство name моего объекта-владельца, являющегося дочерним объектом объекта Vehicle, - будет ли какой-то стандартный способ в Android достичь этого? Также предположим, что мне, возможно, придется проверять ввод, прежде чем я смогу обновить модель?

Я представлял себе следующие компоненты (при условии MVVM):

  • Функция View (Activity) не содержит логики приложения, поэтому ее более или менее пустой
  • ViewModel будет обрабатывать экземпляр объекта Vehicle и выполнять действия на нем.
  • Сама модель будет выглядеть как код, который я опубликовал раньше, - полностью не обращая внимания на представление и ViewModel

Теперь, когда я добавляю свои EditTexts, TextViews и т.д. в представление, я хочу, чтобы они привязывались к определенным свойствам моего контекстного объекта (в этом случае автомобиль)... Mhhh, если мой вопрос не ясен или вам нужно дополнительная информация дайте мне знать:) спасибо заранее.

P.s. Я думаю, что люди, знакомые с WPF, могут теперь понимать то, что я имею в виду? Я сам только что прочитал о WPF и нашел, что это хороший способ обработать материал.

PPs Я знаю об проекте андроида привязки, но мне было интересно, есть ли какой-то встроенный подход в Android или, может быть, некоторые условно кто-то следит:) это действительно больше вопрос теории привязки, я думаю...

4b9b3361

Ответ 1

В Android SDK нет ничего "испеченного", который обеспечивает эквивалентную функциональность привязки данных, найденную в MS WPF. Google предоставляет интерфейс более низкого уровня для различных устройств под управлением Android. На сегодняшний день из сообщества разработчиков Android не появились платформы приложений более высокого уровня. (ИМХО, для создания такой вещи понадобилась бы такая компания-монстр, как Google, учитывая все различные ограничения на фреймворк для всех различных устройств Android.)

Вы можете создать набор классов привязки данных в своем приложении для обработки ваших потребностей в шаблоне MVVM. "Databinders" установили соответствующие обработчики событий на объектах Android View и применили бы соответствующий метод для объектов ViewModel в ответ. Они также преобразуют события изменения (которые вы определяете) в ViewModel в соответствующие назначения свойств в объектах View.

Независимо от того, что для вашего приложения окажется полезным, это вызов. Я предполагаю, что для записи классов Databinder потребуется больше усилий, чем просто для непосредственного подключения обработчиков событий нижнего уровня. Рамки полезны прежде всего, когда вам не приходилось писать их самостоятельно.

Ответ 2

Связывание собственных данных

Google запустила свою собственную библиотеку привязки данных!

https://developer.android.com/tools/data-binding/guide.html

Что позволяет писать ваши представления как таковые

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.firstName}"/>

Но его механизм проводки событий в это время (версия rc1) не может связываться с методами класса, простирающегося от Observable (при компиляции генерируется исключение, это известная ошибка, которая будет решена).

И уверен, что недостаток двухсторонней привязки (который не ожидается в первом выпуске ) - большой недостаток.

Во всяком случае, здесь хороший примерный проект для игры с https://github.com/saleeh93/data-binding-samples

Ответ 3

Хорошо, мой проект Android-Binding пытается выполнить привязку данных через XML-макет. Потому что нет встроенного метода, предоставляемого Google (и я не могу предвидеть, что Google это сделает), что причина, по которой я начал этот проект.

Ответ 4

Android M предоставит мощную библиотеку для привязки данных!

Теперь он доступен в dev-preview версии.

Он выглядит потрясающе внутри xml и java файлов:

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.firstName}"
    />

Java bean:

public class User {
   private final String firstName;
   private final String lastName;
   public User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }
   public String getFirstName() {
       return this.firstName;
   }
   public String getLastName() {
       return this.lastName;
   }
}

Переплет:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   User user = new User("Test", "User");
   binding.setUser(user);
}

Ответ 5

Немного об этом читал, я только что нашел RoboBinding, "привязанную к данным структуру модели Presentation" для Android.

Подобно проекту привязки Android, вы можете привязывать свойства (односторонние или двухсторонние) и события к вашим представлениям в XML с помощью дополнительного пространства имен.

Хотя это и не встроенный подход, это может быть большой помощью для вас.

Ответ 6

Поскольку вы впервые задали свой вопрос, пейзаж сильно изменился.
Самое главное Stuart Lodge дал нам MVVMCross.

Этот проект обеспечивает кросс-платформенную мобильную разработку mvvm основанная на Silverlight для WP7, Mono для Android и MonoTouch для iOS и инфраструктура WinRT XAML для Windows 8 Store Приложения Этот проект широко использует библиотеки портативных классов для предоставлять поддерживаемые кросс-платформенные С# -направленные приложения.

Он обеспечивает привязку данных в Views к ViewModels

Например, он позволяет следующее:

<EditText
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    local:MvxBind="{'Text':{'Path':'Query','Mode':'TwoWay'}}" />

Ресурсы

Github Страница: https://github.com/slodge/MvvmCross

Презентация: http://slodge.blogspot.co.uk/2012/12/mvvmcross-video-presentation-xaminar.html

И очень хороший вводный учебник: Создание приложений для Android с MVVM и привязкой данных

Ответ 7

В дополнение к ответам Oleksii для тех, кто хочет увидеть пример проекта (похоже, Google еще не предоставил какой-либо образец проекта), Я просто сделал один и подтолкнул его к GitHub.

Несколько примечаний:

  • classpath "com.android.databinding:dataBinder:1.0-rc0" не работает для меня, поэтому я использую classpath group: 'com.android.databinding', name: 'dataBinder', version: '1.0-rc0'
  • Нужна Java 7 +
  • Если вы получаете ошибки, попробуйте очистить/перестроить.
  • Не забудьте реализовать android.databinding.Observable или extends BaseObservable, если вам нужна возможность уведомлять, когда данные изменяются.
  • minSdkVersion равно 7. Это поддержка lib.
  • Мой проект не соответствует MVVM, он просто использует привязку данных. Добавлен образец MVVM.

Ответ 8

Я понимаю, что это произошло несколько лет спустя, но столкнувшись с теми же проблемами, на которые я столкнулся, это может помочь уменьшить нагрузку.

RoboBinding - обрабатывает привязку - как указано выше RoboGuice - делает инъекцию зависимостей

Есть очень хорошая видео презентация RoboBinding, которая поможет объяснить, что и как.

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