ButterKnife onClick vista personalizada

He creado un botón personalizado y he intentado utilizar la anotación de ButterKnife @onClick , pero no funciona.

¿Es posible usar ButterKnife para vistas personalizadas como esta o tendré que usar el onClickListener predeterminado?

Botón personalizado

 public class CustomButton extends RelativeLayout { public CustomButton(Context context) { super(context); } public CustomButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public CustomButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } private void init() { inflate(getContext(), R.layout.button_layout, this); } 

Menú

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.fragment_menu, container, false); ButterKnife.bind(this, rootView); return rootView; } @OnClick(R.id.button_play) public void onButtonPlayClicked() { // NOT CALLED } 

Diseño del menú

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg_pattern" android:padding="15dp"> <com.example.ui.custom.CustomButton android:id="@+id/button_play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true"/> </RelativeLayout> 

En la actualidad, me encuentro con el mismo problema y encontré una bonita solución. Anula setOnClickListener (OnClickListener l) dentro de mi vista y asigno el oyente a mi botón. Después de que @OnClick funciona como se esperaba.

En su caso puede agregar el siguiente método:

 @Override public void setOnClickListener(OnClickLister l) { ButterKnife.findById(this.getView(), R.id.button_play).setOnClickLister(l); } 

De http://jakewharton.github.io/butterknife/

Las vistas personalizadas pueden vincularse a sus propios oyentes al no especificar un ID.

 public class FancyButton extends Button { @OnClick public void onClick() { // TODO do something! } } 

¡¡Espero eso ayude!!

He experimentado el mismo problema. Resolví manejando el envío de eventos en mi vista personalizada.

En tu caso:

 public class CustomButton extends RelativeLayout { // ... @Override public boolean dispatchTouchEvent(MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_UP) { if(hasOnClickListeners()) { callOnClick(); } } return super.dispatchTouchEvent(event); } // ... } 

Espero que esto podría ayudar.

Tuve el mismo problema y encontré una solución!

Reemplace la vista raíz del XML de su vista personalizada ( R.layout.button_layout ) para usar <merge> lugar. Como puede leer en la documentación de ButterKnife:

Vincule los niños de una vista a los campos usando ButterKnife.bind (este). Si utiliza etiquetas <merge> en un diseño e infla en un constructor de vista personalizada, puede llamar a esto inmediatamente después . Como alternativa, los tipos de vista personalizada inflados de XML pueden utilizarlo en la devolución de llamada onFinishInflate ().

En mi caso reemplazé:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg_button_default" android:clickable="true" android:focusable="true" android:padding="@dimen/normal_padding" tools:background="@color/white" tools:layout_height="80dp"> 

Por:

 <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> 

Ahora, la configuración de vista principal está dentro del método de inicialización CustomView. ¡Todos los eventos OnClick y OnLongClick están funcionando!

Espero que esto podría ayudar!

 In your activity try to add.. ButterKnife.inject(this); check this code @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); } @OnClick(R.id.buttonAlert) public void alertClicked(View v){ new AlertDialog.Builder(v.getContext()) .setMessage(getFormattedMessge()) .setNeutralButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .show(); } 
  • No se puede encontrar la clase de símbolo en el código generado por Butter Knife
  • ¿Por qué no se puede vincular varias vistas a un propietario?
  • Android: ¿Por qué necesitamos usar R2 en lugar de R con butterknife?
  • Butterknife - inyecciones múltiples
  • Butterknife no puede enlazar dentro de mi Clase de Adaptador
  • Uso de la biblioteca de Butter Knife para ver la inyección
  • @OnClick no está trabajando en la implementación de ButterKnife Library
  • Cuchillo de mantequilla - No se puede vincular vistas de fragmento
  • Butterknife enlaza SearchView desde el menú
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.