OnClick para el botón de acción flotante
Soy nuevo en el trabajo con el botón de acción flotante y tratando de obtener algunas de las cosas básicas de trabajo hoy en día. Actualmente estoy atascado en conseguir la funcionalidad onClick
para trabajar. Saqué la mayor parte del código de googles FAB ejemplo básico, y allí hay un método onChecked
que envía una cadena a un registrador para mostrar que ha hecho clic en él.
@Override public void onCheckedChanged(FloatingActionButton fabView, boolean isChecked) { // When a FAB is toggled, log the action. switch (fabView.getId()){ case R.id.fab_1: break; default: break; } }
Estaba pensando que sería capaz de reemplazar la funcionalidad de allí, pero que no tenía ningún efecto. Así que traté de crear el onClickListener
como lo haría con cualquier otro botón, pero que también no tenía ningún efecto. No estoy seguro de cómo continuar ya que ninguna de las dos opciones funcionó. Mi objetivo es producir un diálogo cuando se hace clic en el botón de acción flotante, pero por ahora sólo estoy tratando de usar un diálogo de alerta de marcador de posición.
Esta es la clase FloatingActionButtonFragment:
public class FloatingActionButtonFragment extends Fragment implements FloatingActionButton.OnCheckedChangeListener { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View rootView = inflater.inflate(R.layout.fab_layout, container, false); // Make this {@link Fragment} listen for changes in both FABs. FloatingActionButton fab1 = (FloatingActionButton) rootView.findViewById(R.id.fab_1); fab1.setOnCheckedChangeListener(this); fab1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("Are you sure?") .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // User cancelled the dialog } }); // Create the AlertDialog object and return it AlertDialog dialog = builder.create(); dialog.show(); } }); return rootView; } @Override public void onCheckedChanged(FloatingActionButton fabView, boolean isChecked) { // When a FAB is toggled, log the action. switch (fabView.getId()){ case R.id.fab_1: break; default: break; } } }
Y aquí está la clase FloatingActionButton:
public class FloatingActionButton extends FrameLayout implements Checkable { /** * Interface definition for a callback to be invoked when the checked state * of a compound button changes. */ public static interface OnCheckedChangeListener { /** * Called when the checked state of a FAB has changed. * * @param fabView The FAB view whose state has changed. * @param isChecked The new checked state of buttonView. */ void onCheckedChanged(FloatingActionButton fabView, boolean isChecked); } /** * An array of states. */ private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked }; private static final String TAG = "FloatingActionButton"; // A boolean that tells if the FAB is checked or not. private boolean mChecked; // A listener to communicate that the FAB has changed it's state private OnCheckedChangeListener mOnCheckedChangeListener; public FloatingActionButton(Context context) { this(context, null, 0, 0); } public FloatingActionButton(Context context, AttributeSet attrs) { this(context, attrs, 0, 0); } public FloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } public FloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr); setClickable(true); // Set the outline provider for this view. The provider is given the outline which it can // then modify as needed. In this case we set the outline to be an oval fitting the height // and width. setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, getWidth(), getHeight()); } }); // Finally, enable clipping to the outline, using the provider we set above setClipToOutline(true); } /** * Sets the checked/unchecked state of the FAB. * @param checked */ public void setChecked(boolean checked) { // If trying to set the current state, ignore. if (checked == mChecked) { return; } mChecked = checked; // Now refresh the drawable state (so the icon changes) refreshDrawableState(); if (mOnCheckedChangeListener != null) { mOnCheckedChangeListener.onCheckedChanged(this, checked); } } /** * Register a callback to be invoked when the checked state of this button * changes. * * @param listener the callback to call on checked state change */ public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { mOnCheckedChangeListener = listener; } @Override public boolean isChecked() { return mChecked; } @Override public void toggle() { setChecked(!mChecked); } /** * Override performClick() so that we can toggle the checked state when the view is clicked */ @Override public boolean performClick() { toggle(); return super.performClick(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // As we have changed size, we should invalidate the outline so that is the the // correct size invalidateOutline(); } @Override protected int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked()) { mergeDrawableStates(drawableState, CHECKED_STATE_SET); } return drawableState; } }
No hay mucho para ninguna de las clases en este punto, son en su mayoría husks, pero sólo quiero obtener esta funcionalidad básica antes de continuar, y siendo el noob que soy, no sé por qué esto no funcionaría.
Si ya no se dirige a la fecha límite, debe cambiar el botón de acción flotante a la proporcionada por google en la librería de diseño, simplemente siga http://android-developers.blogspot.in/2015/05/android-design-support-library .html
Añadir a la disposición XML:
<android.support.design.widget.FloatingActionButton android:id="@+id/myFAB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/your_icon" app:elevation="4dp" ... />
Agregue al código detrás:
FloatingActionButton myFab = (FloatingActionButton) myView.findViewById(R.id.myFAB); myFab.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { doMyThing(); } });
Para más detalles siga: Ejemplo de FloatingActionButton con la Biblioteca de soporte
En realidad, ahora con la biblioteca de soporte de Android era muy fácil agregar FAB y personalizarlo con los oyentes de clic
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // FAB Action goes here } });
Referencia: http://androidgifts.com/android-material-design-floating-action-button-tutorial/
Para utilizar dialog / Alertdialog con el botón de acción flotante que está utilizando, pruebe a cambiar su onClick (View v) desde este
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
a
AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());