Ящик для навигации: как установить выбранный элемент при запуске?
Мой код отлично работает: каждый раз, когда нажимается элемент в ящике навигации, элемент выбирается.
Конечно, я хочу запустить приложение с помощью фрагмента по умолчанию (home), но в навигационном ящике нет выбранного элемента. Как я могу выбрать этот элемент программно?
public class BaseApp extends AppCompatActivity {
//Defining Variables
protected String LOGTAG = "LOGDEBUG";
protected Toolbar toolbar;
protected NavigationView navigationView;
protected DrawerLayout drawerLayout;
private DateManager db = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.base_layout);
navigationView = (NavigationView) findViewById(R.id.navigation_view);
// set the home/dashboard at startup
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame, new DashboardFragment());
fragmentTransaction.commit();
setNavDrawer();
}
private void setNavDrawer(){
// Initializing Toolbar and setting it as the actionbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//Initializing NavigationView
//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
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
//Checking if the item is in checked state or not, if not make it in checked state
// I THINK THAT I NEED EDIT HERE...
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
case R.id.home:
DashboardFragment dashboardFragment = new DashboardFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame, dashboardFragment,"DASHBOARD_FRAGMENT");
fragmentTransaction.commit();
return true;
[...]
Я думаю, что мне нужно изменить здесь:
if (menuItem.isChecked()) menuItem.setChecked(false);
else menuItem.setChecked(true);
Или в onCreate
при запуске приложения с помощью FragmentTransaction.
Благодарим вас за поддержку.
Ответы
Ответ 1
Используйте следующий код:
navigationView.getMenu().getItem(0).setChecked(true);
Вызвать этот метод после вызова setNavDrawer();
Метод getItem(int index)
получает MenuItem
, тогда вы можете вызвать setChecked(true);
на этом MenuItem
, все, что вам нужно сделать, это выяснить, какой индекс элемента имеет значение по умолчанию, и заменить 0 на этот индекс.
Вы можете выбрать (выделить) элемент, вызвав
onNavigationItemSelected(navigationView.getMenu().getItem(0));
Вот ссылка: http://thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html
ИЗМЕНИТЬ
Не работает на nexus 4, версия библиотеки поддержки 24.0.0. Я рекомендую использовать
navigationView.setCheckedItem(R.id.nav_item);
ответил @kingston ниже.
Ответ 2
Вы также можете позвонить:
navigationView.setCheckedItem(id);
Этот метод был введен в API 23.0.0
Пример
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="UnusedIds">
<group
android:id="@+id/group"
android:checkableBehavior="single">
<item
android:id="@+id/menu_nav_home"
android:icon="@drawable/ic_home_black_24dp"
android:title="@string/menu_nav_home" />
</group>
</menu>
Примечание: android:checkableBehavior="single"
См. также this
Ответ 3
Для меня оба этих метода не работали:
-
navigationView.getMenu().getItem(0).setChecked(true);
-
navigationView.setCheckedItem(id);
Попробуйте это, он работает для меня.
onNavigationItemSelected(navigationView.getMenu().findItem(R.id.nav_profile));
Ответ 4
Пример (NavigationView.OnNavigationItemSelectedListener):
private void setFirstItemNavigationView() {
navigationView.setCheckedItem(R.id.custom_id);
navigationView.getMenu().performIdentifierAction(R.id.custom_id, 0);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setFirstItemNavigationView();
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
FragmentManager fragmentManager = getFragmentManager();
switch (item.getItemId()) {
case R.id.custom_id:
Fragment frag = new CustomFragment();
// update the main content by replacing fragments
fragmentManager.beginTransaction()
.replace(R.id.viewholder_container, frag)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(null)
.commit();
break;
}
Tks
Ответ 5
Всегда есть проблемы с Googles "oh so great" support libs. Если вы хотите проверить элемент без понижения версии вашей версии поддержки, просто установите флажок перед установкой состояния проверки.
MenuItem item = drawer.getMenu().findItem(R.id.action_something);
item.setCheckable(true);
item.setChecked(true);
Он также может работать, если вы установите checkable в меню xml файлов
Ответ 6
Вы можете выделить и выбрать элемент со следующим 1-лайнером:
navigationView.getMenu().performIdentifierAction(R.id.posts, 0);
Источник: fooobar.com/questions/40258/...
Ответ 7
API 23 предоставляет следующий метод:
navigationView.setCheckedItem(R.id.nav_item_id);
Однако по какой-то причине эта функция не вызывала запуск кода, стоящего за элементом навигации. Метод, безусловно, выделяет элемент в ящике навигации или "проверяет" его, но, похоже, он не вызывает OnNavigationItemSelectedListener
, что приводит к пустым экранам при запуске, если ваш экран запуска зависит от выбора ящика навигации. Можно вручную вызвать слушателя, но он кажется взломанным:
if (savedInstanceState == null) this.onNavigationItemSelected(navigationView.getMenu().getItem(0));
В приведенном выше коде предполагается:
- Вы внедрили
NavigationView.OnNavigationItemSelectedListener
в вашей деятельности
- Вы уже звонили:
navigationView.setNavigationItemSelectedListener(this);
- Элемент, который вы хотите выбрать, находится в позиции 0
Ответ 8
Для этого вам нужно вызвать 2 функции:
Сначала: для исключения команд, которые вы внедрили в onNavigationItemSelected
listener:
onNavigationItemSelected(navigationView.getMenu().getItem(R.id.nav_camera));
Второе: для изменения состояния пункта меню направляющего элемента навигации на выбранный (или отмеченный):
navigationView.setCheckedItem(R.id.nav_camera);
Я назвал обе функции, и это сработало для меня.
Ответ 9
Следующий код будет только выбирать пункт меню:
navigationView.setCheckedItem(id);
Чтобы выбрать и открыть элемент меню, добавьте следующий код после указанной выше строки.
onNavigationItemSelected(navigationView.getMenu().getItem(0));
Ответ 10
Это мое решение, очень простое.
Вот мой файл menu.xml:
<group
android:id="@+id/grp1"
android:checkableBehavior="single">
<item
android:id="@+id/nav_all_deals"
android:checked="true"
android:icon="@drawable/ic_all_deals"
android:title="@string/all_deals" />
<item
android:id="@+id/nav_news_and_events"
android:icon="@drawable/ic_news"
android:title="@string/news_and_events" />
<item
android:id="@+id/nav_histories"
android:icon="@drawable/ic_histories"
android:title="@string/histories" />
</group>
Над меню выделится первый пункт меню. Ниже строка что-то сделает (например: покажите первый фрагмент и т.д.). ПРИМЕЧАНИЕ: напишите после "настройте код ящика"
onNavigationItemSelected(mNavigationView.getMenu().getItem(0));
Ответ 11
Самый простой способ - выбрать его из XML следующим образом:
<menu>
<group android:checkableBehavior="single">
<item
android:checked="true"
android:id="@+id/nav_home"
android:icon="@drawable/nav_home"
android:title="@string/main_screen_title_home" />
Обратите внимание на строку android:checked="true"
Ответ 12
Прежде всего, создайте цвета для выбранного элемента. Здесь fooobar.com/questions/18153/... хороший пример. Это поможет вам изменить цвет значка. Для изменения фона всего выбранного элемента добавьте в свои значения \style.xml файл
<item name="selectableItemBackground">@drawable/selectable_item_background</item>
Если selectable_item_background должно быть объявлено в drawable/selectable_item_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/accent_translucent"
android:state_pressed="true" />
<item android:drawable="@android:color/transparent" />
</selector>
Где цвет может быть объявлен в style.xml
<color name="accent_translucent">#80FFEB3B</color>
И после этого
// The main navigation menu with user-specific actions
mainNavigationMenu_ = (NavigationView) findViewById(R.id.main_drawer);
mainNavigationMenu_.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
mainNavigationMenu_.getMenu().findItem(itemId).setChecked(true);
return true;
}
});
Как вы видите, я использовал это
mainNavigationMenu_.getMenu() FindItem (ItemId).setChecked(истина);.
для установки выбранного элемента.
Здесь navigationView
<android.support.design.widget.NavigationView
android:id="@+id/main_drawer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/header_main_navigation_menu"
app:itemIconTint="@color/state_list"
app:itemTextColor="@color/primary"
app:menu="@menu/main_menu_drawer"/>
Ответ 13
При использовании BottomNavigationView
другие ответы, такие как navigationView.getMenu().getItem(0).setChecked(true);
и
navigationView.setCheckedItem(id);
не работает, вызывая setSelectedItemId
работает:
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation_view);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
// TODO: 10-Aug-19 your code here
}
});
bottomNavigationView.setSelectedItemId(R.id.myitem);
Ответ 14
Приведенный ниже код используется для выбора первого элемента, а выделяет выбранный первый элемент в меню.
onNavigationItemSelected(mNavigationView.getMenu().getItem(0).setChecked(true));
Ответ 15
Сделать селектор для индивидуалистического элемента навигационного ящика
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/darkBlue" android:state_pressed="true"/>
<item android:drawable="@color/darkBlue" android:state_checked="true"/>
<item android:drawable="@color/textBlue" />
</selector>
Сделайте несколько изменений в вашем навигационном интерфейсе
<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:itemBackground="@drawable/drawer_item"
android:background="@color/textBlue"
app:itemIconTint="@color/white"
app:itemTextColor="@color/white"
app:menu="@menu/activity_main_drawer"
/>
Ответ 16
по вашей активности (за ящиком):
@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();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
navigationView.setCheckedItem(R.id.nav_portfolio);
onNavigationItemSelected(navigationView.getMenu().getItem(0));
}
а также
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
Fragment fragment = null;
if (id == R.id.nav_test1) {
fragment = new Test1Fragment();
displaySelectedFragment(fragment);
} else if (id == R.id.nav_test2) {
fragment = new Test2Fragment();
displaySelectedFragment(fragment);
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
и в вашем меню:
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_test1"
android:title="@string/test1" />
<item
android:id="@+id/nav_test2"
android:title="@string/test2" />
</group>
поэтому первое меню выделено и отображается как меню по умолчанию.
Ответ 17
По какой-то причине предпочтительнее найти MenuItem, используя идентификаторы.
drawer.getMenu().findItem(R.id.action_something).setChecked(true);