38
Android-Binding Before / After 2013/7/20

Android-Binding Before / After

Embed Size (px)

DESCRIPTION

プログラミング生放送 名古屋 第24回目のセッション資料です。

Citation preview

Page 1: Android-Binding Before / After

Android-BindingBefore / After

2013/7/20

Page 2: Android-Binding Before / After

お約束

内容は個人に帰属します所属する組織を代表するものではありません

Page 3: Android-Binding Before / After

はじめに

Page 5: Android-Binding Before / After

自己紹介

•大場知悟(おおばとものり)•@tworks•本名を強いられているッ!

Page 6: Android-Binding Before / After

自己紹介

•仕事UI クライアントアプリの開発Windows Store アプリ・ iOS ・ Android

•アラフォープログラマ来週、アラフォーから昇格!プログラマー 35 歳説なんてなかったんや ...

Page 7: Android-Binding Before / After

アジェンダ

•簡単な Android アプリ

•簡単な Android アプリ

(おまけ)•複雑な Android アプリ

Before Android-Binding

After Android-Binding

Page 8: Android-Binding Before / After

BeforeAndroid-Binding

Page 9: Android-Binding Before / After

簡単な Android アプリ

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:id="@id/hello_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=“Hello World!" /></RelativeLayout>

activity_main.xml

@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);}

MainActivity.java

Page 10: Android-Binding Before / After

簡単な Android アプリ

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:id="@+id/hello_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /></RelativeLayout>

activity_main.xml

TextView textView = (TextView)findViewById(R.id.hello_text);textView.setText("Hello プロ生ちゃん !!");

MainActivity.java

Page 11: Android-Binding Before / After

簡単な Android アプリ

<Button android:id="@+id/hello_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" プロ生ちゃん " />

activity_main.xml

Button button = (Button)findViewById(R.id.hello_button);button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { TextView textView = (TextView)findViewById(R.id.hello_text); textView.setText(" マジ天使 !!"); }});

MainActivity.java

Page 12: Android-Binding Before / After

いけてないところ

•View ( UI )を Activity (コード)から名前で参照している

名前を変えるなら両方の修正が必要 findViewById("…") の呪い

•View ( UI )の型を Activity(コード)側で意識している

HogeHogeButton hogeButton =

(HogeHogeButton)findViewById(R.id.hoge_button);

左辺の型推論があれば我慢できるけど… Java め!

Page 13: Android-Binding Before / After

Android-Binding

•いけてない所を解決するライブラリhttps://code.google.com/p/android-binding/https://github.com/gueei/AndroidBinding

•次スライドからポイントを説明

Page 14: Android-Binding Before / After

準備

libs の下に配置

Page 15: Android-Binding Before / After

Android-Binding概念編

Page 16: Android-Binding Before / After

ViewModel (1/5)

•View の射影•View のふるまいを変数で定義するクラス定義

• 「名前」を管理する変数

ViewModel View

名前を入力する UI

Page 17: Android-Binding Before / After

プロパティ Binding (2/5)

• View のプロパティと ViewModel の変数を関連づける宣言

•Observable~~ が Bind 可能な変数

<TextViewbinding:text="yourName" />

ObservableString yourName;

ViewModel View

Page 18: Android-Binding Before / After

プロパティ Binding (2/5)

•ViewModel の変数を変更するとView に反映される

•このとき View ( UI )の名前を一切使っていないのがポイント!

ObservableString yourName;yourName.set(" 暮井 慧 ");

ViewModel View

暮井 慧

Page 19: Android-Binding Before / After

プロパティ Binding (2/5)

•片方向

•双方向

<TextViewbinding:text="yourName" />

ObservableString yourName;

<TextViewbinding:text="yourName" />

ObservableString yourName;

Page 20: Android-Binding Before / After

Command Binding (3/5)

•View のイベントをコード側のメソッドと関連付ける宣言

従来、 setOn~~Listener とやっていた箇所

buttonClick = new Command() {};

<Buttonbinding:onClick="buttonClick" />

コードView

Page 21: Android-Binding Before / After

Command Binding (3/5)

•Command の Invoke メソッドが実行される

•このときも View ( UI )の名前を一切使っていない!

public Command buttonClick = new Command() { @Override public void Invoke(View parent, Object... args) { yourName.set(" 暮井 慧 "); }};

Page 22: Android-Binding Before / After

BindingActivity (4/5)

•View ( UI )と ViewModel を紐づける機構

•setAndBindRootView で紐づけ

public class MainActivity extends BindingActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ViewModel をインスタンス化 MainActivityViewModel vm = new MainActivityViewModel(); setAndBindRootView(R.layout.activity_main, vm); }}

Page 23: Android-Binding Before / After

App 起動クラスの変更 (5/5)

• App の起動クラスと Android-Binding ライブラリの初期化を追加

•起動クラスをAndroid.manifest へ宣言

// Application エントリーポイントpublic class App extends Application { @Override public void onCreate() { super.onCreate(); // Android-Binding ライブラリの初期化 Binder.init(this); }}

Page 24: Android-Binding Before / After

BeforeAndroid-Binding

Page 25: Android-Binding Before / After

Before

public class MainActivity extends Activity {

  @Override

  protected void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.activity_main);

   Button button = (Button)findViewById(R.id.hello_button);

   button.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View arg0) {

     TextView textView = (TextView)findViewById(R.id.hello_text);

     textView.setText(" マジ天使 !!");

    }

   });

  }

}

Page 26: Android-Binding Before / After

AfterAndroid-Binding

Page 27: Android-Binding Before / After

After

public class MainActivity extends BindingActivity {

  @Override

   protected void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   MainActivityViewModel vm    = new MainActivityViewModel();

   setAndBindRootView (    R.layout.activity_main, vm);

  }

}

Page 28: Android-Binding Before / After

After

public class MainActivityViewModel {

  public StringObservable yourName = new StringObservable();

  public Command buttonOnClick = new Command() {

   @Override

   public void Invoke(View parent, Object... args) {

    yourName.set(" マジ天使 !!");

   }

  };

}

Page 29: Android-Binding Before / After

複雑なAndroid アプリ

Page 30: Android-Binding Before / After

こんなアプリ

1. EditText に入力2. Add ボタン押下で ListView に項

目追加3. ListView の項目押下で Toast 表示

ListView

Page 31: Android-Binding Before / After

MainActivity クラス

ListView と ListViewAdapter

ArrayAdapter クラス

// ListView に表示するデータArrayList<String> datas;

// ListView の 1 行を表示するメソッドView getView(int position, View convertView, ViewGroup parent) { inflater.inflate(R.layout.list_item, null);} list_item.xml

ListView1 行のView

main_activity.xmlメイン画面の View

Page 32: Android-Binding Before / After

Before

ArrayAdapter

R.layout.list_item

list_item.xmlListView1 行のView

activity_main.xmlメイン画面の View

MainActivity

R.layout.nameListView

setOnClickListenersetOnItemClickListener

Page 33: Android-Binding Before / After

After

list_item.xmlListView1 行のView

activity_main.xmlメイン画面の View

MainActivityViewModel

// ListView の Items と Bind するインスタンスpublic ArrayListObservable<ListViewItemViewModel> datas;

// ListView でクリックされた Item と Bind するインスタンスpublic ObjectObservable clickedListViewItem;

ListViewItemViewModel

// ListView Item のデータとBindpublic StringObservable data

MainActivity

Page 34: Android-Binding Before / After

After

<TextView binding:text="data" />

<ListView binding:itemSource="datas" binding:clickedItem="clickedListViewItem" binding:onItemClicked="listViewOnItemClick" binding:itemTemplate="@layout/list_item">

public StringObservable yourName;

public ArrayListObservable<ListViewItemViewModel> datas;

public ObjectObservable clickedListViewItem ;

public Command listViewOnItemClick;

// ListView Item のデータとBindpublic StringObservable data;

MainActivity

Page 35: Android-Binding Before / After

After

// Add Button の Click 処理public Command buttonOnClick = new Command() {

  @Override

  public void Invoke(View parent, Object... args) {

   // ListViewItem のための ViewModel を生成    ListViewItemViewModel viewModel =

    new ListViewItemViewModel(yourName.get());

   // ListView の Items に Bind している   // インスタンスにデータを追加   // これにより ListView へ追加が行われる  datas.add(viewModel); // ArrayListObservable<ListViewItemViewModel> datas

   // EditText の入力値をクリア  yourName.set("");

  }

};

Page 36: Android-Binding Before / After

Android-Binding

メリット

• findViewById(...) から解放される• コード側が View の型を意識しなくてよくなる• 分業とか ... は理想論ですねw 

デメリット

• Layout.xml の タグbinding:xxx="yyy" が手打ち

Page 37: Android-Binding Before / After

まとめ

• Android-Binding でスッキリしたコードを目指せる

• Android-Binding はMIT ライセンス(昔は LGPL だった)

• Java はとっとと型推論を!

Page 38: Android-Binding Before / After

ご清聴ありがとうございました。