6

Sto cercando di implementare un semplice cassetto di navigazione nella progettazione del materiale, quindi c'è un'intestazione nella parte superiore del mio cassetto e alcuni elementi di testo (A: CompactHeader Drawer,. ..) (vedi immagine 1). Quando si fa clic sull'immagine dell'intestazione, è necessario aprire un elenco (B: [email protected], ...) e "sovrascrivere" i miei elementi di testo esistenti (A) (vedere la figura 2). Se viene selezionato un oggetto di testo (B), l'elenco originale (A) deve essere tornato nella sua posizione originale e (B) non è più visibile (vedere la figura 1).Navigatore di navigazione Android - Sostituisci lista con altro elenco onClick

Picture 1 Picture 2

Nota: queste le immagini provengono da un tutorial, ma il codice era troppo confuso. Sto cercando una soluzione relativamente semplice ... Stavo pensando a Frammenti, ma non so se questo è il modo giusto per attaccare questo problema.

+0

come si aggiungono gli articoli alla lista della lista dei cassetti? forse questa è la soluzione, aggiungi il codice per aiutarti –

+0

Come puoi vedere entrambe le ListView non sono dello stesso tipo, perché il font e la spaziatura sono diversi. Ecco perché stavo pensando a Frammenti. Il tutorial: https: // github.com/mikepenz/MaterialDrawer Forse scoprirai come ha fatto Mike Penz ... –

+0

@ MbengaMutombo seguendo il codice, in questa classe: https://github.com/mikepenz/MaterialDrawer/blob/master/app/src/ main/java/com/mikepenz/materialdrawer/app/ComplexHeaderDrawerActivity.java alla riga 52, crea l'intestazione (e-mail) e sulla riga 88 aggiunge l'intestazione al cassetto, dopo aver aggiunto l'intestazione, usa un listener per i clic, controlla se hai un codice diverso su questo, non ho il mio cellulare per provarlo adesso –

risposta

2

Non esiste un'API per questo caso d'uso, il che significa che deve essere gestito manualmente. Invece di gonfiare le voci di menu dalle risorse (/res/menu), è necessario fornire il layout personalizzato tramite app:headerLayout, che simula quelle voci di menu: questo layout contiene entrambe le sezioni di intestazione e le sezioni di menu create con layout ordinario.

Così, dopo aver definito il layout principale in questo modo:

<?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> 

Dove 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> 

E 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> 

Poi in attività:

 

    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); 
     } 

    } 
 

Otterrete questo output:

enter image description here

fornire il proprio layout per content_1 e content_2 file di layout per misura il vostro caso d'uso.

1

Grazie mille! Sulla base della risposta @azizbekian e @Mohsen condividerò la mia soluzione totale che funziona perfettamente e dà il risultato desiderato.

Così, dopo aver definito il mio layout radice in questo modo:

<?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> 

Dove 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> 

Poi in attività:

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); 
     } 
    } 

E questo è desiderato in uscita. Grazie a tutti! enter image description here

Problemi correlati