2015-03-22 30 views
5

Próbuję zaimplementować przycisk przełączania w projekcie szuflady nawigacji, który Android Studio może automatycznie generować. W końcu chcę mieć coś takiego („TYLKO” -Button):Przycisk przełączania w szufladzie nawigacji

enter image description here

Niestety nie rozumiem jak dodać przycisk przełączania do ListView z NavDrawer. Prawdopodobnie mógłbym użyć jednego z "Custom NavDrawer Libs", ale chciałbym zrozumieć sposób, w jaki Google proponuje to z generowanym automatycznie przykładem.

Jakieś pomysły dotyczące wdrożenia tego w domyślny projekt NavDrawer?

Odpowiedz

4

Zrobiłbym coś takiego: zamiast korzystania z listview użyłbym RecyclerView. Następnie tworzę trzy różne definicje layoutu dla etykiety z ikoną, rozdzielaczem i etykietą z opcjonalnym przełącznikiem. Twój adapter RecyclerView powinien rozszerzyć formularz RecyclerView.Adapter. Dla każdego z tych trzech układów powinieneś stworzyć własną implementację ViewHolder. Teraz musisz utworzyć kilka klas dla elementów listy i jednej superklasy dla wszystkich z nich. W twoim adapterze musisz zastąpić metodę getViewType. Jutro, kiedy jestem w pracy, mogę opublikować dla ciebie kod demonstracyjny.

Edit:

activity_main.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context="de.devhew.navigationdrawerexample.MainActivity"> 

    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/toolbar_main" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="?attr/colorPrimary" 
     android:minHeight="?attr/actionBarSize" 
     app:popupTheme="@style/AppTheme.Toolbar.Overflow" 
     app:theme="@style/AppTheme.Toolbar" /> 

    <FrameLayout 
     android:id="@+id/main_content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</LinearLayout> 

<fragment 
    android:id="@+id/fragment_navigation_drawer" 
    android:name="de.devhew.navigationdrawerexample.drawer.NavigationDrawerFragment" 
    android:layout_width="280dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    app:layout="@layout/fragment_navigation_drawer" 
    tools:layout="@layout/fragment_navigation_drawer" /> 

MainActivity.java

public class MainActivity extends ActionBarActivity { 

private Toolbar toolbar; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    toolbar = (Toolbar) findViewById(R.id.toolbar_main); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    List<NavDrawerEntry> drawerEntries = new ArrayList<>(); 
    drawerEntries.add(new NavDrawerItemWithIcon("Home", R.drawable.app_generic)); 
    drawerEntries.add(new NavDrawerItemWithIcon("People", R.drawable.app_generic)); 
    drawerEntries.add(new NavDrawerItemWithIcon("Stuff", R.drawable.app_generic)); 
    drawerEntries.add(new NavDrawerDivider()); 
    drawerEntries.add(new NavDrawerItem("Settings")); 
    drawerEntries.add(new NavDrawerToggle("Wifi only")); 

    NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
    drawerFragment.init((android.support.v4.widget.DrawerLayout) findViewById(R.id.drawer_layout), 
      toolbar, drawerEntries); 
}} 

NavigationDrawerFragment.java

public class NavigationDrawerFragment extends Fragment { 

private View root; 
private ActionBarDrawerToggle mDrawerToggle; 
private DrawerLayout mDrawerLayout; 
private RecyclerView mRecyclerView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    root = inflater.inflate(R.layout.fragment_navigation_drawer, container, false); 
    return root; 
} 

public void init(DrawerLayout drawerLayout, final Toolbar toolbar, List<NavDrawerEntry> drawerEntries) { 
    mDrawerLayout = drawerLayout; 
    mDrawerToggle = new ActionBarDrawerToggle(getActivity(), 
      drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) { 
     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      getActivity().invalidateOptionsMenu(); 
     } 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
      getActivity().invalidateOptionsMenu(); 
     } 
    }; 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    mDrawerLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      mDrawerToggle.syncState(); 
     } 
    }); 

    mRecyclerView = (RecyclerView) root.findViewById(R.id.nav_list); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    mRecyclerView.setHasFixedSize(true); 

    NavigationDrawerAdapter adapter = new NavigationDrawerAdapter(getActivity(), drawerEntries); 
    mRecyclerView.setAdapter(adapter); 
}} 

NavigationDrawerAdapter.java

public class NavigationDrawerAdapter 
    extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

private List<NavDrawerEntry> data; 
private LayoutInflater inflater; 

public NavigationDrawerAdapter(Context context, List<NavDrawerEntry> data) { 
    this.data = data; 
    this.inflater = LayoutInflater.from(context); 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 

    View itemLayoutView; 
    switch (viewType) { 
     case 0: 
      itemLayoutView = inflater.inflate(R.layout.layout_nav_drawer_item_with_icon, viewGroup, false); 
      ItemWithIconVH holder = new ItemWithIconVH(itemLayoutView); 
      return holder; 
     case 1: 
      itemLayoutView = inflater.inflate(R.layout.layout_nav_drawer_divider, viewGroup, false); 
      DividerVH dividerViewHolder = new DividerVH(itemLayoutView); 
      return dividerViewHolder; 
     case 2: 
      itemLayoutView = inflater.inflate(R.layout.layout_nav_drawer_item, viewGroup, false); 
      ItemVH itemViewHolder = new ItemVH(itemLayoutView); 
      return itemViewHolder; 
     case 3: 
      itemLayoutView = inflater.inflate(R.layout.layout_nav_drawer_toggle, viewGroup, false); 
      ToggleVH toggleViewHolder = new ToggleVH(itemLayoutView); 
      return toggleViewHolder; 
    } 
    return null; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
    final NavDrawerEntry item = data.get(position); 

    if (item instanceof NavDrawerItemWithIcon) { 
     ItemWithIconVH viewHolder = (ItemWithIconVH) holder; 
     viewHolder.mTitle.setText(((NavDrawerItemWithIcon) item).getTitle()); 
     viewHolder.mImageView.setImageResource(((NavDrawerItemWithIcon) item).getIconId()); 
    } 

    if (item instanceof NavDrawerItem) { 
     ItemVH viewHolder = (ItemVH) holder; 
     viewHolder.mTitle.setText(((NavDrawerItem) item).getTitle()); 
    } 

    if (item instanceof NavDrawerToggle) { 
     ToggleVH viewHolder = (ToggleVH) holder; 
     viewHolder.mTitle.setText(((NavDrawerToggle) item).getTitle()); 
     viewHolder.mSwitch.setChecked(((NavDrawerToggle) item).isChecked()); 
    } 
} 

@Override 
public int getItemViewType(int position) { 
    if (data.get(position) instanceof NavDrawerItemWithIcon) 
     return 0; 

    if (data.get(position) instanceof NavDrawerDivider) 
     return 1; 

    if (data.get(position) instanceof NavDrawerItem) 
     return 2; 

    if (data.get(position) instanceof NavDrawerToggle) 
     return 3; 

    return -1; 
} 

@Override 
public int getItemCount() { 
    return data.size(); 
} 

class ItemWithIconVH extends RecyclerView.ViewHolder { 
    final TextView mTitle; 
    final ImageView mImageView; 

    public ItemWithIconVH(View itemView) { 
     super(itemView); 
     mTitle = (TextView) itemView.findViewById(R.id.nav_item_title); 
     mImageView = (ImageView) itemView.findViewById(R.id.nav_item_image); 
    } 
} 

class DividerVH extends RecyclerView.ViewHolder { 
    public DividerVH(View itemView) { 
     super(itemView); 
    } 
} 

class ItemVH extends RecyclerView.ViewHolder { 
    final TextView mTitle; 

    public ItemVH(View itemView) { 
     super(itemView); 
     mTitle = (TextView) itemView.findViewById(R.id.nav_item_title); 
    } 
} 

class ToggleVH extends RecyclerView.ViewHolder { 
    final TextView mTitle; 
    final Switch mSwitch; 

    public ToggleVH(View itemView) { 
     super(itemView); 
     mTitle = (TextView) itemView.findViewById(R.id.nav_item_title); 
     mSwitch = (Switch) itemView.findViewById(R.id.nav_switch); 
    } 
}} 

Nadklasa dla wszystkich elementów NavDrawer:

public class NavDrawerEntry {} 

Pozycja bez ikony:

public class NavDrawerItem extends NavDrawerEntry { 
private String title; 

public NavDrawerItem(String title) { 
    this.setTitle(title); 
} 

public String getTitle() { 
    return title; 
} 

private void setTitle(String title) { 
    this.title = title; 
}} 

Element z ikoną:

public class NavDrawerItemWithIcon extends NavDrawerEntry { 
private String title; 
private int iconId; 

public NavDrawerItemWithIcon(String title, int iconId) { 
    this.setTitle(title); 
    this.setIconId(iconId); 
} 

public int getIconId() { 
    return iconId; 
} 

private void setIconId(int iconId) { 
    this.iconId = iconId; 
} 

public String getTitle() { 
    return title; 
} 

private void setTitle(String title) { 
    this.title = title; 
}} 

Przegroda:

public class NavDrawerDivider extends NavDrawerEntry {} 

Element z przełącznika:

public class NavDrawerToggle extends NavDrawerEntry { 
private String title; 
private boolean checked; 

public NavDrawerToggle(String title) { 
    this.setTitle(title); 
} 

public boolean isChecked() { 
    return checked; 
} 

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

public String getTitle() { 
    return title; 
} 

private void setTitle(String title) { 
    this.title = title; 
}} 

layout_nav_drawer_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="60dp" 
android:clickable="true" 
android:orientation="horizontal"> 

<TextView 
    android:id="@+id/nav_item_title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_gravity="center_vertical" 
    android:layout_marginLeft="16dp" 
    android:fontFamily="sans-serif" 
    android:textColor="#000" 
    android:textSize="16sp" /></LinearLayout> 

layout_nav_drawer_item_with_icon.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="60dp" 
android:clickable="true" 
android:orientation="horizontal"> 

<ImageView 
    android:id="@+id/nav_item_image" 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    android:layout_gravity="center_vertical" 
    android:layout_marginLeft="16dp" 
    android:src="@drawable/app_generic" /> 

<TextView 
    android:id="@+id/nav_item_title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_gravity="center_vertical" 
    android:layout_marginLeft="16dp" 
    android:fontFamily="sans-serif" 
    android:text="Verbundene Geräte" 
    android:textColor="#000" 
    android:textSize="16sp" /></LinearLayout> 

la yout_nav_drawer_divider.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical"> 

<View 
    android:layout_width="match_parent" 
    android:layout_height="1dp" 
    android:background="#ddd" 
    android:layout_marginBottom="8dp" 
    android:layout_marginTop="8dp" /></LinearLayout> 

layout_nav_drawer_toggle.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="60dp" 
android:clickable="true"> 

<TextView 
    android:id="@+id/nav_item_title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_gravity="center_vertical" 
    android:layout_marginLeft="16dp" 
    android:fontFamily="sans-serif" 
    android:text="Verbundene Geräte" 
    android:textColor="#000" 
    android:textSize="16sp" /> 

<Switch 
    android:id="@+id/nav_switch" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true" 
    android:layout_marginRight="16dp" /></RelativeLayout> 

fragment_navigation_drawer.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="280dp" 
android:layout_height="match_parent" 
android:background="#eee" 
tools:context="de.vacom.hew.materialdemo.NavigationDrawerFragment"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="120dp" 
     android:background="@color/primaryColor" 
     android:elevation="3dp" 
     android:orientation="horizontal"> 

     <ImageView 
      android:id="@+id/nav_app_icon" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_marginLeft="16dp" 
      android:layout_marginTop="55dp" 
      android:src="@drawable/app_generic" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="8dp" 
      android:layout_marginTop="64dp" 
      android:fontFamily="sans-serif-medium" 
      android:text="Demo App" 
      android:textColor="#eee" 
      android:textSize="18sp" /> 

    </LinearLayout> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/nav_list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout></FrameLayout> 
+0

To byłoby niesamowite, dziękuję! EDYCJA: Próbowałem przez kilka godzin, aby uzyskać L & F zasad projektowania materiałów i ostatecznie skończyło się na tym: https://github.com/mikepenz/MaterialDrawer Jeśli można oprzeć swoje modyfikacje na tym przykładzie, I byłbym naprawdę wdzięczny. :-) – sonovice

+0

Mój kod to moja własna implementacja różnych elementów na stronie navDrawer. Przepraszam, widziałem cię Edytuj do późnych zmian. Spróbuj mojego przykładu, może ci to pomoże. – HeW

+0

Wielkie dzięki, popatrzę na twoją naprawdę obszerną edycję. Jeśli nie jest to zbyt duże pytanie, czy mógłbyś spakować kod i przesłać go gdzieś? Próbowałem skopiować wszystko w projekcie, ale wciąż dostaję mnóstwo błędów ... – sonovice