Topic: Шаблон Navigation Drawer Activity
Обсуждаем статью Шаблон Navigation Drawer Activity
Все вопросы проплачены кошками - всемирно известными производителями котят
You are not logged in. Please login or register.
Для регистрации на форуме следует написать мне письмо. В ответе я напишу правильный ответ для прохождения регистрации.
Форум Александра Климова → Android → Шаблон Navigation Drawer Activity
Обсуждаем статью Шаблон 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.: ваши уроки мне здорово помогают, спасибо вам огромное за ваш труд!
Я не исследовал этот момент. Может это так задумано у них.
Счастья, здоровья.... Вам и Вашим котам.
Такой вопрос: можно ли переделать это меню под себя? Чтобы, например, вместо включения камеры - переход на другую страницу проекта
Наверное актуальный вопрос, неплохо бы отразить в мануале...
http://stackoverflow.com/questions/3294 … ion-drawer
а как можно программно менять высоту app:headerLayout? иногда он занимает аж половину экрана почему-то
Честно говоря, удивлен, что возникают с этим трудности. Я попробовал и у меня получилось. Лень повторять урок, так как мне это сейчас не нужно.
Добрый день. Можно ли указать начальное положение Navigation View так, чтобы в закрытом состоянии было видно 20% "шторки", как это сделано в SlidingLayoutPanel? Как я понимаю, стандартного метода нет, поэтому нужно наследоваться от класса Navigation View и переопределять метод, отвечающий за начальное расположение и менять его. Собвственно сам вопрос, могли бы вы подсказать, какой метод/переменная отвечает за начальное расположение. Заранее благодарю!
Добрый день.
На сайте Александра Климова подробно показано, как создать создать боковую навигационную панель используя NavigationView.
Также есть статья, посвященная вкладкам TabHost и TabWidget (http://developer.alexanderklimov.ru/and … widget.php).
Пожалуйста, подскажите, можно ли вкладки разместить на боковой навигационной панели?
Хотелось бы размещать там, конечно, не меню, которое идет в шаблоне, а например, результаты поиска, перечень ссылок из базы данных, да и много другого, к чему удобно дать пользователю быстрый доступ через боковую выдвижную панель.
Если у кого нибудь получилось "не стандартно" использовать боковую выдвижную панель, включив в нее вкладки, пожалуйста, поделитесь.
Добрый день. Отличная статья! Понравилась реализация "превращения значка гамбургера в стрелку в явном виде". На 4 м андроиде работает прекрасно, а на 6 м и 7 м шапка съезжает вверх
Возможно требуется указать какие-то стили. Я не знаю решения, не нужно было.
Подскажите пожалуйста, как сделать, чтобы Фрагмент 1 Вашего примера отображался в контейнере, при запуске приложения, спасибо.
Здравствуйте, после переписывания (несколько раз примера из задания, возникает ошибка в коде
В строке
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;
этот класс, но ошибка всеравно осталась, подскажите, что делать?
Добрый день! Кто-нибудь может подсказать, на 6 и 7 андроиде если делать стрелку видимой, вместо гамбургера, при открытии панели, шапка съезжает вверх. Какие стили нужно использовать, что-то у меня не получается всё по местам расставить. Спасибо.
Поддерживаю вопрос пред идущий. Подскажите как исправить "съезд шапки" в версиях начиная с 5-ой?
Здравствуйте, после переписывания (несколько раз примера из задания, возникает ошибка в коде
В строке
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;"
Доброго времени суток. Подскажите, в чем может быть проблема? При запуске приложения выдает ошибку 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)
Вам пишут про ошибку в XML, а вы приводите код Java.
При тесте на реальном и виртуальном устройстве, падает при выборе каких-то пунктов, кроме тех на которые назначены фрагменты,а во вкладке 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.
Мне нравится ваша формулировка - "падает при выборе каких-то пунктов". Я отвечу в таком же духе - "надо переписать какие-то строчки кода и будет вам счастье"
"падает при выборе каких-то пунктов, кроме тех на которые назначены фрагменты" вроде специально уточнил каких. Прошу прощения, если непонятно написал. Я имел в виду все пункты в меню NavigationDrawer, кроме тех, на которые по уроку мы назначили фрагменты (первые два пункта). Если в коде MainActivity в обработчике нажатия на пункты, аналогично на каждый пункт в условиях добавить те же фрагменты, что и на первые 2 пункта, то все работает, а когда там пусто вылетает.
Пробуйте рассуждать логически. Если работает с фрагментами из примера, значит там код правильный. А когда вы что-то делаете самостоятельно, то допускаете ошибку. Ищите свою ошибку.
Шаблон в последней версии студии практически полностью переделан. Все обсуждения можно считать устаревшими. Статья пока изъята из обращения
Форум Александра Климова → Android → Шаблон Navigation Drawer Activity
Powered by PunBB, supported by Informer Technologies, Inc.