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


229

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

Конечно, я хочу запустить приложение с фрагментом по умолчанию (home), но в Navigation Drawer элемент не выбран. Как я могу выбрать этот пункт программно?

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.

Спасибо за Вашу поддержку.


Любой из ответов запускает onNavigationItemSelectedдействие для выбранного идентификатора?
17

Ответы:


478

Используйте код ниже:

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 ниже.


65
Добавлены библиотеки поддержки Android v23 setCheckedItem (int id).
Маркус Руби

1
@MarkusRubey даже после установки setCheckedItem Я не могу выделить выбранный элемент. Не могли бы вы рассказать о возможной причине?
Dexto

3
Не работал для меня! Когда метод onNavigationItemSelected вызывается для других опций в блоке меню навигации, начальный элемент, называемый «флажок», всегда поддерживает их состояние. Когда я использую 'navigationView.setCheckedItem (id);' работал отлично! После этого он должен вызвать метод navigationView.getMenu () executeIdentifierAction (R.id.nav_market, 0); ' выполнить выбор нужного элемента.
GFPF

3
Ни один из упомянутых методов не работал для меня по некоторым причинам. Но делал navigationView.post(new Runnable() { navigationView.setCheckedItem(...) })- работал.
dimsuz

1
Вы, вероятно, пытаетесь изменить отмеченный элемент из другого потока, отличного от основного потока :)
Arlind

105

Вы также можете позвонить:

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"

Смотрите также это


1
даже после установки setCheckedItem я не могу выделить выбранный элемент. Не могли бы вы рассказать о возможной причине?
Dexto

3
@DeepeshDoshi Пожалуйста, убедитесь, что у вас есть проверяемое поведение.
Джаред Берроуз

1
он должен, чтобы он Navigation View.setCheckedItem (R.id.menu_nav_home) выбрал домашнее меню
Jaga

для отдельного предмета просто добавьте, android:checkable="true"иначе он не будет проверен самостоятельно.
sud007

Также убедитесь, что вы не вызываете этот метод из, так navItemSelecteListenerкак элемент выбран после возврата этого метода.
Маллаудин

47

Для меня оба эти метода не сработали:

  • navigationView.getMenu().getItem(0).setChecked(true);
  • navigationView.setCheckedItem(id);

Попробуйте это, это работает для меня.

onNavigationItemSelected(navigationView.getMenu().findItem(R.id.nav_profile));


2
Спасибо за этот совет. Выше методы на самом деле в порядке, но проблема в другом: если вы используете их, onNavigationItemSelected не будет вызываться, будет проверяться только пункт меню. Поэтому нам нужно вызвать оба метода.
user1209216

2
onNavigationItemSelected (navView.getMenu () GetItem (0).); или onNavigationItemSelected (navView.getMenu (). getItem (R.id.nav_profile)); оба работали для меня, getitem вместо finditem.
Суровый Dalwadi

30

Пример ( 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


2
Это один из способов сделать это, мне это нравится. Однако ответы только на код часто не одобряются. Я бы отредактировал ваш ответ, чтобы немного объяснить код, например, почему вы используете performIdentifierActionи что происходит onNavigationItemSelected. Для вас это может показаться простым, но у нового разработчика могут возникнуть проблемы с пониманием вашего кода.
AdamMc331,

@ McAdam331 Конечно, не стесняйтесь, сегодня он наполовину ушел и не успел написать более подробно.
GFPF

25

Всегда есть проблемы с Googles "о, так здорово" поддержки библиотек. Если вы хотите проверить элемент без понижения версии вашей библиотеки поддержки, просто установите checkable, прежде чем устанавливать состояние галочки.

MenuItem item = drawer.getMenu().findItem(R.id.action_something);
item.setCheckable(true);
item.setChecked(true);

Это также может работать, если вы установите checkable в меню XML-файлов



9

API 23 обеспечивает следующий метод:

navigationView.setCheckedItem(R.id.nav_item_id);

Однако по какой-то причине эта функция не вызвала выполнение кода за элементом навигации. Этот метод, безусловно, выделяет элемент в блоке навигации или «проверяет» его, но OnNavigationItemSelectedListenerпри запуске он не вызывает пустой экран, если ваш стартовый экран зависит от выбора блока навигации. Можно вручную вызвать слушателя, но это кажется хакерским:

if (savedInstanceState == null) this.onNavigationItemSelected(navigationView.getMenu().getItem(0));

Приведенный выше код предполагает:

  1. Вы внедрили NavigationView.OnNavigationItemSelectedListenerв свою деятельность
  2. Вы уже звонили:
    navigationView.setNavigationItemSelectedListener(this);
  3. Элемент, который вы хотите выбрать, находится в позиции 0

6

Для этого вам нужно вызвать 2 функции:

Первое: для исключения команд, которые вы реализовали в onNavigationItemSelectedслушателе:

onNavigationItemSelected(navigationView.getMenu().getItem(R.id.nav_camera));

Второе: для изменения состояния пункта меню навигационного ящика на выбранный (или отмеченный):

navigationView.setCheckedItem(R.id.nav_camera);

Я вызвал обе функции, и у меня это сработало.


5

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

navigationView.setCheckedItem(id);

Чтобы выбрать и открыть пункт меню, добавьте следующий код после строки выше.

onNavigationItemSelected(navigationView.getMenu().getItem(0));


4

Это мое решение, очень простое.

Вот мой файл 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));

4

Самый простой способ - выбрать его из 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"


1
На мой взгляд лучший ответ, причина использует стандартную Android-логику. Голосование за лучшее только лучше, если меню использует макет и генерируется адаптером, а не XML-файлом меню.
Андрис

1
Это лучший ответ
Ганеш Чоудхари Саданала

2

Прежде всего создайте цвета для выбранного элемента. Вот https://stackoverflow.com/a/30594875/1462969 хороший пример. Это поможет вам изменить цвет значка. Для изменения фона всего выбранного элемента добавьте в ваш файл values ​​\ 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 (true); установить выбранный пункт. Здесь навигацияПросмотреть

 <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"/>

Мне нравится этот метод, в настоящее время я использую его в своем собственном проекте. Это может помочь включить @color/state_listкод в ваш ответ. Из любопытства, где вы взяли соглашение об именах, чтобы поставить подчеркивание в конце имени переменной? Я никогда не видел такой подход.
AdamMc331,

Я думаю, что, возможно, вы хотите menuItem.getItemId()вместоitemId
Крейг Рассел

2

При использовании 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);

0

Сделать селектор для индивидуального предмета из Nav Drawer

<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>

Сделайте несколько изменений в вашем NavigationView

<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"
        />

0

по вашей деятельности (за ящиком):

@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>

поэтому первое меню выделено и отображается как меню по умолчанию.


0

Код ниже используется для выбора первого элемента и выделения выбранного первого элемента в меню.

onNavigationItemSelected(mNavigationView.getMenu().getItem(0).setChecked(true));

Подскажите пожалуйста, как и где этот onNavigationItemSelected доступен? Пожалуйста, предоставьте более полный пример кода.
килокан


-1

По некоторым причинам предпочтительнее найти MenuItem, используя идентификаторы.

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.