2015-08-19 87 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> 

但是切換按鈕變成了看不見的。

+2

你必須用你自己的drawable替換背景。 – Bhargav

+0

把你自己的'state_off.xml'和'state_on.xml'放在'drawable'文件夾中 –

+0

state_off和state_on是我的drawable -....文件夾中的png圖標。爲什麼我需要將它們更改爲* .xml? –

回答

1

在MaterialDrawer庫中獲取自定義行爲的最簡潔的實現是創建您自己的Custom 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); 

這也將讓該項目的根據需要修改和設置此按鈕。

相關問題