Android Data Binding Library(二):イベント処理

6096 ワード

Data Bindingでは、viewによって配布されたイベント、e.g.onClickを書き込み式で処理できます.イベント属性名は通常listenerメソッドの名前で管理されますが、個別の例外があります.e.g.View.OnLongClickListenerにはonLongClick()というメソッドがあります.この場合、イベントのプロパティ名はandroid:onLongClickです.イベントを処理するには2つの方法があります
  • メソッドは、式でMethod Referenceを参照し、リスナー内のメソッド署名に適合するメソッドを参照することができる.
  • ListenerバインドListener Bindingsはlambda式を使用し、イベントが発生したときにこれらのlambda式を計算します.

  • メソッド参照
    公式説明:In your expressions,you can reference methods that conform to the signature of the listener method.When an expression evaluates to a method reference, Data Binding wraps the method reference and owner object in a listener, and sets that listener on the target view. If the expression evaluates to null, Data Binding does not create a listener and sets a null listener instead.
    イベントおよび処理方法は、android:onClickがActivityでメソッドに付与できるのと同様に、直接バインドすることができる.メソッドリファレンスがView#onClickプロパティと比較される主な利点は、式がコンパイル時に処理されることです.メソッドが存在しないか、署名が間違っている場合は、コンパイルエラーが発生します.メソッドリファレンスとリスナーバインドの主な違いは、イベントがトリガーされる場合ではなく、前者がデータバインド時に真のリスナー実装を作成することです.イベントが発生したときに式を計算する傾向がある場合は、リスナーバインドメソッドを使用します.To assign an event to its handler, use a normal binding expression, with the value being the method name to call. For example,if your data object has two methods:イベント処理方法の例:
    public class MyHandlers {
        public void onClickFriend(View view) { ... }
    }
    

    レイアウトファイルでクリックイベントリスナーに値を割り当てる式は、次のとおりです.
    
    
       
           
           
       
       
           
       
    
    

    注:式のメソッドの署名は、リスナーオブジェクトのメソッド署名と完全に一致する必要があります.
    Activityファイルでバインド関係を作成すると、レイアウトファイルで定義した2つのvariable:userとhandlersを設定する必要があることがわかります.
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
    
            ActivityMain2Binding binding = DataBindingUtil.setContentView(this, R.layout.activity_main2);
            User user = new User("Test", "User");
            binding.setUser(user);
            binding.setHandlers(new MyHandlers());
        }
    

    Listenerバインド
    公式説明:These are lambda expressions that are evaluated when the event happens.Data Binding always creates a listener, which it sets on the view. When the event is dispatched, the listener evaluates the lambda expression. Listener Bindings are binding expressions that run when an event happens. They are similar to method references, but they let you run arbitrary data binding expressions. This feature is available with Android Gradle Plugin for Gradle version 2.0 and later.
    メソッドリファレンスイベント処理では、メソッドのパラメータがイベントリスナーと一致する必要があります.一方、Listenerバインドイベント処理では、Listenerが空に戻らない限り、戻り値とListenerの一致のみが要求されます.例:
    public class Presenter {
        public void onSaveClick(Task task){}
    }
    

    クリックイベントをバインドする方法の例:
    
      
          
              
              
          
          
              

    监听器使用lambda表达式,只能作为表达式的根元素。当在表达式中使用回调时,Data Binding自动创建必要的监听器并注册事件。当view触发事件时,Data Binding对表达式进行求值。

    As in regular binding expressions, you still get the null and thread safety of Data Binding while these listener expressions are being evaluated.

    上例中并未定义点击onClick(android.view.View)中传入的view参数。关于监听器参数,有两种选择:一忽略所有的参数;二命名所有参数。如果选择命名这些参数,则可以在表达式中使用。上述表达式也可以写为:

    android:onClick="@{(view) -> presenter.onSaveClick(task)}"
    

    式でパラメータを使用する場合は、次のようにします.
    public class Presenter {
        public void onSaveClick(View view, Task task){}
    }
    
     android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"
    

    Lamda式には複数のパラメータがあります.
    public class Presenter {
        public void onCompletedChanged(Task task, boolean completed){}
    }
    
    //       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    
    

    リスニングされたイベントの戻り値が空でない場合は、式で同じタイプを返す必要があります.たとえば、リスニング長がイベントを押すとfalseを返す必要があります.
    public class Presenter {
        public boolean onLongClick(View view, Task task){} 
    }
    
    //       boolean onLongClick(View var1)
    android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"
    

    nullオブジェクトによって式が評価できない場合、Data Bindingはjavaのデフォルト値を返します.e.g.参照タイプはnullを返し、intは0を返し、booleanはfalseを返し、etc.式を使用して判断する必要がある場合(三元グループなど)、voidはシンボルとして使用できます.
    android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"
    

    複雑なリスナーの使用を避ける
    Listenerエクスプレッションは強力で、コードを読みやすくします.しかし、リスナーが複雑な式を使用すると、レイアウトファイルの読み取りが難しくなり、メンテナンスが困難になります.これらの式は、UIからコールバック関数に使用可能なデータを渡すだけで、できるだけ簡単にする必要があります.ビジネスロジックの実装は、式でトリガーされるコールバック関数に配置する必要があります.
    参照ドキュメント:https://developer.android.google.cn/topic/libraries/data-binding/index.html#build_environment