2015-06-25 15 views
14

Tôi đã tạo MainActivity với NavigationView. Khi mở Activity Tôi muốn tự động chọn mục đầu tiên trong ngăn điều hướng và mở Fragment trong mục đó. Tôi đã tìm kiếm rất nhiều nhưng không tìm thấy bất kỳ giải pháp thích hợp nào.Cách chọn mục đầu tiên trong ngăn điều hướng và mở một đoạn trên ứng dụng bắt đầu

Cách thích hợp để thực hiện việc này là gì?

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(); 
} 
} 
+3

có bạn đã cố gắng để gọi navigationView.getMenu(). findItem (menuItemId) .setChecked (true) – calvinfly

+1

này chỉ đánh dấu các mục như chọn tôi đã làm điều này trong xml .. – Darpan

+4

getMenu từ navigationView và sau đó gọi [performIdentifierAction] (https: // devel oper.android.com/reference/android/view/Menu.html#performIdentifierAction) – calvinfly

Trả lời

39

Trong onCreate(), sau mã sẽ nạp đoạn mục đầu tiên của khi bắt đầu đầu tiên:

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

Nhờ calvinfly for this comment.

+3

Bạn đã đặt mã này ở đâu để đảm bảo mã chỉ chạy khi bắt đầu và không phải lúc nào hoạt động được tạo? – AdamMc331

+1

Ngoài ra, điều này sẽ chọn mục đầu tiên nhưng không đánh dấu mục đó là đã chọn trong menu. :/ – AdamMc331

+0

Tôi đã đặt nó trong 'onCreate', để kiểm tra mục' if (menuItem.isChecked()) menuItem.setChecked (false); else menuItem.setChecked (true); 'đã làm việc cho tôi. BTW Tôi không còn sử dụng điều này thay vì bây giờ tôi đang sử dụng thư viện [THIS] này (https://github.com/rudsonlive/NavigationDrawer-MaterialDesign) – Darpan

14

Thêm android:checked="true" đến mục menu đầu tiên của bạn.

Và tự chọn một mục, sử dụng

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

để mở đoạn.

+0

của nó đã được thêm vào nhưng khi hoạt động bắt đầu nó cho thấy trang trống tức là hoạt động xem nội dung tôi muốn thay thế bằng đoạn, tôi biết tôi có thể trực tiếp làm điều này với FragmentTransaction nhưng tôi muốn chọn mục điều hướng đầu tiên trong ngăn kéo programatically! – Darpan

+0

Thêm 'android: checked =" true "' chỉ làm cho menu có trạng thái được chọn. Và xem câu trả lời đã sửa đổi của tôi để mở đoạn. –

+0

Ồ, bạn đã biết điều đó. –

1

Bạn cũng có thể sử dụng navigationView.setCheckedItem(R.id.default) (javadoc) sau khi thiết lập chế độ xem điều hướng.

3

Thay vì nghe bình thường ...

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

Tạo người nghe như một obj:

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

... và sử dụng obj để kích hoạt sự kiện nghe:

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

... trong đó getItem (0) là mục menu đầu tiên.

Sử dụng phương thức getItem (0) .setChecked (true) hoặc android: checked = "true" ở định dạng XML của mục menu.

+0

giải pháp hoàn hảo! – Mehdi

0

chỉ cần thêm mã này trong onCreate phương pháp:

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

làm việc cho tôi!

0

Điều này có thể được thực hiện tốt hơn nữa trong khi xem xét định hướng và các thay đổi cấu hình khác. Chúng tôi có thể chọn bất kỳ navuitem nav ngăn xếp tùy thuộc vào việc chúng ta đang đến từ một nhà nước trước đó. Kiểm tra: Đối với các ngăn kéo Navigation cầm Hoạt động: -

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

Phương pháp chuyển đổi giúp bỏ chọn hoặc đánh dấu vào mục menu

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

Đây là cách tôi lưu trạng thái của menu item được chọn.Kiểm tra: -

@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: Điểm mấu với mã:

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

có thể được thay thế bằng mã:

onNavigationItemSelected(menuItem); 
0

trong menu.xml nhớ đề cập đến android:checkable="true" cho mục duy nhất và android:checkableBehavior="single" cho một nhóm mặt hàng.

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

sau đó bên trong NavigationItemSelectedListener sử dụng setCheckedItem(R.id.item_id_in_menu) để làm cho nó được chọn.

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

Và bạn không phải thực hiện nhiệm vụ bẩn khi quản lý mục đã chọn nữa. navigationView tự quản lý nó.

0

1.) Để hạ đến HomeFragment ban đầu, sử dụng này bên trong onCreate của bạn() trong MainActivity:

Fragment fragment = new HomeFragment(); 
// replacing the fragment 
if (fragment != null) { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, fragment); 
    ft.commit(); 
} 

2.) Để thiết lập các mục như chọn trong navigationDrawer thiết lập các mục như kiểm tra trong navigation_menu. xml

android:checked = "true" 
Các vấn đề liên quan