2016-11-08 3 views
1

View.Javaне в состоянии сделать событие щелчка в андроида привязки данных

package com.espresso.mvvmtestproject; 

import android.content.Context; 
import android.databinding.DataBindingUtil; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 

import com.espresso.mvvmtestproject.databinding.ActivityMainBinding; 


public class View extends AppCompatActivity implements ViewContract.requiredMethods{ 


    ViewModel mModel; 
    ActivityMainBinding binding; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //Setting the layout 
     binding = DataBindingUtil.setContentView(this, R.layout.activity_main); 
     mModel=new ViewModel(getContext()); 
     binding.setUser(mModel); 
     binding.setHandlers(new MyHandlers()); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 

    } 

    @Override 
    public Context getContext() { 
     return View.this; 
    } 


} 

ViewContract.java

public interface ViewContract { 
    interface requiredMethods{ 
     Context getContext(); 
    } 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data> 
     <variable 
      name="user" 
      type="com.espresso.mvvmtestproject.ViewModel"/> 
     <variable 
      name="handlers" 
      type="com.espresso.mvvmtestproject.MyHandlers"/> 
    </data> 




    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="center" 
     android:gravity="center"> 
     <TextView android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textSize="20sp" 
      android:layout_gravity="center" 
      android:gravity="center" 
      android:textColor="@android:color/black" 
      android:text="First Text"/> 
     <TextView android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textSize="20sp" 
      android:layout_gravity="center" 
      android:gravity="center" 
      android:textColor="@android:color/black" 
      android:text="Second Text"/> 

     <Button 
      android:text="Show Toast" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:onClick="@{handlers::onShowToast}"/> 
    </LinearLayout> 

</layout> 

MyHandlers.java

public class MyHandlers { 

    public void onShowToast(View view) { 
     Toast.makeText(view,"Clicked",Toast.LENGTH_SHORT).show(); 
    } 

} 

ViewModel.java

public class ViewModel { 


    private Context mActivity; 

    public ViewModel(Context context) { 
     this.mActivity=context; 
    } 

    public void onShowToast(View view) { 
     Toast.makeText(mActivity,"Clicked",Toast.LENGTH_SHORT).show(); 
    } 

} 

Er rorLog

Information:Gradle tasks [:app:clean, :app:generateDebugSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:generateDebugAndroidTestSources, :app:assembleDebug] 
D:\Projects\Trp\MvvmTestProject\app\src\main\java\com\espresso\mvvmtestproject\View.java 
Error:(8, 48) error: package com.espresso.mvvmtestproject.databinding does not exist 
Error:(15, 5) error: cannot find symbol class ActivityMainBinding 
Error:Execution failed for task ':app:compileDebugJavaWithJavac'. 
> java.lang.RuntimeException: Found data binding errors. 
****/ data binding error ****msg:Listener class android.view.View.OnClickListener with method onClick did not match signature of any method handlers::onShowToast 
file:D:\Projects\Trp\MvvmTestProject\app\src\main\res\layout\activity_main.xml 
loc:40:31 - 40:51 
****\ data binding error **** 
Information:BUILD FAILED 
Information:Total time: 4.396 secs 
Information:3 errors 
Information:0 warnings 
Information:See complete output in console 
+1

Я сделал проект почти точно так, как дано, и она работала отлично. Я считаю, что вы неправильно копировали «MyHandlers.onShowToast», потому что он не компилируется. –

ответ

2

Сделайте свой MyHandlers intereface из класса.

public class MyHandlers { 
    public void onShowToast(View view); 
} 

Реализовать его в ваш Activity или Fragment, в вашем случае это будет выглядеть следующим образом

public class View extends AppCompatActivity implements ViewContract.requiredMethods, MyHanders{ 

    ViewModel mModel; 
    ActivityMainBinding binding; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //Setting the layout 
     binding = DataBindingUtil.setContentView(this, R.layout.activity_main); 
     mModel=new ViewModel(getContext()); 
     binding.setUser(mModel); 
     binding.setHandlers(this); 

    }   

    @Override 
    public void onShowToast(View view) { 
     Toast.makeText(view,"Clicked",Toast.LENGTH_SHORT).show(); 
    } 
} 

переопределять метод интерфейса onShowToast и установить обработчик для вашего связывания, и это все, вы сделали с нажмите событие

+0

Это не сработало ... Stll результат тот же – Devrath

+1

@RaviRupareloya Качание снова в привязке данных –

+0

'activity_main.xml', что-то не хватает? – Devrath

1

в более поздних версиях библиотеки DataBinding вы можете просто выполнить привязку к событию щелчка, как это:

android:onClick="@{() -> viewModel.save()}" 

Тогда в вашем ViewModel, вы можете просто добавить слушателя, как это:

public void save(){ 
... 
} 
Смежные вопросы