6

Я пытаюсь реализовать простой ящик для навигации в материальном дизайне, поэтому есть заголовок в верхней части моего ящика и некоторые текстовые элементы (A: CompactHeader Drawer,. ..) (см. рисунок 1). При щелчке по заголовку следует открыть список (B: [email protected], ...) и «перезаписать» мои существующие текстовые элементы (A) (см. Рисунок 2). Если выбран текстовый элемент (B), исходный список (A) должен быть обратно в исходное место и (B) больше не отображается (см. Рисунок 1).Android Navigation Drawer - Заменить список другим списком onClick

Picture 1 Picture 2

Примечание: Эти скриншоты происходят из учебника, но код был слишком запутанным. Я ищу относительно простое решение ... Я думал об Фрагментах, но я не знаю, правильно ли это атаковать эту проблему.

+0

Как вы можете добавить товар в список избранных? возможно, это решение, пожалуйста, добавьте код, который поможет вам. –

+0

Как вы можете видеть, как ListViews не одного типа, потому что шрифт и интервал различны. Вот почему я думал об Фрагментах. Учебник: https: // github.com/mikepenz/MaterialDrawer Возможно, вы узнаете, как это сделал Майк Пенз ... –

+0

@ MbengaMutombo, следуя коду, в этом классе: https://github.com/mikepenz/MaterialDrawer/blob/master/app/src/ main/java/com/mikepenz/materialdrawer/app/ComplexHeaderDrawerActivity.java в строке 52, он создает заголовок (электронные письма) и в строке 88 добавляет заголовок в ящик, после добавления заголовка, использует прослушиватель для кликов, проверьте, есть ли у вас другой код, у меня нет моего мобильного телефона, чтобы попробовать прямо сейчас. –

ответ

2

Для этого варианта использования API не существует, а это значит, что его следует обрабатывать вручную. Вместо того, чтобы раздувать пункты меню из ресурсов (/res/menu), вы должны предоставить свой собственный макет через app:headerLayout, который имитирует эти пункты меню: этот макет содержит разделы заголовков и разделов пунктов меню, выполненные с обычным макетом.

Таким образом, определив свое расположение корня, как это:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/drawer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#7e25d1" /> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigation_view" 
     android:layout_width="300dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:headerLayout="@layout/navigation_view" /> 

</android.support.v4.widget.DrawerLayout> 

Где navigation_view.xml является:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <include 
     android:id="@+id/include" 
     layout="@layout/header" 
     android:layout_width="match_parent" 
     android:layout_height="190dp" /> 

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

</LinearLayout> 

И header.xml является:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="190dp" 
    android:background="@drawable/background_material"> 

    <de.hdodenhof.circleimageview.CircleImageView 
     android:id="@+id/profile_image" 
     android:layout_width="60dp" 
     android:layout_height="0dp" 
     android:layout_marginLeft="24dp" 
     android:layout_marginStart="16dp" 
     android:layout_marginTop="40dp" 
     android:src="@drawable/profile" 
     app:civ_border_color="#FF000000" 
     app:layout_constraintDimensionRatio="h,1:1" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 

    <TextView 
     android:id="@+id/username" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="4dp" 
     android:text="John Doe" 
     android:textColor="#FFF" 
     android:textSize="14sp" 
     android:textStyle="bold" 
     app:layout_constraintBottom_toTopOf="@+id/email" 
     app:layout_constraintLeft_toLeftOf="@+id/profile_image" 
     app:layout_constraintStart_toStartOf="@+id/profile_image" /> 

    <TextView 
     android:id="@+id/email" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="8dp" 
     android:text="[email protected]" 
     android:textColor="#fff" 
     android:textSize="14sp" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintLeft_toLeftOf="@+id/username" 
     app:layout_constraintStart_toStartOf="@+id/username" /> 

    <ImageButton 
     android:id="@+id/arrow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="16dp" 
     android:layout_marginEnd="16dp" 
     android:background="?selectableItemBackgroundBorderless" 
     android:src="@drawable/ic_arrow_drop_down_black_24dp" 
     android:tint="#ffffff" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintEnd_toEndOf="parent" /> 

</android.support.constraint.ConstraintLayout> 

Затем в деятельности:

 

    public class MainActivity extends AppCompatActivity { 

     boolean initial = true; 

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

      NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view); 
      View headerView = navigationView.getHeaderView(0); 
      ImageButton arrow = headerView.findViewById(R.id.arrow); 
      ViewGroup frame = headerView.findViewById(R.id.frame); 
      frame.setOnClickListener(v -> toggle(arrow, frame)); 
      changeContent(frame); 
      arrow.setOnClickListener(v -> toggle(arrow, frame)); 
     } 

     private void toggle(ImageButton arrow, ViewGroup frame) { 
      initial = !initial; 
      arrow.setImageDrawable(ContextCompat.getDrawable(MainActivity.this, initial ? R.drawable.ic_arrow_drop_down_black_24dp : R.drawable.ic_arrow_drop_up_black_24dp)); 
      changeContent(frame); 
     } 

     private void changeContent(ViewGroup frame) { 
      frame.removeAllViews(); 
      getLayoutInflater().inflate(initial ? R.layout.content1 : R.layout.content2, frame); 
     } 

    } 
 

Вы получите этот результат:

enter image description here

Обеспечить макет для content_1 и content_2 файлов макет, чтобы соответствовать вашему случаю использования.

1

Большое вам спасибо! Основываясь на ответе @azizbekian и @Mohsen, я поделюсь своим полным решением, которое прекрасно работает и дает желаемый результат.

Таким образом, определив мой корневой макет так:

<?xml version="1.0" encoding="utf-8"?> 
<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" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="start"> 


    <include 
     layout="@layout/app_bar_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 


    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="@color/colorFlatWhite" 
     android:fitsSystemWindows="true" 
     app:headerLayout="@layout/nav_header_main" 
     app:itemIconTint="@color/colorFlatDarkerGray" 
     app:itemTextColor="@color/colorFlatDarkerGray" 
     app:menu="@menu/navigation" /> 


</android.support.v4.widget.DrawerLayout> 

Где nav_header_main.xml является:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/nav_header_height" 
    android:background="@color/colorFlatBlue" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark"> 


    <android.support.v7.widget.CardView 
     android:id="@+id/profile_image" 
     android:layout_width="70dp" 
     android:layout_height="0dp" 
     android:layout_marginLeft="10dp" 
     android:layout_marginTop="40dp" 
     android:shape="ring" 
     app:cardCornerRadius="35dp" 
     app:cardElevation="0dp" 
     app:layout_constraintDimensionRatio="h,1:1" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent"> 

     <ImageView 
      android:id="@+id/img_profile" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:padding="15dp" 
      android:src="@drawable/ic_home" 
      android:tint="@color/colorFlatFontColorBlack" /> 
    </android.support.v7.widget.CardView> 


    <TextView 
     android:id="@+id/username" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingBottom="4dp" 
     android:text="John Doe" 
     android:textColor="#FFF" 
     android:textSize="14sp" 
     android:textStyle="bold" 
     app:layout_constraintBottom_toTopOf="@+id/email" 
     app:layout_constraintLeft_toLeftOf="@+id/profile_image" 
     app:layout_constraintStart_toStartOf="@+id/profile_image" /> 

    <TextView 
     android:id="@+id/email" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="8dp" 
     android:text="[email protected]" 
     android:textColor="#fff" 
     android:textSize="14sp" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintLeft_toLeftOf="@+id/username" 
     app:layout_constraintStart_toStartOf="@+id/username" /> 

    <ImageButton 
     android:id="@+id/arrow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="16dp" 
     android:layout_marginEnd="16dp" 
     android:layout_marginRight="16dp" 
     android:background="?selectableItemBackgroundBorderless" 
     android:tint="#ffffff" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:srcCompat="@drawable/ic_arrow_downward_black_24dp" /> 


</android.support.constraint.ConstraintLayout> 

Затем в деятельности:

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

     navigationView = (NavigationView) findViewById(R.id.nav_view); 
     View headerView = navigationView.getHeaderView(0); 
     final ImageButton arrow = (ImageButton) headerView.findViewById(R.id.arrow); 
     arrow.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       toggle(arrow); 
      } 
     }); 
    } 

    boolean initial=true; 
    private void toggle(ImageButton arrow) { 
     initial = !initial; 
     arrow.setImageDrawable(ContextCompat.getDrawable(MainActivity.this, initial ? R.drawable.ic_arrow_downward_black_24dp : R.drawable.ic_arrow_upward_black_24dp)); 
     if(initial) 
     { 
      navigationView.getMenu().clear(); 
      navigationView.inflateMenu(R.menu.navigation); 
      SetLeftMenuNavLabels(); 

     }else 
     { 
      navigationView.getMenu().clear(); 
      navigationView.getMenu().add("[email protected]").setIcon( R.drawable.ic_home); 
      navigationView.getMenu().add("[email protected]").setIcon( R.drawable.ic_home); 
      navigationView.getMenu().add("Add New Account").setIcon( R.drawable.ic_add); 
      navigationView.getMenu().add("Manage Accounts").setIcon( R.drawable.ic_settings); 
     } 
    } 

И это желательно выход. Спасибо вам за все! enter image description here