2015-06-16 16 views
6

Sono nuovo a lavorare con il pulsante di azione mobile e sto cercando di ottenere alcune delle cose fondamentali che funzionano oggi. Attualmente sono bloccato a far funzionare la funzionalità onClick. Ho estratto la maggior parte del codice dall'esempio base FAB di google e in esso è presente un metodo onChecked che invia una stringa a un registratore per mostrare che è stato fatto clic.Pulsante OnClick for Floating

@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; 
    } 
} 

Stavo pensando che sarei stato in grado di sostituire la funzionalità, ma che non ha avuto alcun effetto. Così ho provato a creare il onClickListener come faresti con qualsiasi altro pulsante, ma anche questo non ha avuto alcun effetto. Non sono sicuro di come continuare poiché nessuna delle due opzioni ha funzionato. il mio obiettivo è solo quello di produrre una finestra di dialogo quando si fa clic sul pulsante di azione mobile, ma per ora sto solo cercando di utilizzare una finestra di dialogo di avviso segnaposto.

Questa è la classe 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; 
     } 
    } 

} 

E qui è la classe 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; 
    } 
} 

Non c'è molto a uno di classe a questo punto, sono per lo più bucce, ma io voglio solo ottenere questa funzionalità di base prima di continuare, e essendo il noob che sono, non so perché questo non funzionerebbe.

+0

si dovrebbe usare il FAB che si trova nella libreria Support Design – tyczj

+0

Mente mi collega a qualcosa di utile? Questa è la prima volta che lavoro con FAB, quindi ho appena preso il codice da uno dei campioni di Google. Quello non era dalla libreria di progettazione di supporto? – erp

+0

http://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html – tyczj

risposta

23

Se non si sta già muovendo per scadenza, è necessario modificare il pulsante di azione flottante a quello fornito da Google nella libreria di progettazione basta seguire http://android-developers.blogspot.in/2015/05/android-design-support-library.html

aggiungere al layout 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" 
     ... /> 

Aggiungere al codice dietro:

FloatingActionButton myFab = (FloatingActionButton) myView.findViewById(R.id.myFAB); 
myFab.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     doMyThing(); 
    } 
}); 

per maggiori dettagli seguire: FloatingActionButton example with Support Library

+0

Grazie, questa è la risposta corretta al giorno d'oggi con la libreria di supporto. – erp

2

Per utilizzare finestra/Alertdialog con il pulsante di azione galleggiante si' re utilizzando, prova a cambiare il vostro onClick (Visualizza v) da questo

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

a

AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());