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?
- Butterknife: desactivar temporalmente el oyente
- Butterknife @InjectView problema después de la actualización a 7
- ¿Cuál es la diferencia entre `@ Bind` y` @BindView` en butterknife?
- ¿Por qué Butterknife no puede encontrar un ViewHolder dentro de una clase anónima?
- método "onClick" en butterknife no es un trabajo?
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>
- GetSupportActionBar (barra de herramientas) lanza la excepción de puntero nulo con Butterknife para la barra de herramientas
- Bind ButterKnife a diálogo falla
- Error al usuario ButterKnife en Android Studio y Android 5.0
- Usando Butterknife para inyectar una serie de vistas
- Uso de múltiples etiquetas <include /> en el diseño con ButterKnife
- Butterknife no encuentra vistas desde el módulo de la Biblioteca de Android
- Diferencia entre bind e injectionView en butterknife
- Android Butterknife - enlazado en fragmento
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(); }
- Android.support.v7.widget.TintContextWrapper no se puede publicar
- Android cómo cambiar el color del botón por el texto