Ящик навігації: Як встановити вибраний елемент при запуску?


229

Мій код працює чудово: кожен раз, коли ви натискаєте елемент в Навігаційному ящику, вибирається предмет.

Звичайно, я хочу запустити додаток із фрагмента за замовчуванням (домашній), але пункт "Навігація" не вибрав елемент. Як я можу програмно вибрати цей елемент?

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дію для вибраного ідентифікатора?
Прабс

Відповіді:


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

EDIT Не працював на 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 () performIdentifierAction (R.id.nav_market, 0);' виконати вибір потрібного елемента.
GFPF

3
Жоден із згаданих методів мені чомусь не працював. Але робити navigationView.post(new Runnable() { navigationView.setCheckedItem(...) })- працював.
dimsuz

1
Ви, ймовірно, намагаєтесь змінити позначений елемент на інший потік, ніж основний потік :)
Арлінд,

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
слід вибрати, щоб він вибрав домашнє меню
jaga

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

Також переконайтеся, що ви не зателефонували цьому методу з, navItemSelecteListenerяк вибрано пункт після повернення цього методу.
mallaudin

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.
Суворий Дальваді

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

Ткс


2
Це один із способів зробити це, мені подобається. Хоча відповіді, що стосуються лише коду, часто не рекомендують. Я б відредагував вашу відповідь, щоб трохи пояснити код, наприклад, чому ви використовуєте performIdentifierActionі що відбувається в onNavigationItemSelected. Вам може здатися прямо вперед, але у нового розробника можуть виникнути проблеми з розумінням вашого коду.
AdamMc331

@ McAdam331 Звичайно, не соромтеся, сьогодні сьогодні тут напівзник і не встиг написати докладніше.
GFPF

25

Завжди є проблеми з підтримкою "Гуглз", так чудово. Якщо ви хочете перевірити елемент, не погіршуючи версію файлів підтримки, просто встановіть перевірку перед встановленням встановленого стану.

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

Можливо, це також спрацює, якщо ви встановите в меню 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 хороший приклад. Це допомагає вам змінити колір піктограми. Щоб змінити фон усіх вибраних елементів, додайте у файл значень \ style.xml це

  <item name="selectableItemBackground">@drawable/selectable_item_background</item>

Де selectable_item_background слід оголосити у dravable / 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.