2017-02-18 3 views
1

In einem meiner Event-Handler auf einer Schaltfläche, verwende ich Lambda-Ausdruck, aber es bewerten falsche Ergebnis zum Zeitpunkt des Ereignisses passiert. Mein Fluss besteht darin, zu überprüfen, ob eine Ansicht (in meinem Fall ist es TextView) im Ausdruck sichtbar ist oder nicht. Wenn die Ansicht sichtbar ist, drucke ich true sonst false. Aber mein Code gibt mir immer true Antwort. Schlag ist mein Code:Falsche Lambda-Ausdruck Auswertung zum Zeitpunkt des Ereignisses passiert

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> 

Bitte helfen, wo bin ich Fehler gemacht? Vielen Dank im Voraus.

+0

Es scheint "Ansicht" Variable in Lambda-Ausdruck ist Button, der nicht TextView ist. –

+0

versuchen Sie es so: android: onClick = "@ {() -> eventHandler.eventHandlerViaListenerBinding (view.getVisibility() == View.VISIBLE)}" –

+0

@LuongDinh: Sie haben Recht, es funktioniert gut. Aber ich habe die genaue Bedeutung der leeren Klammer nicht verstanden oder einige Parameter in der Klammer, d.h. die Differenz zwischen() -> und (Ansicht) ->. Kannst du bitte ein wenig über das Gleiche erklären? –

Antwort

1

Sie verwenden die Bindung nicht in vollem Umfang. Ein Zweck ist es, nie wieder findViewById() zu verwenden. Also folgenden

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

sollte als

activityMainBinding.nameTv.setVisibility(View.GONE); 

erfolgen, da alle Ansichten mit einer ID als Mitglied auf der Bindung provieded.

Als zweiter Vorteil können Sie sogar auf diese Variable innerhalb der Bindung selbst zugreifen. So könnten Sie einfach entfernen

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

alle vollständig und Umsetzung der onClick Zuhörer als

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

Zusätzlich brauchen Sie nicht wirklich die ?: Konditionaloperator.

1

können Sie versuchen:

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

Weil Ihre Lambda-Ausdruck entsprechen:

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

In diesem Fall hat onClick Methode 1 Argument, die Schaltfläche geklickt wird. Und statt der globalen Variable "view" wird eine lokale Variable "view" verwendet. Wenn Sie diese Variable dem anderen Variablennamen nennen, ist das in Ordnung.

So können Sie Ihr Lambda zu "@ {() ->" oder "@ {(v) ->".

Verwandte Themen