2015-08-19 4 views
0

Мне нужно установить собственный стиль для кнопки переключения https://github.com/mikepenz/MaterialDrawer/blob/fde00e5573310384b90d1f7f92d2b45c2ed8a2ba/library/src/main/res/layout/material_drawer_item_toggle.xml#L58, но кнопка находится внутри внешней библиотеки. Как я могу это сделать?Как установить стиль для кнопки библиотеки

В моей теме я добавляю:

<item name="android:buttonStyleToggle">@drawable/btn_toggle</item> 

И в btn_toggle.xml добавить:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checked="false" android:drawable="@drawable/state_off" /> 
    <item android:state_checked="true" android:drawable="@drawable/state_on" /> 
</selector> 

Но ToggleButton стал невидимым.

+2

Вы должны заменить фон своей собственной возможностью рисования. – Bhargav

+0

Поместите свои собственные 'state_off.xml' и' state_on.xml' в папку 'drawable' –

+0

. State_off и state_on - это значки png в моих папках-drawable -..... Почему мне нужно изменить их на * .xml? –

ответ

1

Чистое внедрение для получения пользовательского поведения внутри библиотеки MaterialDrawer - это создание собственного пользовательского DrawerItem.

Посмотрите на DividerDrawerItem, который является одним из простых DrawerItems внутри проекта, как вы можете это сделать.

В вашем случае вы хотите изменить ToggleDrawerItem. Просто скопируйте код и внесите изменения в ваши потребности.

public class ToggleDrawerItem extends BasePrimaryDrawerItem<ToggleDrawerItem> { 
    private boolean toggleEnabled = true; 

    private boolean checked = false; 
    private OnCheckedChangeListener onCheckedChangeListener = null; 

    public ToggleDrawerItem withChecked(boolean checked) { 
     this.checked = checked; 
     return this; 
    } 

    public ToggleDrawerItem withToggleEnabled(boolean toggleEnabled) { 
     this.toggleEnabled = toggleEnabled; 
     return this; 
    } 

    public ToggleDrawerItem withOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) { 
     this.onCheckedChangeListener = onCheckedChangeListener; 
     return this; 
    } 

    public boolean isChecked() { 
     return checked; 
    } 

    public void setChecked(boolean checked) { 
     this.checked = checked; 
    } 

    public boolean isToggleEnabled() { 
     return toggleEnabled; 
    } 

    public void setToggleEnabled(boolean toggleEnabled) { 
     this.toggleEnabled = toggleEnabled; 
    } 

    public OnCheckedChangeListener getOnCheckedChangeListener() { 
     return onCheckedChangeListener; 
    } 

    public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) { 
     this.onCheckedChangeListener = onCheckedChangeListener; 
    } 

    @Override 
    public String getType() { 
     return "TOGGLE_ITEM"; 
    } 

    @Override 
    @LayoutRes 
    public int getLayoutRes() { 
     return R.layout.material_drawer_item_toggle; 
    } 

    @Override 
    public void bindView(RecyclerView.ViewHolder holder) { 
     //get our viewHolder 
     final ViewHolder viewHolder = (ViewHolder) holder; 

     //bind the basic view parts 
     bindViewHelper((BaseViewHolder) holder); 

     if (!isSelectable()) { 
      viewHolder.view.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (toggleEnabled) { 
         viewHolder.toggle.setChecked(!viewHolder.toggle.isChecked()); 
        } 
       } 
      }); 
     } 

     viewHolder.toggle.setChecked(checked); 
     viewHolder.toggle.setOnCheckedChangeListener(checkedChangeListener); 
     viewHolder.toggle.setEnabled(toggleEnabled); 

     //call the onPostBindView method to trigger post bind view actions (like the listener to modify the item if required) 
     onPostBindView(this, holder.itemView); 
    } 

    @Override 
    public ViewHolderFactory getFactory() { 
     return new ItemFactory(); 
    } 

    public static class ItemFactory implements ViewHolderFactory<ViewHolder> { 
     public ViewHolder factory(View v) { 
      return new ViewHolder(v); 
     } 
    } 

    private static class ViewHolder extends BaseViewHolder { 
     private ToggleButton toggle; 

     private ViewHolder(View view) { 
      super(view); 
      this.toggle = (ToggleButton) view.findViewById(R.id.material_drawer_toggle); 
     } 
    } 

    private CompoundButton.OnCheckedChangeListener checkedChangeListener = new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      checked = isChecked; 

      if (getOnCheckedChangeListener() != null) { 
       getOnCheckedChangeListener().onCheckedChanged(ToggleDrawerItem.this, buttonView, isChecked); 
      } 
     } 
    }; 
} 

Более продвинутый, но более простое решение, чтобы добавить onPostBindView слушателя к объекту, который требуется изменить и использовать ссылку на целях поиска material_drawer_toggle

(ToggleButton) view.findViewById(R.id.material_drawer_toggle); 

на это также позволит вашим для изменения и стилизации этой кнопки по мере необходимости.