6

Jestem stosunkowo nowy w rozwoju interfejsu użytkownika Androida. Potrzebuję więc pomocy od bardziej doświadczonych programistów.
Tworzę swoją aplikację z Navigation Drawer, miałem do czynienia z wieloma problemami.
Po pierwsze, oto przykładowy kod szuflady nawigacji.Szuflada nawigacji wiele kontenerów i najlepsza praktyka

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <!-- The main content view --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
    <!-- The navigation drawer --> 
    <ListView android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" 
     android:background="#111"/> 
</android.support.v4.widget.DrawerLayout> 

To prosty przykład z oficjalnej strony.

Główny widok zawartość (the FrameLayout powyżej) musi być pierwszym dzieckiem w DrawerLayout ponieważ kolejność XML zakłada uporządkowanie i z-szuflada musi być na wierzchu zawartości.

W tym przykładzie istnieją dwa zagnieżdżone odsłony: FrameLayout jak wspomniano do przechowywania główną treść i ListView za reprezentowanie NavigationDrawer menu wcześniej.

Oto moje pytania.

  1. Prawdziwa aplikacja nie ma tylko jednego widoku na całą aktywność. Przeważnie aktywność ma wiele różnych widoków i kilka fragmentów, aby interfejs był bardziej responsywny i zapewniał użytkownikowi lepszy UX. Moje działania to oczywiście różne poglądy i fragmenty (jaki jest cel tych samych Działań? :)). Jedna czynność ma tylko jeden fragment, inny ma kilka fragmentów, więc są WSZYSTKIE różne ... W poprzednim przykładzie kodu jest TYLKO JEDEN FrameLayout pojemnik do przechowywania Fragment TYLKO JEDEN fragment, co muszę zrobić, jeśli moja Aktywność ma dwa, trzy lub więcej fragmentów? Jakie jest najlepsze rozwiązanie w tym przypadku.
  2. Tak jak opisywałem, moja aplikacja ma wiele działań, więc moja szuflada nawigacji musi być zgodna z praktyką interfejsu użytkownika Androida w każdym działaniu, aby umożliwić użytkownikowi nawigację do elementów najwyższego poziomu aplikacji. W tym przypadku lepiej jest mieć jeden BaseActivity (czytałem odpowiedzi tutaj na stackoverflow), który będzie przechowywać wszystkie rzeczy konfiguracyjne dla NavigationDrawer. Ale w zakresie, w jakim Navigation Drawer wymaga DrawerLayout w formacie XML działania, BaseActivity powinien wywołać metodę setContentView. A wszystko odziedziczone po BaseActivity aktywności powinno zrobić kilka sztuczek, aby ustawić własny układ, lub nie ma sensu, aby zastąpić tę metodę, ponieważ złamie całą logikę. Co robić w tym przypadku?
  3. Jaki jest najbardziej efektywny sposób tworzyć niestandardowe listy szuflady nawigacji jak w google + lub YouTube bez użycia skomplikowanej hierarchii widok, który sprawia, GPU ciężko pracować i może przynieść użytkownika złe doświadczenia

Na drugi problem mam kilka pomysłów, jak mogę to rozwiązać, ale nie wiem, czy to jest poprawny sposób i jakie podejście jest lepsze.
Pierwszym pomysłem jest wdrożenie szablonu TemplateMethod. Utwórz metodę w stylu BaseActivity coś podobnego do setupCustomViewGroup() i nadpisaj ją we wszystkich działaniach nadmuchując żądaną grupę view z xml i zwróć ją z tej metody, a następnie użyj jej do nadmuchania całego widoku.

Lub bezpośrednio dodaj widok do działania, użyj znacznika scalania i dołączania.

Ale może to być pomocne tylko dla całej aktywności lub jednego fragmentu, co zrobić, jeśli mamy więcej fragmentów, użyj zagnieżdżonych fragmentów, myślę, że to zły pomysł.

Ponadto moim celem jest optymalizacja hierarchii widoków, aby była szybka i wydajna, aby zapewnić płynność nawet na starych urządzeniach.

Będę bardzo wdzięczny każdemu, kto potrafi opisać lub zaproponować najbardziej efektywny i prawidłowy sposób postępowania w tym przypadku, aby interfejs był responsywny, a kod czytelny.

Dziękuję.

Odpowiedz

2

1) Migracja z NavigationDrawer do SlideMenu (dostępne na github).

2) Upewnij się, że Twoja usługa BaseActivity nie ma żadnego układu.

3) Napełnij swój przedmiot listview poprzez ArrayAdapter.

Mam nadzieję, że to pomoże.

0

można użyć fragmentów i nazywają je z główną działalność tylko tak:

MainActivity.java 
public class MainActivity extends Activity { 
.. 
.. 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
.. 
mDrawerList.setOnItemClickListener(new SlideMenuClickListener()); 
} 

/** 
* Slide menu item click listener 
* */ 
private class SlideMenuClickListener implements 
     ListView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     // display view for selected nav drawer item 
     displayView(position); 
    } 
} 

/** 
* Diplaying fragment view for selected nav drawer list item 
* */ 
private void displayView(int position) { 
    // update the main content by replacing fragments 
    Fragment fragment = null; 
    switch (position) { 
    case 0: 
     fragment = new HomeFragment(); 
     break; 
    case 1: 
     fragment = new FindPeopleFragment(); 
     break; 
    case 2: 
     fragment = new PhotosFragment(); 
     break; 
    case 3: 
     fragment = new CommunityFragment(); 
     break; 
    case 4: 
     fragment = new PagesFragment(); 
     break; 
    case 5: 
     fragment = new WhatsHotFragment(); 
     break; 

    default: 
     break; 
    } 

    if (fragment != null) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.frame_container, fragment).commit(); 

     // update selected item and title, then close the drawer 
     mDrawerList.setItemChecked(position, true); 
     mDrawerList.setSelection(position); 
     setTitle(navMenuTitles[position]); 
     mDrawerLayout.closeDrawer(mDrawerList); 
    } else { 
     // error in creating fragment 
     Log.e("MainActivity", "Error in creating fragment"); 
    } 
} 

}

odjazdu this poradnik, może ci pomóc więcej

1

rozwiązanie:

1. Mogę myśleć o 2 przypadkach tutaj:

  1. Wiele fragmentów pojedynczego działania: W tym przypadku, najlepszym sposobem jest replace fragmentów w FrameLayoutcontent_frame podczas przełączania między fragmentami. Zawartość navigation drawer pozostaje taka sama dla nich
  2. Wiele fragmentów, wiele czynności: W tym przypadku należy zdefiniować inny układ zawartości navigation drawer i używać ich z wywoływaniem setHasOptionsMenu(true) podczas przełączania między działaniami.

2. Jeśli używasz ListView jako navigation drawer następnie można łatwo osiągnąć poprzez swoją pracę w dynamicznie zapełnianie rowListView. Unikaj przeskakiwania z BaseActivity w jak największym stopniu w tym scenariuszu. Jeśli nie używasz ListView jako navigation drawer zawartość następnie można zdefiniować inny układ o różnej aktywności, jak napisałem w powyższym punkcie

3. myślę Google+ aplikacja używa ListView jak navigation drawer swojego custom projektu. To zależy od potrzeb danej aplikacji, czy można przejść z List lub można utworzyć simple niestandardowych układów dla danej aplikacji

Mam nadzieję, że moje rozwiązanie będzie rozwiązać swoje wątpliwości w pewnym stopniu

Powiązane problemy