Topic: Шаблон Navigation Drawer Activity

Обсуждаем статью Шаблон Navigation Drawer Activity

Re: Шаблон Navigation Drawer Activity

Здравствуйте!
Хотел добавить в навигационное меню две разные группы со свойством checkableBehavior="single"
Т.е. 2 группы с переключателями (2 независимые настройки)

Я сделал следующее:

activity_main_drawer.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="Группа_А"
        android:id="@+id/GroupA">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/ForTodayMenu"
                    android:checked="true"
                    android:title="@string/ForTodayMenu" />
                <item
                    android:id="@+id/ForTomorrowMenu"
                    android:title="@string/ForTomorrowMenu" />
            </group>
        </menu>
    </item>

    <item android:title="Группа_Б"
        android:id="@+id/GroupB">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/GroupB1"
                    android:checked="true"
                    android:title="@string/B1Menu" />
                <item
                    android:id="@+id/GroupB2"
                    android:title="@string/B2Menu" />
            </group>
        </menu>
    </item>
</menu>

Обработка выбора пунктов меню (устанавливаю флаги для каждого из пунктов меню):

public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.ForTodayMenu) {
            IsForToday = true;
        } else if (id == R.id.ForTomorrowMenu) {
            IsForToday = false;
        } else if (id == R.id.GroupB1) {
            AsrMethod = 1;
        } else if (id == R.id.GroupB2) {
            AsrMethod = 0;
        }
        checkMenu();
        ...
 }

Метод checkMenu() и не только:

Menu LeftMenu;
protected void onCreate(Bundle savedInstanceState) {
...
LeftMenu = navigationView.getMenu();
...
}

public void checkMenu() {
        MenuItem menuItem = LeftMenu.findItem(R.id.ForTodayMenu);
        menuItem.setChecked(IsForToday);

        menuItem = LeftMenu.findItem(R.id.ForTomorrowMenu);
        menuItem.setChecked(!IsForToday);

        menuItem = LeftMenu.findItem(R.id.GroupB1);
        menuItem.setChecked(AsrMethod == 1);
        menuItem = LeftMenu.findItem(R.id.GroupB2);
        menuItem.setChecked(AsrMethod == 0);
    }

Но если запустить программу и попробовать выбирать пункты меню, то бывают случаи когда из четырех пунктов выбран только один (checked=true), хотя в любой момент времени должны быть выделены 2 пункта меню (по одному в каждой из групп)
Что я сделал не так? Подскажите, пожалуйста
P.S.: ваши уроки мне здорово помогают, спасибо вам огромное за ваш труд!

Re: Шаблон Navigation Drawer Activity

Я не исследовал этот момент. Может это так задумано у них.

4 (edited by mcGurov 2016-01-12 18:34:27)

Re: Шаблон Navigation Drawer Activity

LobsteRrrrr wrote:

Счастья, здоровья.... Вам и Вашим котам.
Такой вопрос: можно ли переделать это меню под себя? Чтобы, например, вместо включения камеры - переход на другую страницу проекта

Наверное актуальный вопрос, неплохо бы отразить в мануале...
http://stackoverflow.com/questions/3294 … ion-drawer

Re: Шаблон Navigation Drawer Activity

а как можно программно менять высоту app:headerLayout? иногда он занимает аж половину экрана почему-то

Re: Шаблон Navigation Drawer Activity

alexander.klimoff wrote:

Честно говоря, удивлен, что возникают с этим трудности. Я попробовал и у меня получилось. Лень повторять урок, так как мне это сейчас не нужно.

Добрый день. Можно ли указать начальное положение Navigation View так, чтобы в закрытом состоянии было видно 20% "шторки", как это сделано в SlidingLayoutPanel? Как я понимаю, стандартного метода нет, поэтому нужно наследоваться от класса Navigation View и переопределять метод, отвечающий за начальное расположение и менять его. Собвственно сам вопрос, могли бы вы подсказать, какой метод/переменная отвечает за начальное расположение. Заранее благодарю!

Re: Шаблон Navigation Drawer Activity

Добрый день.

На сайте Александра Климова подробно показано, как создать создать боковую навигационную панель используя NavigationView.

Также есть статья, посвященная вкладкам TabHost и TabWidget (http://developer.alexanderklimov.ru/and … widget.php).

Пожалуйста, подскажите, можно ли вкладки разместить на боковой навигационной панели?

Хотелось бы размещать там, конечно, не меню, которое идет в шаблоне, а например, результаты поиска, перечень ссылок из базы данных, да и много другого, к чему удобно дать пользователю быстрый доступ через боковую выдвижную панель.

Если у кого нибудь получилось "не стандартно" использовать боковую выдвижную панель, включив в нее вкладки, пожалуйста, поделитесь.

Re: Шаблон Navigation Drawer Activity

Добрый день. Отличная статья! Понравилась реализация "превращения значка гамбургера в стрелку в явном виде". На 4 м андроиде работает прекрасно, а на 6 м и 7 м шапка съезжает вверх PunBB bbcode test

Re: Шаблон Navigation Drawer Activity

Возможно требуется указать какие-то стили. Я не знаю решения, не нужно было.

Re: Шаблон Navigation Drawer Activity

Подскажите пожалуйста, как сделать, чтобы Фрагмент 1 Вашего примера отображался в контейнере, при запуске приложения, спасибо.

Re: Шаблон Navigation Drawer Activity

Здравствуйте, после переписывания (несколько раз smile примера из задания, возникает ошибка в  коде
В строке
fragmentManager.beginTransaction().replace(R.id.container,fragment).commit();


Мол второй аргумент неправильный, начал искать ответ на stackoverflow и вот что выяснил


Menu_Fragment is not inheriting from android.support.v4.app.Fragment. Presumably, it is inheriting from android.app.Fragment.

There are two fragment implementations: the native one (e.g., android.app.Fragment) and the backport (e.g., android.support.v4.app.Fragment). You need to be consistent. Your activity is a FragmentActivity, which is part of the backport, so you need your fragments to inherit from android.support.v4.app.Fragment.


Но ошибку самостоятельно исправить так и не смог. Пробовал импортировать import android.support.v4.app.Fragment;
этот класс, но ошибка всеравно осталась, подскажите, что делать?

Re: Шаблон Navigation Drawer Activity

Добрый день! Кто-нибудь может подсказать, на 6 и 7 андроиде если делать стрелку видимой, вместо гамбургера, при открытии панели, шапка съезжает вверх. Какие стили нужно использовать, что-то у меня не получается всё по местам расставить. Спасибо.

Re: Шаблон Navigation Drawer Activity

Поддерживаю вопрос пред идущий. Подскажите как исправить "съезд шапки" в версиях начиная с 5-ой?

Re: Шаблон Navigation Drawer Activity

xwhiskasx wrote:

Здравствуйте, после переписывания (несколько раз smile примера из задания, возникает ошибка в  коде
В строке
fragmentManager.beginTransaction().replace(R.id.container,fragment).commit();


Мол второй аргумент неправильный, начал искать ответ на stackoverflow и вот что выяснил


Menu_Fragment is not inheriting from android.support.v4.app.Fragment. Presumably, it is inheriting from android.app.Fragment.

There are two fragment implementations: the native one (e.g., android.app.Fragment) and the backport (e.g., android.support.v4.app.Fragment). You need to be consistent. Your activity is a FragmentActivity, which is part of the backport, so you need your fragments to inherit from android.support.v4.app.Fragment.


Но ошибку самостоятельно исправить так и не смог. Пробовал импортировать import android.support.v4.app.Fragment;
этот класс, но ошибка всеравно осталась, подскажите, что делать?

Была такая же проблема, вроде решилась заменой  "import android.app.Fragment;" на "import android.support.v4.app.Fragment;"

Re: Шаблон Navigation Drawer Activity

Доброго времени суток. Подскажите, в чем может быть проблема? При запуске приложения выдает ошибку java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.serdechenko.etouchtest/com.example.serdechenko.etouchtest.MainActivity}: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class android.support.design.widget.NavigationView
at
Что это за нулевая строка кода?
MainActivity:

package com.example.serdechenko.etouchtest;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
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.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);



        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();
        drawer.openDrawer(GravityCompat.START);
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }


    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }



    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_downolad) {

        } else if (id == R.id.nav_manage){
            Intent intent = new Intent(MainActivity.this, ManagerActivity.class);
            startActivity(intent);
    }
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }


}

В коде ничего не менял, только удалил ненужные элементы ( меню в правом верхнем углу и FloatingActionButton)

Re: Шаблон Navigation Drawer Activity

Вам пишут про ошибку в XML, а вы приводите код Java.

17 (edited by megapixxxell 2018-03-25 14:09:38)

Re: Шаблон Navigation Drawer Activity

При тесте на реальном и виртуальном устройстве, падает при выборе каких-то пунктов, кроме тех на которые назначены фрагменты,а  во вкладке RUN снизу где logcat и тд много красного текста
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.megap.navigatiodrawer, PID: 15116
                  java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
                      at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:394)
                      at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:441)
                      at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:432)
                      at com.example.megap.navigatiodrawer.MainActivity.onNavigationItemSelected(MainActivity.java:114)
                      at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:154)
                      at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
                      at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171)
                      at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973)
                      at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:342)
                      at android.view.View.performClick(View.java:5647)
                      at android.view.View$PerformClick.run(View.java:22462)
                      at android.os.Handler.handleCallback(Handler.java:754)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:163)
                      at android.app.ActivityThread.main(ActivityThread.java:6205)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
Application terminated.

Re: Шаблон Navigation Drawer Activity

Мне нравится ваша формулировка - "падает при выборе каких-то пунктов". Я отвечу в таком же духе - "надо переписать какие-то строчки кода и будет вам счастье"

Re: Шаблон Navigation Drawer Activity

"падает при выборе каких-то пунктов, кроме тех на которые назначены фрагменты" вроде специально уточнил каких. Прошу прощения, если непонятно написал. Я имел в виду все пункты в меню NavigationDrawer, кроме тех, на которые по уроку мы назначили фрагменты (первые два пункта).  Если в коде MainActivity в обработчике нажатия на пункты, аналогично на каждый пункт в условиях добавить те же фрагменты, что и на первые 2 пункта, то все работает, а когда там пусто вылетает.

Re: Шаблон Navigation Drawer Activity

Пробуйте рассуждать логически. Если работает с фрагментами из примера, значит там код правильный. А когда вы что-то делаете самостоятельно, то допускаете ошибку. Ищите свою ошибку.

Re: Шаблон Navigation Drawer Activity

Шаблон в последней версии студии практически полностью переделан. Все обсуждения можно считать устаревшими. Статья пока изъята из обращения