it-swarm.com.ru

Навигационный ящик в разных действиях

Я создал рабочий блок навигации, как показано в руководстве на сайте 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 {...}

Я не знаю, что изменить ...

187
MEX

Если вы хотите навигационный ящик, вы должны использовать фрагменты .... Я следовал этому уроку на прошлой неделе, и он прекрасно работает: 

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() ;
}
169
Kevin van Mierlo

Я нашел лучшую реализацию. Это в 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;

Это отличается от обычного способа замены текущего фрагмента транзакцией фрагмента. Но пользователь не видит визуальной разницы.

34
WindRider

Так что этот ответ опоздал на несколько лет, но кто-то может оценить его. Android предоставил нам новый виджет, который облегчает использование одного навигационного ящика с несколькими действиями.

Android.support.design.widget.NavigationView является модульным и имеет собственный макет в папке меню. Способ, которым вы его используете, заключается в следующем:

  1. Корневой макет - это 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, мастер сделает для вас базовую галерею, и вы увидите, какие у вас есть варианты.

  1. Макет панели приложения обычно теперь представляет собой 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" />
    

  2. Макет контента может быть любым макетом, который вы хотите. Это макет, который содержит основное содержание действия (не включая панель навигации или панель приложения).

Теперь во всем этом круто то, что вы можете обернуть каждое действие в эти два макета, но ваш NavigationView (см. Шаг 1) всегда указывает на activity_main_drawer (или что-то еще). Это означает, что у вас будет один и тот же (*) Навигационный ящик для всех видов деятельности.

  • Они не будут одинаковыми instance NavigationView, но, честно говоря, это было невозможно даже с решением BaseActivity, описанным выше.
7
jwehrle

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

https://github.com/codepath/Android_guides/wiki/Fragment-Navigation-Drawer

Если вы решите вместо этого использовать действия вместо фрагментов, вы столкнетесь с проблемой повторного создания навигационного блока каждый раз, когда вы переходите к новому действию. Это приводит к уродливой/медленной визуализации навигационного ящика каждый раз. 

7
Micro

Я предлагаю: не используйте действия вообще, вместо этого используйте фрагменты и замените их в контейнере (например, Linear Layout), где вы показываете свой первый фрагмент.

Код доступен в учебниках по Android для разработчиков, вам просто нужно его настроить.

http://developer.Android.com/training/implementing-navigation/nav-drawer.html

Желательно, чтобы вы использовали все больше и больше фрагментов в вашем приложении, и должно быть только четыре основных действия, локальных для вашего приложения, которые вы упомянули в вашем AndroidManifest.xml, кроме внешних (например, FacebookActivity):

  1. SplashActivity: не использует фрагмент и использует тему FullScreen.

  2. LoginSignUpActivity: вообще не требует NavigationDrawer и никакой кнопки «назад», поэтому просто используйте обычную панель инструментов, но, как минимум, потребуется 3 или 4 фрагмента. Используется тема без действия бара

  3. HomeActivity или DashBoard Activity: используется тема без действия бара. Здесь вам требуется блок навигации, также все последующие экраны будут фрагментами или вложенными фрагментами, вплоть до представления листа, с общим блоком. Все настройки, профиль пользователя и т.д. Будут представлены здесь как фрагменты, в этом упражнении . Фрагменты здесь не будут добавлены в задний стек и будут открываться из пунктов меню ящика. В случае фрагментов, которые требуют кнопку возврата вместо ящика, ниже есть четвертый вид деятельности.

  4. Деятельность без ящика. В этом упражнении кнопка «Назад» сверху и фрагменты внутри будут использовать одну и ту же панель действий. Эти фрагменты будут добавлены в бэк-стек, так как там будет история переходов.

[Для получения дальнейших указаний см .: https://stackoverflow.com/a/51100507/787399 ]

Удачного кодирования!

5
Abhinav Saxena

Самый простой способ повторно использовать общий блок навигации в группе действий

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;
    }
}
3
Levon Petrosyan
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>
1
Volverine

обновить этот код в базовой активности. и не забудьте включить в список действий xml.

super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.drawer_list_header);

и не используйте request () в своей деятельности. но все еще ящик не виден при нажатии на изображение .. и при перетаскивании он будет виден без элементов списка. Я много пробовал, но безуспешно. нужны тренировки для этого ...

1
M S Gadag

Я делаю это в Котлине так:

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) и иметь соответствующие элементы для идентификаторов в их макете

1
Pavlus

С ответом @Kevin van Mierlo вы также можете реализовать несколько ящиков. Например, меню по умолчанию, расположенное слева (начало), и дополнительное меню, расположенное справа, которое отображается только при загрузке определенных фрагментов.

Я был в состоянии сделать это.

1
russellhoff

Мой ответ - просто концептуальный без исходного кода. Это может быть полезно для некоторых читателей, как я, чтобы понять.

Это зависит от вашего первоначального подхода к архитектуре вашего приложения. Есть в основном два подхода. 

  1. Вы создаете одно действие (базовое действие), а все остальные виды и экраны будут фрагментами. Это базовое действие содержит реализацию макетов «Ящик» и «Координатор». На самом деле это мой предпочтительный способ сделать, потому что наличие небольших автономных фрагментов сделает разработку приложений более легкой и гладкой.

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

Я лично предпочел бы избегать использования фрагментов и действий, смешанных без какой-либо организации. Это усложняет разработку и в конечном итоге застревает. Если вы сделали это, рефакторинг вашего кода.

0
Farruh Habibullaev