Один и тот же навигационный ящик в разных действиях
Я создал рабочий блок навигации, как показано в руководстве на сайте http://developer.android.com/. Но теперь я хочу использовать один Навигационный ящик, который я создал в Navigation Drawer.class для нескольких действий в моем приложении.
Мой вопрос заключается в том, может ли кто-нибудь здесь создать небольшой учебник, в котором объясняется, как использовать один ящик навигации для нескольких действий.
Сначала я прочитал его в этом ящике для ответов Android на несколько действий
но это не сработало в моем проекте
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);
}
}
В этом действии я хочу иметь Навигационный ящик, поэтому я расширяю 'Navigation Drawer', а в некоторых других видах деятельности я хочу использовать тот же ящик навигации
public class SampleActivity extends NavigationDrawer {...}
Я не знаю, что изменить...
13 ответов
Если вы хотите навигационный ящик, вы должны использовать фрагменты. Я следовал этому уроку на прошлой неделе, и он прекрасно работает:
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Вы также можете загрузить образец кода из этого руководства, чтобы увидеть, как это можно сделать.
Без фрагментов:
Это ваш код BaseActivity:
public class BaseActivity extends Activity
{
public DrawerLayout drawerLayout;
public ListView drawerList;
public String[] layers;
private ActionBarDrawerToggle drawerToggle;
private Map map;
protected void onCreate(Bundle savedInstanceState)
{
// R.id.drawer_layout should be in every activity with exactly the same id.
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);
}
}
Все остальные действия, для которых требуется навигационный ящик, должны расширять это действие вместо самого действия, например:
public class AnyActivity extends BaseActivity
{
//Because this activity extends BaseActivity it automatically has the navigation drawer
//You can just write your normal Activity code and you don't need to add anything for the navigation drawer
}
XML
<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" >
<!-- Put what you want as your normal screen in here, you can also choose for a linear layout or any other layout, whatever you prefer -->
</FrameLayout>
<!-- 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>
Редактировать:
Я сам испытывал некоторые трудности, поэтому вот решение, если вы получаете NullPointerExceptions. В BaseActivity измените функцию onCreate на protected void onCreateDrawer()
, Остальные могут остаться прежними. В Действиях, которые расширяют BaseActivity, поместите код в следующем порядке:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
super.onCreateDrawer();
Это помогло мне решить мою проблему, надеюсь, это поможет!
Вот как вы можете создать навигационный ящик с несколькими действиями, если у вас есть какие-либо вопросы, не стесняйтесь задавать.
Изменить 2:
Как сказал @GregDan ваш BaseActivity
также можно переопределить setContentView()
и вызвать onCreateDrawer там:
@Override
public void setContentView(@LayoutRes int layoutResID)
{
super.setContentView(layoutResID);
onCreateDrawer() ;
}
Я нашел лучшую реализацию. Это в приложении Google I/O 2014.
Они используют тот же подход, что и Кевин. Если вы можете абстрагироваться от всего ненужного в приложении ввода-вывода, вы можете извлечь все, что вам нужно, и Google гарантирует, что это правильное использование шаблона навигации. Каждое действие может иметь DrawerLayout
в качестве основного макета. Интересная часть - как осуществляется переход на другие экраны. Это реализовано в BaseActivity
как это:
private void goToNavDrawerItem(int item) {
Intent intent;
switch (item) {
case NAVDRAWER_ITEM_MY_SCHEDULE:
intent = new Intent(this, MyScheduleActivity.class);
startActivity(intent);
finish();
break;
Это отличается от обычного способа замены текущего фрагмента транзакцией фрагмента. Но пользователь не видит визуальной разницы.
Самый простой способ повторно использовать общий блок навигации в группе действий
app_base_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<FrameLayout
android:id="@+id/view_stub"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/menu_test"
/>
</android.support.v4.widget.DrawerLayout>
AppBaseActivity.java
/*
* This is a simple and easy approach to reuse the same
* navigation drawer on your other activities. Just create
* a base layout that conains a DrawerLayout, the
* navigation drawer and a FrameLayout to hold your
* content view. All you have to do is to extend your
* activities from this class to set that navigation
* drawer. Happy hacking :)
* P.S: You don't need to declare this Activity in the
* AndroidManifest.xml. This is just a base class.
*/
import android.content.Intent;
import android.content.res.Configuration;
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.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
public abstract class AppBaseActivity extends AppCompatActivity implements MenuItem.OnMenuItemClickListener {
private FrameLayout view_stub; //This is the framelayout to keep your content view
private NavigationView navigation_view; // The new navigation view from Android Design Library. Can inflate menu resources. Easy
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private Menu drawerMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.app_base_layout);// The base layout that contains your navigation drawer.
view_stub = (FrameLayout) findViewById(R.id.view_stub);
navigation_view = (NavigationView) findViewById(R.id.navigation_view);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 0, 0);
mDrawerLayout.setDrawerListener(mDrawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawerMenu = navigation_view.getMenu();
for(int i = 0; i < drawerMenu.size(); i++) {
drawerMenu.getItem(i).setOnMenuItemClickListener(this);
}
// and so on...
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
/* Override all setContentView methods to put the content view to the FrameLayout view_stub
* so that, we can make other activity implementations looks like normal activity subclasses.
*/
@Override
public void setContentView(int layoutResID) {
if (view_stub != null) {
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
View stubView = inflater.inflate(layoutResID, view_stub, false);
view_stub.addView(stubView, lp);
}
}
@Override
public void setContentView(View view) {
if (view_stub != null) {
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
view_stub.addView(view, lp);
}
}
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
if (view_stub != null) {
view_stub.addView(view, params);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Pass the event to ActionBarDrawerToggle, if it returns
// true, then it has handled the app icon touch event
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle your other action bar items...
return super.onOptionsItemSelected(item);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:
// handle it
break;
case R.id.item2:
// do whatever
break;
// and so on...
}
return false;
}
}
Так что этот ответ опоздал на несколько лет, но кто-то может оценить его. Android предоставил нам новый виджет, который облегчает использование одного навигационного ящика с несколькими действиями.
android.support.design.widget.NavigationView является модульным и имеет собственный макет в папке меню. То, как вы его используете, заключается в следующем:
Корневой макет - это android.support.v4.widget.DrawerLayout, который содержит двух дочерних элементов:
<include ... />
для макета, который оборачивается (см. 2) и android.support.design.widget.NavigationView.<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:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer" />
nav_header_main - это просто LinearLayout с ориентацией = вертикали для заголовка вашего Навигационного Рисунка.
Activity_main_drawer - это xml меню в вашем каталоге res / menu. Он может содержать элементы и группы по вашему выбору. Если вы используете AndroidStudio Gallery, мастер сделает для вас базовую галерею, и вы сможете увидеть, какие у вас есть варианты.
Макет панели приложения обычно теперь представляет собой android.support.design.widget.CoordinatorLayout, и он будет включать двух дочерних элементов: android.support.design.widget.AppBarLayout (который содержит android.support.v7.widget.Toolbar) и
<include ... >
для вашего фактического содержания (см. 3).<android.support.design.widget.CoordinatorLayout 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:layout_width="match_parent" android:layout_height="match_parent" tools:context="yourpackage.MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_main" />
Макет контента может быть любым макетом, который вы хотите. Это макет, который содержит основное содержание действия (не включая панель навигации или панель приложения).
Теперь, во всем этом круто то, что вы можете обернуть каждое действие в эти два макета, но ваш NavigationView (см. Шаг 1) всегда указывает на activity_main_drawer (или что-то еще). Это означает, что у вас будет один и тот же (*) Навигационный ящик для всех видов деятельности.
- Это не будет тот же экземпляр NavigationView, но, честно говоря, это было невозможно даже с решением BaseActivity, описанным выше.
Для тех, кто хочет сделать то, о чем просит оригинальный постер, рассмотрите возможность использования фрагментов вместо того, как сказал Кевин. Вот отличное руководство о том, как это сделать:
https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer
Если вы решите вместо этого использовать действия вместо фрагментов, вы столкнетесь с проблемой повторного создания навигационного ящика при каждом переходе к новому действию. Это приводит к уродливой / медленной визуализации навигационного ящика каждый раз.
Есть обходной путь: В моей реализации: у меня есть фрагменты в первом упражнении, в котором есть Навигационный ящик. Другие действия создают ActionBar и Navigation Drawer из того же кода, что и первое действие, и у них нет фрагментов, схема описана ниже. В первом действии щелчок действия элемента обрабатывается в том же действии, а в других действиях действие завершается позже, сначала я переключаюсь на первое действие, закрывая другие действия. Условия следующие:
Я поместил основной макет и в первую структуру кадра, а вторая структура кадра предназначена для Drawer в DrawerLayout.
Я выполнил инициализацию выдвижного ящика в onResume действий, отличных от первого. Это связано с тем, что необходимо выполнить повторную инициализацию после обновления новых намерений, поскольку все действия являются единичными.
Таким образом я смог использовать NavigationDrawer и ActionBarCompat во всех действиях.
Другой путь может быть таким: вообще не использовать действия, вместо этого использовать фрагменты и заменять их в контейнере (например, в Linear Layout), где вы показываете свой первый фрагмент.
Код доступен в Руководствах для разработчиков Android, вам просто нужно настроить.
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Желательно, чтобы вы использовали все больше и больше фрагментов в вашем приложении, и в вашем приложении должно быть только три локальных действия, которые вы упомянули в вашем AndroidManifest.xml, кроме внешних (например, FacebookActivity):
SplashActivity: не использует фрагмент и использует тему FullScreen.
LoginSignUpActivity: вообще не требует NavigationDrawer, поэтому просто используйте обычную панель инструментов, но, как минимум, потребуется 3 или 4 фрагмента. Используется тема noactionbar
HomeActivity или DashBoardActivity: используется тема noactionbar. Здесь вам необходим блок навигации, также все последующие экраны будут фрагментами или вложенными фрагментами, вплоть до представления листа. Все настройки, профиль пользователя и т. Д. Будут представлены здесь как фрагменты в этом упражнении.
[Для получения дальнейших указаний см.: /questions/21973257/kak-programmno-ustanovit-shrift-dlya-shrifta-spinner/21973261#21973261 ]
Удачного кодирования!
Обновить этот код в базовой активности. и не забудьте включить в список действий xml.
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.drawer_list_header);
и не используйте request() в своей деятельности. но все еще ящик не виден при нажатии на изображение.. и при перетаскивании он будет виден без элементов списка. Я много пробовал, но безуспешно. нужны тренировки для этого...
С ответом @Kevin van Mierlo вы также можете реализовать несколько ящиков. Например, меню по умолчанию, расположенное слева (начало), и дополнительное меню, расположенное справа, которое отображается только при загрузке определенных фрагментов.
Я был в состоянии сделать это.
Я делаю это в Котлине так:
open class BaseAppCompatActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
protected lateinit var drawerLayout: DrawerLayout
protected lateinit var navigationView: NavigationView
@Inject
lateinit var loginService: LoginService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("BaseAppCompatActivity", "onCreate()")
App.getComponent().inject(this)
drawerLayout = findViewById(R.id.drawer_layout) as DrawerLayout
val toolbar = findViewById(R.id.toolbar) as Toolbar
setSupportActionBar(toolbar)
navigationView = findViewById(R.id.nav_view) as NavigationView
navigationView.setNavigationItemSelectedListener(this)
val toggle = ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
drawerLayout.addDrawerListener(toggle)
toggle.syncState()
toggle.isDrawerIndicatorEnabled = true
val navigationViewHeaderView = navigationView.getHeaderView(0)
navigationViewHeaderView.login_txt.text = SharedKey.username
}
private inline fun <reified T: Activity> launch():Boolean{
if(this is T) return closeDrawer()
val intent = Intent(applicationContext, T::class.java)
startActivity(intent)
finish()
return true
}
private fun closeDrawer(): Boolean {
drawerLayout.closeDrawer(GravityCompat.START)
return true
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
val id = item.itemId
when (id) {
R.id.action_tasks -> {
return launch<TasksActivity>()
}
R.id.action_contacts -> {
return launch<ContactActivity>()
}
R.id.action_logout -> {
createExitDialog(loginService, this)
}
}
return false
}
}
Действия для ящика должны наследовать это BaseAppCompatActivity
, вызов super.onCreate
после того, как контент установлен (на самом деле, может быть перемещен в некоторый метод init) и имеет соответствующие элементы для идентификаторов в их макете
Мой ответ - только концептуальный без исходного кода. Это может быть полезно для некоторых читателей, как я, чтобы понять.
Это зависит от вашего первоначального подхода к архитектуре вашего приложения. Есть в основном два подхода.
Вы создаете одно действие (базовое действие), а все остальные виды и экраны будут фрагментами. Это базовое действие содержит реализацию макетов "Ящик" и "Координатор". На самом деле это мой предпочтительный способ сделать, потому что наличие небольших автономных фрагментов сделает разработку приложений более легкой и гладкой.
Если вы начали разработку приложения с действий, по одному для каждого экрана, то вы, вероятно, создадите базовое действие, а все остальные действия будут исходить из него. Базовое действие будет содержать код для реализации в комитете и координаторе. Любое действие, которое требует реализации, может выходить за пределы основного действия.
Я лично предпочел бы избегать использования фрагментов и действий, смешанных без какой-либо организации. Это усложняет разработку и в конечном итоге застревает. Если вы сделали это, рефакторинг вашего кода.
package xxxxxx;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.widget.SearchView;
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.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
public class loginhome extends AppCompatActivity {
private Toolbar toolbar;
private NavigationView navigationView;
private DrawerLayout drawerLayout;
// Make sure to be using android.support.v7.app.ActionBarDrawerToggle version.
// The android.support.v4.app.ActionBarDrawerToggle has been deprecated.
private ActionBarDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loginhome);
// Initializing Toolbar and setting it as the actionbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//Initializing NavigationView
navigationView = (NavigationView) findViewById(R.id.nav_view);
//Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
// This method will trigger on item Click of navigation menu
public boolean onNavigationItemSelected(MenuItem menuItem) {
//Checking if the item is in checked state or not, if not make it in checked state
if(menuItem.isChecked()) menuItem.setChecked(false);
else menuItem.setChecked(true);
//Closing drawer on item click
drawerLayout.closeDrawers();
//Check to see which item was being clicked and perform appropriate action
switch (menuItem.getItemId()){
//Replacing the main content with ContentFragment Which is our Inbox View;
case R.id.nav_first_fragment:
Toast.makeText(getApplicationContext(),"First fragment",Toast.LENGTH_SHORT).show();
FirstFragment fragment = new FirstFragment();
android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame,fragment);
fragmentTransaction.commit();
return true;
// For rest of the options we just show a toast on click
case R.id.nav_second_fragment:
Toast.makeText(getApplicationContext(),"Second fragment",Toast.LENGTH_SHORT).show();
SecondFragment fragment2 = new SecondFragment();
android.support.v4.app.FragmentTransaction fragmentTransaction2 = getSupportFragmentManager().beginTransaction();
fragmentTransaction2.replace(R.id.frame,fragment2);
fragmentTransaction2.commit();
return true;
default:
Toast.makeText(getApplicationContext(),"Somethings Wrong",Toast.LENGTH_SHORT).show();
return true;
}
}
});
// Initializing Drawer Layout and ActionBarToggle
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close){
@Override
public void onDrawerClosed(View drawerView) {
// Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank
super.onDrawerClosed(drawerView);
}
@Override
public void onDrawerOpened(View drawerView) {
// Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank
super.onDrawerOpened(drawerView);
}
};
//Setting the actionbarToggle to drawer layout
drawerLayout.setDrawerListener(actionBarDrawerToggle);
//calling sync state is necessay or else your hamburger icon wont show up
actionBarDrawerToggle.syncState();
}
используйте это для вашего toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:elevation="4dp"
android:id="@+id/toolbar"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
>
</android.support.v7.widget.Toolbar>
используйте это для заголовка навигации, если хотите использовать
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="192dp"
android:background="?attr/colorPrimaryDark"
android:padding="16dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:orientation="vertical"
android:gravity="bottom">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="56dp"
android:id="@+id/navhead"
android:orientation="vertical"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:textColor="#ffffff"
android:text="tanya"
android:textSize="14sp"
android:textStyle="bold"
/>
<TextView
android:id="@+id/email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:layout_marginLeft="16dp"
android:layout_marginTop="5dp"
android:text="tanya.com"
android:textSize="14sp"
android:textStyle="normal"
/>
</LinearLayout>
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_below="@+id/imageView"
android:layout_marginTop="15dp"
android:src="@drawable/face"
android:id="@+id/circleView"
/>
</RelativeLayout>
Это подробно описано в следующем видеоуроке.
Панель навигации по нескольким действиям с использованием базового действия
Очень легко сделать базовое действие ящика навигации и расширить это действие базового ящика навигации на все те действия, для которых вы хотите отобразить ящик навигации,
- Сделать меню навигации, заголовок
- создать базовое действие для панели навигации
- создать макет контента
- Комбинированное меню, заголовок, макет контента по базовой активности
- Используя макет фрейма, вставьте каждое действие в меню ящика.
Все шаги четко объяснены в видео.
Создайте навигационный ящик в вашей MainActivity, используя фрагмент.
Инициализируйте навигационный ящик в MainActivity.
теперь во всех других действиях вы хотите использовать тот же самый Навигационный ящик, поместив DrawerLayout в качестве основы и фрагмент в качестве ящика навигации. Просто установите android: имя в вашем фрагменте, указывающее на ваш фрагмент Java-файла. Вам не нужно инициализировать фрагмент в других действиях.
Вы можете получить доступ к Nav Drawer, проведя пальцем по другим действиям, как в приложении Google Play Store