2017-02-18 11 views
1

ボタン上のイベントハンドラの1つで、ラムダ式を使用していますが、イベント発生時に間違った結果を評価しています。私の流れは、ビュー(私の場合はTextView)が表示されているかどうかをチェックすることです。ビューが表示されている場合は、true else falseを印刷しています。しかし、私のコードは常に私にの応答を与えています。私は間違いをしていますイベント発生時にラムダ式の評価が正しく行われない

public class MainActivity extends AppCompatActivity implements MethodReferenceHandler, ____ListenerBindingEventHandler { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    final ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); 
    User kkr = new User(); 
    kkr.setAge("20"); 
    kkr.setName("Vinit Saxena"); 
    activityMainBinding.setUser(kkr); 
    activityMainBinding.setEventHandler(this); 
    activityMainBinding.setMethodreferencehandler(this); 
    TextView textView = (TextView) findViewById(R.id.name_tv); 
    textView.setVisibility(View.GONE); 
    activityMainBinding.setView(textView); 
} 

@Override 
public void onClickViaMethodReferenceHandler(View v) { 
    Log.i(getClass().getName(), "---->onClickViaMethodReferenceHandler"); 
} 

@Override 
public void eventHandlerViaListenerBinding() { 
    Log.i(getClass().getName(), "---->eventHandlerViaListenerBinding"); 
} 

@Override 
public void eventHandlerViaListenerBinding(boolean isThisTrue) { 
    Log.i(getClass().getName(), "---->eventHandlerViaListenerBinding - isThisTrue : " + isThisTrue); 
} 
} 

<data> 

    <import type="android.view.View" /> 

    <variable 
     name="user" 
     type="com.mds.binding.User" /> 

    <variable 
     name="methodreferencehandler" 
     type="com.mds.binding.MethodReferenceHandler" /> 

    <variable 
     name="eventHandler" 
     type="com.mds.binding.____ListenerBindingEventHandler" /> 

    <variable 
     name="view" 
     type="android.view.View" /> 

</data> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.mds.binding.MainActivity"> 

    <TextView 
     android:id="@+id/name_tv" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@{user.name}" 
     android:visibility="visible" /> 

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


    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="@{methodreferencehandler::onClickViaMethodReferenceHandler}" 
     android:text="Method Reference" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="@{(view)-> view.getVisibility() == View.VISIBLE ? eventHandler.eventHandlerViaListenerBinding(true) : eventHandler.eventHandlerViaListenerBinding(false)}" 
     android:text="Listener Binding" /> 
</LinearLayout> 

助けてください:フェラは私のコードですか? ありがとうございます。

+0

ラムダ式の "view"変数は、TextViewではないButtonです。 –

+0

試してみてください:android:onClick = "@ {() - > eventHandler.eventHandlerViaListenerBinding(view.getVisibility()== View.VISIBLE)}" –

+0

@LuongDinh:そうです、うまくいきます。しかし、私は空の括弧の正確な意味を理解していないか、括弧内のいくつかのパラメータ、すなわち() - >(ビュー) - >の違いを理解していませんでした。あなたは同じことについて少し明るい説明をしていただけますか? –

答えて

1

あなたは完全な拡張を使用していません。 1つ目の目的は、もう一度findViewById()を使用しないことです。 IDを持つすべてのビューを結合に対するメンバーとしてproviededているのでそう以下

TextView textView = (TextView) findViewById(R.id.name_tv); 
textView.setVisibility(View.GONE); 

activityMainBinding.nameTv.setVisibility(View.GONE); 

として行われるべきです。

第2の利点として、バインディング内でこの変数にアクセスすることもできます。だから、あなただけの完全

<variable 
    name="view" 
    type="android.view.View" /> 

すべてを削除し、また、あなたが本当に?:条件演算子を必要としない

android:onClick="@{(view) -> eventHandler.eventHandlerViaListenerBinding(nameTv.getVisibility() == View.VISIBLE)}" 

としてonClickリスナーを実装することができます。

1

あなたが試すことができます:

this: android:onClick="@{()-> eventHandler.eventHandlerViaListenerBinding(view.getVisibili‌​ty() == View.VISIBLE)}" 

をあなたのラムダ式が対応するので:この場合

  private View view; 
     button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) {eventHandler.eventHandlerViaListenerBinding(view.getVisibility() == View.VISIBLE); 
     } 
    }); 

、onClickの方法は、ボタンをクリックすると1つの引数があります。また、グローバルな "view"変数の代わりにローカル "view"変数が使用されます。この変数の名前を他の変数名にすると、大丈夫です。

ラムダを「@ {() - >」または「@ {(v) - >」にすることができます。

関連する問題