Zrobiłem działającą szufladę nawigacji, tak jak pokazano w samouczku na stronie developer.android.com . Ale teraz chcę użyć jednej szuflady nawigacji, którą utworzyłem w pliku NavigationDrawer.class dla wielu działań w mojej aplikacji.
Moje pytanie brzmi: czy ktokolwiek tutaj może zrobić mały samouczek, który wyjaśnia, jak używać jednej szuflady nawigacji do wielu działań.
Przeczytałem go najpierw w tej szufladzie nawigacji Android w odpowiedzi na wiele działań
ale to nie zadziałało w moim Projekcie
public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(R.string.app_name);
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(R.string.menu);
}
};
drawerLayout.setDrawerListener(drawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
layers = getResources().getStringArray(R.array.layers_array);
drawerList = (ListView) findViewById(R.id.left_drawer);
View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
drawerList.addHeaderView(header, null, false);
drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
layers));
View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
R.layout.drawer_list_footer, null, false);
drawerList.addFooterView(footerView);
drawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
map.drawerClickEvent(pos);
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
}
W tym działaniu chcę mieć szufladę nawigacji, dlatego rozszerzam „NavigationDrawer”, aw niektórych innych działaniach chcę użyć tej samej szuflady nawigacji
public class SampleActivity extends NavigationDrawer {...}
Nie wiem co zmienić ...
Odpowiedzi:
Jeśli chcesz szuflady nawigacji, powinieneś użyć fragmentów. W zeszłym tygodniu wykonałem ten samouczek i działa świetnie:
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Możesz również pobrać przykładowy kod z tego samouczka, aby zobaczyć, jak to zrobić.
Bez fragmentów:
To jest Twój kod BaseActivity:
Wszystkie pozostałe działania, które muszą mieć szufladę nawigacji, powinny rozszerzyć to działanie zamiast samego działania, na przykład:
XML
Edytować:
Sam napotkałem pewne trudności, więc oto rozwiązanie, jeśli otrzymasz wyjątki NullPointerExceptions. W BaseActivity zmień funkcję onCreate na
protected void onCreateDrawer()
. Reszta może pozostać taka sama. W działaniach rozszerzających BaseActivity ustaw kod w następującej kolejności:Pomogło mi to rozwiązać problem, mam nadzieję, że to pomoże!
W ten sposób możesz utworzyć szufladę nawigacji z wieloma czynnościami, jeśli masz jakieś pytania, możesz je zadać.
Edycja 2:
Jak powiedział @GregDan,
BaseActivity
możesz również zastąpićsetContentView()
i wywołać tamCreateDrawer:źródło
Znalazłem najlepszą implementację. Jest w aplikacji Google I / O 2014 .
Używają tego samego podejścia co Kevin. Jeśli potrafisz oderwać się od wszystkich niepotrzebnych rzeczy w aplikacji we / wy, możesz wyodrębnić wszystko, czego potrzebujesz, a Google zapewnia, że jest to prawidłowe użycie wzoru szuflady nawigacji. Każde działanie opcjonalnie ma
DrawerLayout
swój główny układ. Interesującą częścią jest sposób nawigacji do innych ekranów. Jest zaimplementowany wBaseActivity
następujący sposób:Różni się to od powszechnego sposobu zastępowania bieżącego fragmentu transakcją fragmentu. Ale użytkownik nie dostrzega różnicy wizualnej.
źródło
overridePendingTransitions
.Tak więc odpowiedź jest spóźniona o kilka lat, ale ktoś może ją docenić. Android dał nam nowy widget, który ułatwia korzystanie z jednej szuflady nawigacji z kilkoma czynnościami.
android.support.design.widget.NavigationView jest modułowy i ma własny układ w folderze menu. Sposób, w jaki go używasz, polega na zawijaniu układów XML w następujący sposób:
Układ główny to android.support.v4.widget.DrawerLayout, który zawiera dwoje dzieci:
<include ... />
dla układu, który jest zawijany (patrz 2) i android.support.design.widget.NavigationView.nav_header_main jest po prostu LinearLayout z orientacją = pionową dla nagłówka Drawar nawigacji.
Activity_main_drawer to menu xml w twoim katalogu res / menu. Może zawierać elementy i grupy do wyboru. Jeśli korzystasz z Galerii AndroidStudio, kreator stworzy dla ciebie podstawową i będziesz mógł zobaczyć, jakie masz opcje.
Układ paska aplikacji jest zwykle teraz android.support.design.widget.CoordinatorLayout i będzie obejmował dwoje dzieci: android.support.design.widget.AppBarLayout (który zawiera android.support.v7.widget.Toolbar) i
<include ... >
dla twoja rzeczywista treść (patrz 3).Układ treści może być dowolnym układem. Jest to układ zawierający główną treść działania (bez szuflady nawigacji lub paska aplikacji).
Fajną rzeczą w tym wszystkim jest to, że możesz zawijać każdą aktywność w tych dwóch układach, ale nawigacja NavigationView (patrz krok 1) zawsze wskazuje na kreator_ aktywności (lub cokolwiek innego). Oznacza to, że będziesz mieć tę samą (*) szufladę nawigacji dla wszystkich działań.
źródło
Najłatwiejszy sposób ponownego wykorzystania wspólnej szuflady nawigacji wśród grupy działań
app_base_layout.xml
AppBaseActivity.java
źródło
AppBaseActivity
isetContentView
domyślny sposób powinny działać.Dla każdego, kto chce zrobić to, o co prosi oryginalny plakat, rozważ użycie fragmentów zamiast tego, jak powiedział Kevin. Oto doskonały samouczek, jak to zrobić:
https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer
Jeśli zdecydujesz się zamiast tego używać działań zamiast fragmentów, napotkasz problem ponownego tworzenia szuflady nawigacji za każdym razem, gdy przejdziesz do nowej aktywności. Powoduje to brzydkie / wolne renderowanie szuflady nawigacji za każdym razem.
źródło
Moja sugestia jest taka: nie używaj w ogóle działań, zamiast tego używaj fragmentów i umieszczaj je w pojemniku (na przykład Układ liniowy), w którym wyświetlasz swój pierwszy fragment.
Kod jest dostępny w samouczkach dla programistów Androida, wystarczy dostosować.
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Wskazane jest, abyś używał coraz większej liczby fragmentów w swojej aplikacji i powinny istnieć tylko cztery podstawowe działania lokalne dla Twojej aplikacji, o których wspominasz w pliku AndroidManifest.xml oprócz zewnętrznych (na przykład FacebookActivity):
SplashActivity: nie używa fragmentu i używa motywu FullScreen.
LoginSignUpActivity: W ogóle nie wymaga NavigationDrawer i żadnego przycisku Wstecz, więc po prostu użyj zwykłego paska narzędzi, ale wymagane będą co najmniej 3 lub 4 fragmenty. Używa motywu bez paska akcji
Aktywność HomeActivity lub DashBoard: używa motywu bez paska akcji. Tutaj potrzebujesz szuflady nawigacji, a wszystkie kolejne ekrany będą fragmentami lub fragmentami zagnieżdżonymi, aż do widoku liścia, ze wspólną szufladą. Wszystkie ustawienia, profil użytkownika itp. Będą tutaj jako fragmenty tego działania. Fragmenty tutaj nie zostaną dodane do tylnego stosu i zostaną otwarte z pozycji menu szuflady. W przypadku fragmentów, które wymagają szuflady zamiast szuflady, poniżej znajduje się czwarty rodzaj aktywności.
Aktywność bez szuflady. Ta aktywność ma przycisk Wstecz u góry, a fragmenty w środku będą miały ten sam pasek akcji. Te fragmenty zostaną dodane do stosu, ponieważ pojawi się historia nawigacji.
[Dalsze wskazówki patrz: https://stackoverflow.com/a/51100507/787399 ]
Happy Coding !!
źródło
zaktualizuj ten kod w baseactivity. i nie zapomnij dołączyć drawer_list_header do swojej aktywności xml.
i nie używaj request () w swojej działalności. ale szuflada nadal nie jest widoczna po kliknięciu obrazu .. i przeciągnięcie jej spowoduje wyświetlenie bez elementów listy. Próbowałem dużo, ale bez powodzenia. potrzebuję ćwiczeń do tego ...
źródło
Dzięki odpowiedzi @Kevin van Mierlo możesz także wdrożyć kilka szuflad. Na przykład domyślne menu znajdujące się po lewej stronie (start) i kolejne opcjonalne menu, znajdujące się po prawej stronie, które jest wyświetlane tylko po załadowaniu określonych fragmentów.
Byłem w stanie to zrobić.
źródło
użyj tego do pliku toolbar.xml
użyj tego do nagłówka nawigacji, jeśli chcesz użyć
źródło
Robię to w Kotlinie w ten sposób:
Działania dla szuflady muszą to dziedziczyć
BaseAppCompatActivity
, wywoływaćsuper.onCreate
po ustawieniu zawartości (w rzeczywistości można ją przenieść na jakąś metodę init) i mieć w swoim układzie odpowiednie elementy dla identyfikatorówźródło
Moja odpowiedź jest tylko konceptualna bez żadnego kodu źródłowego. To może być przydatne dla niektórych czytelników, takich jak ja, aby zrozumieć.
Zależy to od Twojego początkowego podejścia do architektury aplikacji. Istnieją w zasadzie dwa podejścia.
Tworzysz jedno działanie (działanie podstawowe), a wszystkie pozostałe widoki i ekrany będą fragmentami. Ta podstawowa aktywność zawiera implementację układów szuflady i koordynatora. Jest to właściwie mój preferowany sposób, ponieważ posiadanie małych samodzielnych fragmentów ułatwi i przyspieszy tworzenie aplikacji.
Jeśli tworzenie aplikacji rozpoczęło się od działań, po jednym dla każdego ekranu, prawdopodobnie utworzysz działanie podstawowe, a wszystkie inne działania będą się na nim opierać. Działanie podstawowe będzie zawierało kod do wdrożenia szuflady i koordynatora. Każde działanie wymagające implementacji szuflady może wykraczać poza działanie podstawowe.
Osobiście wolałbym unikać używania fragmentów i działań mieszanych bez organizowania się. To utrudnia rozwój i w końcu utkniesz. Jeśli to zrobiłeś, popraw kod ponownie.
źródło
Utwórz szufladę nawigacji w MainActivity za pomocą fragmentu.
Zainicjuj Szufladę nawigacji w MainActivity
teraz we wszystkich innych działaniach, których chcesz używać z tą samą Szufladą nawigacji, ustaw DrawerLayout jako podstawę, a fragment jako szufladę nawigacji. Wystarczy ustawić android: nazwa we fragmencie, wskazując na fragment pliku Java. Nie będziesz musiał inicjować fragmentu w innych działaniach.
Możesz uzyskać dostęp do Nav Drawer, przesuwając palcem w innych czynnościach, np. W aplikacji Sklep Google Play
źródło