Gaveta de navegação: Como defino o item selecionado na inicialização?


229

Meu código funciona perfeitamente: sempre que um item da Navegação é clicado, o item é selecionado.

É claro que quero iniciar o aplicativo com um fragmento padrão (página inicial), mas o Navigation Drawer não tem o item selecionado. Como posso selecionar esse item programaticamente?

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;
[...]

Eu acho que preciso editar aqui:

if (menuItem.isChecked()) menuItem.setChecked(false);
                    else menuItem.setChecked(true);

Ou na onCreateinicialização do aplicativo com FragmentTransaction.

Obrigado pelo seu apoio.


Alguma das respostas aciona a onNavigationItemSelectedação para o ID selecionado?
— Prabs

Respostas:


478

Use o código abaixo:

navigationView.getMenu().getItem(0).setChecked(true);

Chame esse método depois de ligar setNavDrawer();

O getItem(int index)método obtém o MenuItementão você pode chamar o setChecked(true);em que MenuItem, tudo o que estão a fazer é descobrir qual índice elemento faz o padrão tem, e substituir a 0 com esse índice.

Você pode selecionar (destacar) o item chamando

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

Aqui está um link de referência: http://thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html

EDIT Não funcionou no nexus 4, revisão da biblioteca de suporte 24.0.0. Eu recomendo o uso

navigationView.setCheckedItem(R.id.nav_item);

respondida por @kingston abaixo.


65
Bibliotecas de suporte do Android v23 adicionadas setCheckedItem (int id).
— Markus Rubey

1
@MarkusRubey mesmo depois de definir setCheckedItem Não consigo destacar o item selecionado. Você poderia dizer o possível motivo?
— Dexto 30/09

3
Não funcionou para mim! Quando o método onNavigationItemSelected é chamado para outras opções na gaveta do menu de navegação, o item inicial referido como "marcado" mantém seu estado sempre. Quando eu uso 'navigationView.setCheckedItem (id);' funcionou perfeitamente! Depois disso, ele deve chamar o método 'navigationView.getMenu () performIdentifierAction (R.id.nav_market, 0);' para realizar a seleção do item desejado.
— GFPF 04/11/2015

3
Nenhum dos métodos mencionados funcionou para mim por algum motivo. Mas fazendo navigationView.post(new Runnable() { navigationView.setCheckedItem(...) })- funcionou.
— dimsuz

1
Você provavelmente está tentando mudar o item selecionado a partir de um segmento diferente do que o segmento principal :)
— Arlind

105

Você também pode ligar para:

navigationView.setCheckedItem(id);

Este método foi introduzido na API 23.0.0

Exemplo

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

Nota: android:checkableBehavior="single"

Veja também este


1
mesmo depois de definir setCheckedItem, não consigo destacar o item selecionado. Você poderia dizer o possível motivo?
— Dexto 30/09

3
@DeepeshDoshi Por favor, verifique se você tem um comportamento verificável.
— Jared Burrows

1
deve ele navigationView.setCheckedItem (R.id.menu_nav_home) para selecionar o menu inicial
— jaga

para o item individual, basta adicionar android:checkable="true"mais, não será verificado por si próprio.
— sud007

Além disso, certifique-se de não chamar esse método de com navItemSelecteListenero item selecionado após o retorno desse método.
— mallaudin

47

Para mim, esses dois métodos não funcionaram:

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

Experimente este, funciona para mim.

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


2
Obrigado por esta dica. Os métodos acima estão realmente ok, mas o problema é diferente: se você usá-los, onNavigationItemSelected não será chamado, apenas o item de menu será verificado. Então, precisamos chamar os dois métodos.
— user1209216

2
onNavigationItemSelected (navView.getMenu (). getItem (0)); ou onNavigationItemSelected (navView.getMenu (). getItem (R.id.nav_profile)); ambos trabalharam para mim, getitem em vez de finditem.
— Harsh Dalwadi 23/02

30

Exemplo ( 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
Esta é uma maneira de fazer, eu gosto. As respostas somente de código geralmente são desencorajadas. Gostaria de editar sua resposta para explicar um pouco o código, como o motivo pelo qual você usa performIdentifierActione o que está acontecendo onNavigationItemSelected. Para você, pode parecer simples, mas um desenvolvedor mais novo pode ter problemas para entender seu código.
— precisa saber é o seguinte

@ McAdam331 É claro, sinta-se à vontade, já passou pela metade hoje e não teve tempo de escrever com mais detalhes.
— GFPF

25

Sempre há problemas com as bibliotecas de suporte do Google, "ah, que ótimo!" Se você deseja verificar um item sem fazer o downgrade de sua versão das bibliotecas de suporte, defina checkable antes de definir o estado verificado.

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

Também pode funcionar se você definir checável nos arquivos xml do menu



9

A API 23 fornece o seguinte método:

navigationView.setCheckedItem(R.id.nav_item_id);

No entanto, por algum motivo, essa função não causou a execução do código por trás do item de navegação. O método certamente destaca o item na gaveta de navegação, ou o 'verifica', mas não parece chamar o OnNavigationItemSelectedListenerresultado em uma tela em branco na inicialização se a tela de inicialização depender das seleções da gaveta de navegação. É possível chamar manualmente o ouvinte, mas parece hacky:

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

O código acima assume:

  1. Você implementou NavigationView.OnNavigationItemSelectedListenerem sua atividade
  2. Você já ligou para:
    navigationView.setNavigationItemSelectedListener(this);
  3. O item que você deseja selecionar está localizado na posição 0

6

Você precisa chamar 2 funções para isso:

Primeiro: para extrair os comandos que você implementou no onNavigationItemSelectedouvinte:

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

Segundo: para alterar o estado do item de menu da gaveta de navegação para selecionado (ou marcado):

navigationView.setCheckedItem(R.id.nav_camera);

Chamei as duas funções e funcionou para mim.


5

O código a seguir fará apenas o item de menu selecionado:

navigationView.setCheckedItem(id);

Para selecionar e abrir o item de menu, adicione o seguinte código após a linha acima.

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


4

Esta é a minha solução, muito simples.

Aqui está o meu arquivo 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>

O menu acima destacará o primeiro item do menu. A linha abaixo fará algo (por exemplo: mostrar o primeiro fragmento, etc). NOTA: escreva depois de 'configurar o código da sua gaveta'

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

4

A maneira mais fácil é selecioná-lo no xml da seguinte maneira:

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

Observe a linha android:checked="true"


1
Na minha opinião, a melhor resposta, a causa usa a lógica padrão fornecida pelo Android. Votado como melhor apenas é melhor, se o menu estiver usando o layout e gerado pelo arquivo xml do adaptador e não pelo menu.
— Andris

1
Esta é a melhor resposta
— Ganesh Chowdhary Sadanala

2

Antes de tudo, crie cores para o item selecionado. Aqui https://stackoverflow.com/a/30594875/1462969 bom exemplo. Ajuda você a mudar a cor do ícone. Para alterar o plano de fundo de todos os itens selecionados, adicione seu arquivo values ​​\ style.xml

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

Onde selectable_item_background deve ser declarado em 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>

Onde a cor pode ser declarada em style.xml

 <color name="accent_translucent">#80FFEB3B</color>

E depois disso

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

Como você vê, usei este mainNavigationMenu_.getMenu (). FindItem (itemId) .setChecked (true); para definir o item selecionado. Aqui navegação

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

Eu gosto desse método, atualmente o uso em meu próprio projeto. Pode ser útil incluir o @color/state_listcódigo na sua resposta. Por curiosidade, onde você conseguiu a convenção de nomenclatura para colocar um sublinhado no final do nome da variável? Eu nunca vi essa abordagem.
— precisa saber é o seguinte

Eu acho que talvez você queira, em menuItem.getItemId()vez deitemId
— Craig Russell

2

Ao usar BottomNavigationViewas outras respostas, como navigationView.getMenu().getItem(0).setChecked(true);e navigationView.setCheckedItem(id);não funcionará, a chamada setSelectedItemIdfunciona:

    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

Faça um seletor para o item individual da Gaveta Nav

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

Faça algumas alterações no seu 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

em sua atividade (atrás da gaveta):

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

e

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

e no seu menu:

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

então o primeiro menu é realçado e exibido como menu padrão.


0

O código abaixo é usado para selecionar o primeiro item e realçar o primeiro item selecionado no menu.

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

Você pode me dizer como e onde este onNavigationItemSelected está acessível? Forneça um exemplo de código mais completo.
— kilokahn

0

você consegue fazer isso, nav_view.getMenu().findItem(R.id.menutem).setChecked(true)


-1

Por alguma razão, é preferível encontrar o MenuItem usando os IDs.

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.