Один и тот же навигационный ящик в разных действиях
Я сделал рабочий ящик для навигации, как показано в учебнике на веб-сайте developer.android.com. Но теперь я хочу использовать один навигационный ящик, созданный в NavigationDrawer.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);
}
}
В этой операции я хочу иметь ящик навигации, чтобы я расширил "NavigationDrawer", а в некоторых других видах деятельности я хочу использовать ящик с одним и тем же навигатором
public class SampleActivity extends NavigationDrawer {...}
Я не знаю, что изменить...
Ответы
Ответ 1
Если вы хотите навигационный ящик, вы должны использовать фрагменты. Я следовал этому уроку на прошлой неделе, и он прекрасно работает:
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() ;
}
Ответ 2
Я нашел лучшую реализацию. Он находится в приложении 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;
Это отличается от обычного способа замены текущего фрагмента транзакцией фрагмента. Но пользователь не видит визуальной разницы.
Ответ 3
Итак, этот ответ несколько лет спустя, но кто-то может это оценить. Android дал нам новый виджет, который упрощает использование одного навигационного ящика с несколькими действиями.
android.support.design.widget.NavigationView является модульным и имеет свой собственный макет в папке меню. Способ, которым вы его используете, состоит в том, чтобы обернуть XML-макеты следующим образом:
-
Root Layout - это файл 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, мастер сделает основной для вас, и вы увидите, какие у вас варианты.
-
Макет панели приложений обычно представляет собой 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" />
-
Макет содержимого может быть любым макетом, который вы хотите. Это макет, который содержит основной контент активности (не включая ящик навигации или панель приложений).
Теперь все дело в том, что вы можете обернуть каждое действие в этих двух макетах, но ваше навигационное меню (см. шаг 1) всегда указывает на activity_main_drawer (или что-то еще). Это означает, что у вас будет один и тот же (*) навигационный ящик для всех видов деятельности.
- Они не будут тем же самым экземпляром NavigationView, но, если быть справедливым, это было невозможно даже при решении BaseActivity, описанном выше.
Ответ 4
Для тех, кто хочет сделать то, о чем просит оригинальный постер, рассмотрите возможность использования фрагментов вместо того, как сказал Кевин. Вот отличное руководство о том, как это сделать:
https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer
Если вы решите вместо этого использовать действия вместо фрагментов, вы столкнетесь с проблемой повторного создания навигационного ящика при каждом переходе к новому действию. Это приводит к уродливой/медленной визуализации навигационного ящика каждый раз.
Ответ 5
Есть обходной путь: В моей реализации: у меня есть фрагменты в первом упражнении, в котором есть Навигационный ящик. Другие действия создают 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. Здесь вам необходим блок навигации, также все последующие экраны будут фрагментами или вложенными фрагментами, вплоть до представления листа. Все настройки, профиль пользователя и т.д. Будут представлены здесь как фрагменты в этом упражнении.
[Для получения дальнейших указаний см.: fooobar.com/questions/61418/... ]
Удачного кодирования!
Ответ 6
Самый простой способ повторно использовать общий блок навигации в группе действий
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;
}
}
Ответ 7
обновите этот код в baseactivity. и не забудьте включить drawer_list_header в свою активность xml.
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.drawer_list_header);
и не используйте запрос() в своей деятельности. но все же ящик не отображается при нажатии на изображение.. и путем перетаскивания он будет виден без элементов списка. Я много пробовал, но не добился успеха. нужны некоторые тренировки для этого...
Ответ 8
С ответом @Kevin van Mierlo вы также можете реализовать несколько ящиков. Например, меню по умолчанию, расположенное с левой стороны (начало), и дополнительное необязательное меню, расположенное с правой стороны, которое отображается только при загрузке определенных фрагментов.
Я смог это сделать.
Ответ 9
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();
}
используйте это для своей панели инструментов .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>
Ответ 10
Я делаю это в Котлине так:
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) и иметь соответствующие элементы для идентификаторов в их макете
Ответ 11
Мой ответ - просто концептуальный, без какого-либо исходного кода. Это может быть полезно для некоторых читателей, как я, чтобы понять.
Это зависит от вашего первоначального подхода к архитектуре вашего приложения. Есть в основном два подхода.
-
Вы создаете одно действие (базовое действие), а все остальные виды и экраны будут фрагментами. Эта базовая операция содержит реализацию макетов Drawer и Coordinator. На самом деле это мой предпочтительный способ сделать, потому что наличие небольших автономных фрагментов сделает разработку приложений более легкой и гладкой.
-
Если вы начали разработку приложения с действий, по одному для каждого экрана, то вы, вероятно, создадите базовое действие, а все остальные действия будут исходить из него. Базовое действие будет содержать код для реализации в комитете и координаторе. Любое действие, для которого требуется реализация ящика, может расширяться от базового действия.
Я лично предпочел бы избегать использования фрагментов и действий, смешанных без какой-либо организации. Это усложняет разработку и в конечном итоге застревает. Если вы сделали это, рефакторинг вашего кода.
Ответ 12
Создайте ящик навигации в своем MainActivity, используя фрагмент.
Инициализировать навигационный ящик в MainActivity
теперь во всех других действиях, которые вы хотите использовать в одном и том же навигационном ящике, установите DrawerLayout как базу и фрагмент в качестве навигационного ящика. Просто установите android: имя в вашем фрагменте, указывающее на ваш фрагмент файла Java. Вам не нужно будет инициализировать фрагмент в других действиях.
Вы можете получить доступ к Nav Drawer, прокручивая другие действия, например, в приложении Google Play Store.