Android: NavigationDrawer / несколько действий / одно и то же меню

То, что я пытаюсь сделать, имеет меню NavigationDrawer следующим образом: NavigationDrawer

Я выяснил, как менять макеты при нажатии пунктов меню, но как я могу загрузить новое действие без потери меню?

Мой главный вопрос:

Например, допустим, один из моих опций меню приведет вас к макету, где есть некоторые кнопки, которые что-то делают. Мне нужно загрузить сопроводительную активность / класс, который будет обрабатывать действия и функциональные возможности этой конкретной «страницы» в приложении. Если другой параметр меню приведет вас к макету с изображением, например, это будет другое действие без всего этого кода, который обрабатывает функциональность кнопок, поскольку на этом экране нет кнопок.

Надеюсь это имеет смысл! Я следил за многими учебниками / видеороликами в Интернете, используя несколько методов (фрагменты и т. Д.), Но ничего не ответил на мой вопрос.

Solutions Collecting From Web of "Android: NavigationDrawer / несколько действий / одно и то же меню"

Насколько я понимаю, вы хотите, чтобы ящик навигации присутствовал в каждом действии. Существует два метода:

  1. Используйте ответ @ Рассела. Сделайте основное действие, имеющее framelayout, обычно называемое content_frame, которое охватывает всю деятельность. Эта операция имеет код для навигационного ящика. При нажатии кнопки вы можете заменить содержимое этого макета на макет нужного фрагмента (т. Е. Фрагмент с несколькими кнопками или сказать изображение). Таким образом, элементы в ящике – это все фрагменты. В учебниках фрагменты вызываются через getFragmentManager (). Посмотрите серию видеороликов на навигационном ящике этими парнями, slidenerd: https://www.youtube.com/watch?v=K8hSIP2ha-g . Попробуйте реализовать его, когда вы идете по видео

  2. Я лично предпочитаю этот метод, но он имеет свои ограничения. Создайте базовую активность, в которой находится код для навигационного ящика. Это имеет framelayout, обычно называемый content_frame, который охватывает всю деятельность. Действия, требующие наличия ящика, расширяют эту базовую активность вместо приложения или активности. Инфляция компоновки работает следующим образом: getLayoutInflater().inflate(R.layout.activity_this, contentFrameLayout); Вместо setContentView . Здесь действия начинаются через startActivity . Недостатки этого метода: а) BaseActivity уничтожается и воссоздается каждый раз, когда пользователь меняет активность. B) Активность может распространяться только на один класс, который по умолчанию становится baseActivity Pros: a) Вы можете поддерживать стек деятельности. B) Каждое действие может иметь свои собственные правила изменения конфигурации и правила onsaveInstance. C) Эти действия могут иметь отдельные фрагменты, которые используют эту деятельность для общения. Попытка сделать это в первом методе будет включать в себя основную деятельность, реализующую огромное количество интерфейсов без необходимости (вы узнаете об интерфейсах в общении с фрагментами)

Благодаря вышеприведенным ответам я смог сделать именно то, что хотел, вот что я сделал для тех, кто ищет это в будущем:

My activity_main.xml выглядит следующим образом:

 <!--When the DrawerLayout is the root layout, the first child--> <!--of that layout is the contents of the main screen, and the--> <!--second child is the contents of the menu--> <!--First child layout--> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/toolbar_layout" android:layout_width="match_parent" android:layout_height="wrap_content" /> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/content_frame"/> </LinearLayout> <!--Second child layout--> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="start" app:headerLayout="@layout/navigation_drawer_header" app:menu="@menu/drawer_menu"> </android.support.design.widget.NavigationView> 

Это стандартный DrawerLayout, который объединяет все биты и куски для меню NavigationDrawer. Важным дополнением к этому является бит FrameLayout …, которому я дал ID content_frame. В этом случае все другие макеты, используемые другими видами деятельности, будут задвинуты / добавлены / завышены.

Моя BaseActivity.java выглядит так:

 package com.example.test; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.NavigationView; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; public class BaseActivity extends AppCompatActivity { DrawerLayout drawerLayout; ActionBarDrawerToggle actionBarDrawerToggle; Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view); toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_closed); drawerLayout.setDrawerListener(actionBarDrawerToggle); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_home: Intent anIntent = new Intent(getApplicationContext(), TheClassYouWantToLoad.class); startActivity(loadPlayer); drawerLayout.closeDrawers(); break; } return false; } }); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); actionBarDrawerToggle.syncState(); } } 

Теперь в методе onNavigationItemSelected существует оператор switch, который обрабатывает то, что происходит, когда выбран каждый пункт меню. Это важный бит:

 Intent anIntent = new Intent(getApplicationContext(), TheClassYouWantToLoad.class); startActivity(anIntent); drawerLayout.closeDrawers(); 

Вам нужно заменить «TheClassYouWantToLoad» на свой собственный класс. Теперь в этом новом классе (который предположительно требует, чтобы некоторые новые элементы пользовательского интерфейса загружались), вам необходимо следующее:

 public class TheClassYouWantToLoad extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FrameLayout contentFrameLayout = (FrameLayout) findViewById(R.id.content_frame); //Remember this is the FrameLayout area within your activity_main.xml getLayoutInflater().inflate(R.layout.the_layout_you_want_to_load, contentFrameLayout); } } 

И замените «the_layout_you_want_to_load» на имя макета, который вы хотите загрузить.

Если вы начнете новую деятельность, вы потеряете свое меню, потому что новая активность будет охватывать старую активность. Для этого вам нужно использовать фрагменты. Подумайте о фрагментах как о деятельности, которая может жить в рамках другой деятельности.

Используйте фрагменты, но добавьте элементы пользовательского интерфейса в макет действия вне FrameLayout (id: content_frame), а затем, щелкнув элемент меню, транзакция фрагмента повлияет только на content_frame FrameLayout, оставив все остальные элементы макета.

Повесьте туда, приятель, это только становится яснее отсюда … пока вы не попадете в следующую стену: D

Я предлагаю этот учебник: https://www.udacity.com/course/viewer#!/c-ud853/l-1395568821

И этот материал: http://developer.android.com/training/implementing-navigation/nav-drawer.html