Ящик для навигации: как установить выбранный элемент при запуске?

Мой код отлично работает: каждый раз, когда нажимается элемент в ящике навигации, элемент выбирается.

Конечно, я хочу запустить приложение с помощью фрагмента по умолчанию (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);