Как выбрать первый элемент в навигационном ящике и открыть фрагмент при запуске приложения

Я создал MainActivity с NavigationView . Когда Activity открыта, я хочу автоматически выбрать первый элемент в навигационном ящике и открыть Fragment под этим элементом. Я много искал, но не нашел подходящих решений.

Каков правильный способ сделать это?

Main Activity :

 public class MainActivity extends AppCompatActivity implements Config { private NavigationView navigationView; private DrawerLayout drawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); toolbar.setTitleTextColor(getResources().getColor(R.color.colorIcons)); if (null != getSupportActionBar()) getSupportActionBar().setLogo(R.drawable.ic_blogger_white); //Start PostListFragmentWebView /*PostListFragmentWebView postListFragmentWebView = new PostListFragmentWebView(); getSupportFragmentManager().beginTransaction() .replace(R.id.frame, postListFragmentWebView) .commit();*/ //Initializing NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView); //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { //Checking if the item is in checked state or not, if not set it to checked state. if (menuItem.isChecked()) menuItem.setChecked(false); else menuItem.setChecked(true); //Closing drawer on item click drawerLayout.closeDrawers(); //Check to see which item was clicked and perform the appropriate action. switch (menuItem.getItemId()) { case R.id.posts: PostListFragmentWebView postListFragment = new PostListFragmentWebView(); getSupportFragmentManager().beginTransaction() .replace(R.id.frame, postListFragment) .commit(); return true; case R.id.pages: PageListFragmentWebView pagetListFragment = new PageListFragmentWebView(); getSupportFragmentManager().beginTransaction() .replace(R.id.frame, pagetListFragment) .commit(); return true; case R.id.blog: BlogInfoFragmentWebView blogInfoFragment = new BlogInfoFragmentWebView(); getSupportFragmentManager().beginTransaction() .replace(R.id.frame, blogInfoFragment) .commit(); return true; default: Toast.makeText(getApplicationContext(), getResources().getString(R.string.drawer_error), Toast.LENGTH_SHORT).show(); return true; } } }); // Initializing Drawer Layout and ActionBarToggle drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.open_drawer, R.string.close_drawer) { @Override public void onDrawerClosed(View drawerView) { // Code here will be triggered once the drawer closes as we don't want anything to happen so we leave this blank. super.onDrawerClosed(drawerView); } @Override public void onDrawerOpened(View drawerView) { // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank. super.onDrawerOpened(drawerView); } }; //Setting the actionbarToggle to drawer layout drawerLayout.setDrawerListener(actionBarDrawerToggle); drawerLayout.getChildAt(0).setSelected(true); //calling sync state is necessary or else your hamburger icon wont show up actionBarDrawerToggle.syncState(); } } 

В onCreate() следующий код загружает фрагмент первого элемента при первом запуске:

 if (savedInstanceState == null) { navigationView.getMenu().performIdentifierAction(R.id.posts, 0); } 

Спасибо calvinfly за этот комментарий .

Добавьте android:checked="true" в ваш первый пункт меню.

И вручную выберите один элемент, используя

 getSupportFragmentManager().beginTransaction().replace(R.id.frame, postListFragment).commit(); 

Открыть фрагмент.

Вместо обычного слушателя …

 navView.setNavigationItemSelected(new Navigation.View.OnNavigationItemSelectedListener() {bla, bla, bla}) 

Создайте слушателя как объект Obj:

 NavigationView.OnNavigationItemSelectedListener navViewListener; navView.setNavigationItemSelectedListener(navViewListener = new NavigationView.OnNavigationItemSelectedListener() {bla, bla, bla}) 

… и используйте Obj для запуска события прослушивателя:

 navViewListener.onNavigationItemSelected(navView.getMenu().getItem(0)); 

… где getItem (0) – это первый пункт меню.

Используйте метод getItem (0) .setChecked (true) или android: checked = "true" в пункте меню XML.

Вы также можете использовать navigationView.setCheckedItem(R.id.default) ( javadoc ) после настройки навигации.

Просто добавьте этот код в метод onCreate :

 FragmentTransaction ftrans = getFragmentManager().beginTransaction(); ftrans.replace(R.id.container, <yourfragment>).commit(); 

Работайте со мной!

Это можно сделать еще лучше, учитывая ориентацию и другие изменения конфигурации. Мы могли бы выбрать любой навигационный элемент меню в зависимости от того, поступаем ли мы из предыдущего состояния. Проверка: для используемого ящика навигации: –

 public static final String SELECTED_NAV_MENU_KEY = "selected_nav_menu_key"; // The selected grid position private int mSelectedNavMenuIndex = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); ........................................................... navigationView.setNavigationItemSelectedListener(this); if (savedInstanceState != null) { // Recover assets mSelectedNavMenuIndex = savedInstanceState.getInt(SELECTED_NAV_MENU_KEY); // Recover menu as selected MenuItem menuItem = navigationView.getMenu().getItem(mSelectedNavMenuIndex); toggleNavMenuItemCheck(menuItem); navigationView.getMenu().performIdentifierAction(menuItem.getItemId(), mSelectedNavMenuIndex); return; } else { MenuItem menuItem = navigationView.getMenu().getItem(mSelectedNavMenuIndex); toggleNavMenuItemCheck(menuItem); navigationView.getMenu().performIdentifierAction(menuItem.getItemId(), mSelectedNavMenuIndex); } } 

Метод переключения, который позволяет снять флажок или проверить пункт меню

 private void toggleNavMenuItemCheck(MenuItem menuItem) { if (menuItem.isChecked()){ menuItem.setChecked(false); } else { menuItem.setChecked(true); } } 

Так я сохраняю состояние выбранного пункта меню. Проверьте:-

 @Override public boolean onNavigationItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.nav_explore: showExploreFragment(null); mSelectedNavMenuIndex = 0; break; case R.id.nav_orders: mSelectedNavMenuIndex = 1; break; case R.id.nav_settings: mSelectedNavMenuIndex = 2; break; default: showExploreFragment(null); mSelectedNavMenuIndex = 0; } drawer.closeDrawer(GravityCompat.START); return true; } // Save any important data for recovery @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(SELECTED_NAV_MENU_KEY, mSelectedNavMenuIndex); } 

NB: строка с кодом:

 navigationView.getMenu().performIdentifierAction(menuItem.getItemId(), mSelectedNavMenuIndex); 

Может быть заменен кодом:

 onNavigationItemSelected(menuItem); 

В menu.xml забудьте указать android:checkable="true" для отдельного элемента android:checkableBehavior="single" для группы элементов.

 <item android:id="@+id/pos_item_help" android:checkable="true" android:title="Help" /> <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> 

Затем внутри NavigationItemSelectedListener используйте setCheckedItem(R.id.item_id_in_menu) чтобы выбрать его.

 @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.pos_item_pos: navigationView.setCheckedItem(R.id.pos_item_pos); break; case R.id.pos_item_orders: navigationView.setCheckedItem(R.id.pos_item_orders); break; default: } return true; } 

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

Intereting Posts
WearableListenerService, onDataChanged () не вызывается Java ParseException при попытке синтаксического анализа String to Date Несовместимости уровня сервиса MonoTouch / MonoDroid? Как играть. Video4 видео в видео в андроид? Проверьте, предоставил ли пользователь доступ NotificationListener к моему приложению Как добавить тот же метод к нескольким классам (активности) Получение значения EditTexts в AlertDialog-компоновщике с использованием макета Android Lollipop знает, есть ли приложение в качестве доступа к статистике использования MediaRecorder – код перестает работать после обновления прошивки Показывать только вкладки с помощью actionBarSherlock Android SoftKeyboard как создавать собственные предложения Как написать приложение для Android для чтения / записи sysfs? Сколько максимальных устройств мы можем подключить через Bluetooth к устройству Android за раз? Ввод ритм-игры Android: передать событие жестов в другое представление