2015-06-16 82 views
6

我是新來處理浮動動作按鈕,並試圖獲得今天的一些基本工作。目前我堅持讓​​onClick功能正常工作。我從谷歌FAB基本示例中抽取了大部分代碼,並在其中有一個onChecked方法,該方法會向記錄器發送一個字符串以顯示您點擊了它。OnClick for Floating Action Button

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

我想我可以替換那裏的功能,但沒有任何影響。所以我試圖創建onClickListener就像你用任何其他按鈕,但也沒有影響。我不確定如何繼續,因爲這兩個選項都不起作用。我的目標是在浮動動作按鈕被點擊時產生一個對話框,但現在我只是想使用佔位符警告對話框。

這是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; 
     } 
    } 

} 

這裏是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; 
    } 
} 

有在這一點上是沒有太大的任一類,他們大多是皮的,但我只是想在繼續之前獲得這個基本的功能,並且作爲我的小白,我不知道爲什麼這不起作用。

+0

您應該使用支持設計庫中的FAB – tyczj

+0

注意將我鏈接到一些有用的東西?這是第一次與FAB合作,所以我只是從Google的一個示例中獲取代碼。那不是來自支持設計庫嗎? – erp

+0

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

回答

23

如果你是不是已經爲最後期限的標題,你必須改變浮動操作按鈕,通過谷歌在設計庫 提供了一個只需按照http://android-developers.blogspot.in/2015/05/android-design-support-library.html

添加到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" 
     ... /> 

添加到後面的代碼:

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

欲瞭解更多詳細信息如下:FloatingActionButton example with Support Library

+0

謝謝,這是與支持庫現在正確的答案。 – erp

2

要使用對話框/ Alertdialog與浮動操作按鈕你」再利用,嘗試從這個

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

改變你的onClick(視圖v),以

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