Я создал 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 управляет им самостоятельно.