23

Я пытаюсь связать события с представлениями в xml с помощью Библиотека DataBinding поставляется с Android M. Я следую примерам из Android Developers и выполняя шаг за шагом. для атрибутов вида, таких как видимость, текст работает нормально, но если я пытаюсь связать с onclick, он не работает должным образом. Вот пример кода, который я пытался до сих пор:Использование библиотеки DataBinding для привязки событий

<data> 
    <import type="android.view.View"/> 
    <variable name="user" type="com.example.databinding.User"/> 
    <variable name="handlers" type="com.example.databinding.MyHandlers"/> 
</data> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@{user.firstName}" 
    android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" /> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Click Me" 
    android:id="@+id/button" 
    android:layout_gravity="left" 
    android:onClick="@{handlers.onClickFriend}"/> 

MainActivity:

public class MainActivity extends AppCompatActivity { 

    User user; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ActivityMainBinding binding = 
    DataBindingUtil.setContentView(this,R.layout.activity_main); 
    user = new User("Pankaj","Kumar",true,true); 
    binding.setUser(user); 
    } 
} 

MyHandlers:

public class MyHandlers { 
public void onClickFriend(View view){ 
    Log.i(MyHandlers.class.getSimpleName(),"Now Friend"); 
} 

public void onClickEnemy(View view){ 
    Log.i(MyHandlers.class.getSimpleName(),"Now Enemy"); 
    } 
} 

Я написал только необходимый код для улучшения читабельности. Может ли кто-нибудь помочь мне в этом.

ответ

75

Я думаю, что вам нужно будет привязать handlers, а также, возможно, что-то вроде этого в onCreate:

MyHandlers handlers = new MyHandlers(); 
binding.setHandlers(handlers); 
+4

Да, и если вы используете класс Activity, как обработчики, то вам просто нужно сделать, это: 'binding.setHandlers (это),' – dorsz

+0

Если у вас есть многие из тех же действий, вы можете использовать эту библиотеку для простоты - https://github.com/drstranges/ActionHandler –

+1

@dorsz +100 вам! Я искал это часами! – kirtan403

1

Это не обязательно, чтобы создать отдельный класс MyHandlers и вызвать setHandlers для обработки . Вы можете использовать только методы: public void onClickFriend(View view) и public void onClickEnemy(View view) в MainActivity. Вид деятельности:

public class MainActivity extends AppCompatActivity { 
    User user; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ActivityMainBinding binding = 
       DataBindingUtil.setContentView(this, R.layout.activity_main); 
     user = new User("Pankaj", "Kumar", true, true); 
     binding.setUser(user); 
    } 

    public void onClickFriend(View view) { 
     Log.i(MyHandlers.class.getSimpleName(), "Now Friend"); 
    } 

    public void onClickEnemy(View view) { 
     Log.i(MyHandlers.class.getSimpleName(), "Now Enemy"); 
    } 
} 

Компоновка:

<data> 
    <import type="android.view.View"/> 
    <variable name="user" type="com.example.databinding.User"/> 
</data> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@{user.firstName}" 
    android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Click Me" 
    android:id="@+id/button" 
    android:layout_gravity="left" 
    android:onClick="@{onClickFriend}"/> 

Взгляните на пример с использованием привязки данных библиотеки для шаблона MVVM: http://cases.azoft.com/mvvm-android-data-binding

+3

well 'android: onClick =" @ {onClickFriend} "' не работает, но 'android: onClick =" onClickFriend "' работал как обычно. – Bharatesh

+0

Не работает. –

+3

Это почти так. Вы можете использовать свою активность как обработчики, а onClick в макете - как 'android: onClick =" @ {handlers :: onClickFriend} "', но вам нужно привязать обработчики в Activity, например: 'binding.setHandlers (this); ' – dorsz

1

Если вы собираетесь используйте свою деятельность, также можно заменить объект context, который автоматически привязан, иначе вы теряете пространство.

Сгенерирована специальная переменная с именем context для использования при связывании выражений при необходимости. Значение для контекста - это контекст из getContext() для get_ontext(). Переменная контекста будет переопределена явным объявлением переменной с этим именем.

binding.setContext(this); 

и

<variable name="context" type="com.example.MyActivity"/> 

Примечание, если вы просто использовать обычную строку onClick="someFunc" это не функциональность привязки данных на всех. Это более старая функция, которая использует небольшое отражение для поиска метода в контексте.

11

Используйте этот формат в вашем XML:

android:onClick="@{handlers::onClickFriend}" 

Обратите внимание на ::, не беспокойтесь о красных линиях в редакторе XML, потому что в настоящее время это является открытым bug для редактора XML Android Studio.

Где handlers ваша переменная из тега данных:

<data> 
    <variable name="handlers" type="com.example.databinding.MyHandlers"/> 
</data> 

и onClickFriend ваш метод:

public class MyHandlers { 
    public void onClickFriend(View view) { 
     Log.i(MyHandlers.class.getSimpleName(),"Now Friend"); 
    } 
} 

ДОБАВЛЕНО

Для ручки onLongClick в XML добавить следующее:

android:onLongClick="@{handlers::onLongClickFriend}" 

и добавить onLongClickFriend метод в классе ViewModel:

public class MyHandlers { 
    public boolean onLongClickFriend(View view) { 
     Log.i(MyHandlers.class.getSimpleName(),"Long clicked Friend"); 
     return true; 
    } 
} 

ДОБАВЛЕННОЙ

Если вам нужно, чтобы показать тост сообщение, вы можете использовать интерфейс (лучше вариант), или передать context в MyHandlers класс в строительстве:

public class MyHandlers { 

    private Context context; 

    public MyHandlers(Context context) { 
     this.context = context; 
    } 

    public boolean onLongClickFriend(View view) { 
     Toast.makeText(context, "On Long Click Listener", Toast.LENGTH_SHORT).show(); 
     return true; 
    } 
} 
+1

Привет, вы знаете, как обрабатывать события onlongclick? – Mussa

+1

Привет, я обновил ответ. – walkmn

+0

Это не сработало. Не удалось скомпилировать проект. 'Неизвестный атрибут android: onLongClick'. – Mussa

1

Вы должны сделать

android:onClick="@{() -> handlers.onClickFriend}" 
+0

Вы имеете в виду 'android: onClick =" @ {(view) -> handlers.onClickFriend} "', в противном случае лямбда wouldn 't соответствует сигнатуре события onClick. – AymenDaoudi

Смежные вопросы