Data Binding Guide | Android Developers
たくさん記事を見かけるようになったのでかんたんに比較してみようかと思い.
これまで
public class MainActivity extends AppCompatActivity { private TextView name; private TextView age; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); name = (TextView) findViewById(R.id.name); age = (TextView) findViewById(R.id.age); User user = new User("ジョーンズ", 30); name.setText(user.name); age.setText(String.valueOf(user.age)); } public void onClickName(View v) { Toast.makeText(this, " 名前をクリックしました。", Toast.LENGTH_SHORT).show(); } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClickName" /> <TextView android:id="@+id/age" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
ButterKnife
dependencies { ... compile 'com.jakewharton:butterknife:7.0.1' }
public class MainActivity extends AppCompatActivity { @Bind(R.id.name) TextView name; @Bind(R.id.age) TextView age; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); ButterKnife.bind(this); User user = new User("ジョーンズ", 30); name.setText(user.name); age.setText(String.valueOf(user.age)); } @OnClick(R.id.name) public void onClickName(View v) { Toast.makeText(this, " 名前をクリックしました。", Toast.LENGTH_SHORT).show(); } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/age" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
Data Binding
android { ... dataBinding { enabled = true } }
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity); User user = new User("ジョーンズ", 30); binding.setUser(user); binding.setActivity(this); } public void onClickName(View v) { Toast.makeText(this, " 名前をクリックしました。", Toast.LENGTH_SHORT).show(); } }
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.example.User"/> <variable name="activity" type="com.example.MainActivity" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}" android:onClick="@{activity.onClickName}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{String.valueOf(user.age)}" /> </LinearLayout> </layout>
むむむ...
レイアウトを繰り返し使うような ListView/RecyclerView で実力を発揮するのかな?
This is more than binding simple data to your views and avoiding the boilerplate code. To me, this is actually mixing business logic in your UI layouts. Your views should be as dumb as possible, adhering to the Single Responsibility Principle with the only responsibility to show data. This could lead to a complicated, cluttered and unclean codebase.
We've seen some of the examples of the Data Binding API. I'm sure that this API was created in order to ease the developers' work and avoid boilerplate, but one can overuse it and accidentally create chaos in his code. Mixing Java in your view code has never been a good idea. Does JSP ring a bell?
How you can go wrong with the new Data Binding API
強力な分だけ「用法・用量」に注意, ということなのか.
ちなみに AndroidStudio最新環境では build.gradle 内 dataBinding { enabled = true } のみで使えるようになっておる.