2015-06-16 2 views
6

Я новичок в работе с плавающей кнопкой действия и пытаюсь получить некоторые из основных вещей, которые работают сегодня. В настоящее время я застрял на том, чтобы работать с функциональностью onClick. Я вытащил большую часть кода из базового примера Google googles 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

Если вы еще не заголовок для крайнего срока, необходимо изменить кнопку плавающих действий на одном представленной Google в дизайне библиотеке просто следовать http://android-developers.blogspot.in/2015/05/android-design-support-library.html

Добавить в XML Layout:

<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

5

На самом деле теперь с андроидами библиотекой поддержки это было очень легко добавить FAB и настроить его с помощью щелчка слушателей

FloatingActionButton fab = findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // FAB Action goes here 
     } 
    }); 

Ссылки: http://androidgifts.com/android-material-design-floating-action-button-tutorial/

2

Чтобы использовать диалоговый/Alertdialog с помощью кнопки плавучего действия, которое вы» повторно используя, попробуйте изменить OnClick (View v) из этого

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

в

AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext()); 
Смежные вопросы