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.