Ngăn điều hướng: Làm cách nào để đặt mục đã chọn khi khởi động?


229

Mã của tôi hoạt động hoàn hảo: mỗi khi nhấp vào một mục trong Ngăn kéo Điều hướng, mục đó được chọn.

Tất nhiên tôi muốn khởi động ứng dụng với một đoạn mặc định (nhà), nhưng Ngăn kéo Điều hướng không có mục được chọn. Làm thế nào tôi có thể chọn mục đó theo chương trình?

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

Tôi nghĩ rằng tôi cần chỉnh sửa ở đây:

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

Hoặc onCreatetại ứng dụng khởi động với FragmentTransaction.

Cảm ơn sự hỗ trợ của bạn.


Có bất kỳ câu trả lời kích hoạt onNavigationItemSelectedhành động cho id đã chọn không?
Mitchs

Câu trả lời:


478

Sử dụng mã dưới đây:

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

Gọi phương thức này sau khi bạn gọi setNavDrawer();

Các getItem(int index)phương pháp nhận được MenuItemsau đó bạn có thể gọi setChecked(true);vào đó MenuItem, tất cả các bạn đang phải làm là tìm hiểu các chỉ số yếu tố làm mặc định có, và thay thế 0 với chỉ số đó.

Bạn có thể chọn (tô sáng) mục bằng cách gọi

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

Đây là một liên kết tham khảo: http://thegeekyland.blogspot.com/2015/11/navlation-drawer-how-set-selected-item.html

EDIT Không hoạt động trên nexus 4, hỗ trợ sửa đổi thư viện 24.0.0. Tôi khuyên bạn nên sử dụng

navigationView.setCheckedItem(R.id.nav_item);

trả lời bởi @kingston dưới đây.


65
Thư viện hỗ trợ Android v23 được thêm vào setCheckedItem (int id).
Markus Rubey

1
@MarkusRubey ngay cả sau khi thiết lập setCheckedItem Tôi không thể làm nổi bật mục đã chọn. Bạn có thể cho biết lý do có thể?
Dexto

3
Không làm việc cho tôi! Khi phương thức onNavlationItemSelected được gọi cho các tùy chọn khác trong ngăn kéo menu điều hướng, mục ban đầu được gọi là "đã kiểm tra" luôn duy trì trạng thái của chúng. Khi tôi sử dụng 'navigationView.setCheckedItem (id);' làm việc hoàn hảo Sau đó, nó phải gọi phương thức 'navigationView.getMothy () PerformanceIdentifierAction (R.id.nav_market, 0);' để thực hiện việc lựa chọn các mục mong muốn.
GFPF

3
Không có phương pháp nào được đề cập làm việc cho tôi vì một số lý do. Nhưng đang làm navigationView.post(new Runnable() { navigationView.setCheckedItem(...) })- đã làm việc.
dimsuz

1
Có lẽ bạn đang cố gắng thay đổi mục đã kiểm tra từ một chủ đề khác với chủ đề chính :)
Arlind

105

Bạn cũng có thể gọi:

navigationView.setCheckedItem(id);

Phương pháp này được giới thiệu trong API 23.0.0

Thí dụ

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

Ghi chú: android:checkableBehavior="single"

Cũng xem cái này


1
ngay cả sau khi thiết lập setCheckedItem tôi không thể làm nổi bật mục đã chọn. Bạn có thể cho biết lý do có thể?
Dexto

3
@DeepeshDoshi Hãy chắc chắn rằng bạn có một hành vi có thể kiểm tra được.
Jared Burrows

1
anh ta nên điều hướngView.setCheckedItem (R.id.menu_nav_home) để chọn menu chính
jaga

đối với các mục riêng lẻ chỉ cần thêm vào android:checkable="true"nó sẽ không được tự kiểm tra.
sud007

Ngoài ra, hãy đảm bảo bạn không gọi phương thức này từ navItemSelecteListenerkhi mục được chọn sau khi phương thức này trả về.
mallaudin

47

Đối với tôi cả hai phương pháp này đều không hiệu quả:

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

Hãy thử cái này, nó làm việc cho tôi.

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


2
Cảm ơn vì lời khuyên này. Các phương pháp trên thực sự ổn, nhưng vấn đề khác: nếu bạn sử dụng chúng, onNavlationItemSelected sẽ không được gọi, chỉ có mục menu sẽ được kiểm tra. Vì vậy, chúng ta cần gọi cả hai phương pháp.
1209216

2
onNavestionItemSelected (navView.getMothy (). getItem (0)); hoặc onNavlationItemSelected (navView.getMothy (). getItem (R.id.nav_profile)); cả hai đều làm việc cho tôi, getitem thay vì finditem.
Harsh Dalwadi

30

Ví dụ ( NavigationView.OnNavlationItemSelectedListener ):

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
Đây là một cách để làm điều đó, tôi thích nó. Các câu trả lời chỉ có mã thường không được khuyến khích. Tôi sẽ chỉnh sửa câu trả lời của bạn để giải thích mã một chút, chẳng hạn như tại sao bạn sử dụng performIdentifierActionvà những gì đang xảy ra onNavigationItemSelected. Đối với bạn nó có vẻ thẳng về phía trước, nhưng một nhà phát triển mới hơn có thể gặp khó khăn trong việc hiểu mã của bạn.
AdamMc331

@ McAdam331 Tất nhiên cảm thấy tự do, hôm nay nó đã đi được một nửa và không có thời gian để viết chi tiết hơn.
GFPF

25

Luôn có vấn đề với các lib hỗ trợ "oh so great". Nếu bạn muốn kiểm tra một mục mà không hạ cấp phiên bản libs hỗ trợ của bạn, chỉ cần đặt kiểm tra trước khi đặt trạng thái kiểm tra.

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

Nó cũng có thể hoạt động nếu bạn đặt có thể kiểm tra trong các tệp xml trong menu



9

API 23 cung cấp phương thức sau:

navigationView.setCheckedItem(R.id.nav_item_id);

Tuy nhiên, vì một số lý do, chức năng này không khiến mã phía sau mục điều hướng chạy. Phương pháp này chắc chắn làm nổi bật mục trong ngăn kéo điều hướng hoặc 'kiểm tra' nó, nhưng dường như nó không gọi OnNavigationItemSelectedListenerkết quả là màn hình trống khi khởi động nếu màn hình khởi động của bạn phụ thuộc vào các lựa chọn ngăn kéo điều hướng. Có thể gọi thủ công người nghe, nhưng có vẻ như hacky:

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

Các mã trên giả định:

  1. Bạn đã thực hiện NavigationView.OnNavigationItemSelectedListenertrong hoạt động của mình
  2. Bạn đã gọi:
    navigationView.setNavigationItemSelectedListener(this);
  3. Mục bạn muốn chọn nằm ở vị trí 0

6

Bạn phải gọi 2 chức năng cho việc này:

Đầu tiên: để loại bỏ các lệnh bạn đã thực hiện trong trình onNavigationItemSelectednghe:

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

Thứ hai: để thay đổi trạng thái của mục menu ngăn kéo điều hướng thành đã chọn (hoặc được chọn):

navigationView.setCheckedItem(R.id.nav_camera);

Tôi gọi cả hai chức năng và nó làm việc cho tôi.


5

Mã sau sẽ chỉ làm cho mục menu được chọn:

navigationView.setCheckedItem(id);

Để chọn và mở mục menu, thêm mã sau dòng trên.

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


4

Đây là giải pháp của tôi, rất đơn giản.

Đây là tập tin menu.xml của tôi:

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

Menu trên sẽ làm nổi bật mục menu đầu tiên. Dòng dưới đây sẽ làm một cái gì đó (ví dụ: hiển thị đoạn đầu tiên, vv). LƯU Ý: viết sau khi 'định cấu hình mã ngăn kéo của bạn'

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

4

Cách dễ nhất là chọn nó từ xml như sau,

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

Lưu ý dòng android:checked="true"


1
Theo tôi câu trả lời tốt nhất, nguyên nhân sử dụng logic mặc định do Android cung cấp. Bình chọn là tốt nhất chỉ tốt hơn, nếu menu đang sử dụng bố cục và được tạo bởi bộ điều hợp không phải tập tin xml menu.
Andris

1
Đây là câu trả lời hay nhất
Ganesh Chowdhary Sadanala

2

Trước hết tạo màu cho mục đã chọn. Tại đây https://stackoverflow.com/a/30594875/1462969 ví dụ hay. Nó giúp bạn thay đổi màu sắc của biểu tượng. Để thay đổi nền của tất cả các mục đã chọn, hãy thêm vào tệp giá trị \ style.xml của bạn

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

Trường hợp selectable_item_background nên được khai báo trong 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>

Màu sắc có thể được khai báo trong style.xml

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

Và sau này

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

Như bạn thấy, tôi đã sử dụng mainNavlationMothy_.getMothy (). FindItem (itemId) .setChecked (true); để đặt mục đã chọn. Ở đây navigationView

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

Tôi thích phương pháp này, tôi hiện đang sử dụng nó trong dự án của riêng tôi. Nó có thể giúp bao gồm các @color/state_listmã trong câu trả lời của bạn. Vì tò mò, bạn đã lấy quy ước đặt tên ở đâu để đặt dấu gạch dưới ở cuối tên biến? Tôi chưa bao giờ thấy cách tiếp cận đó.
AdamMc331

Tôi nghĩ có lẽ bạn muốn menuItem.getItemId()thay vìitemId
Craig Russell

2

Khi sử dụng BottomNavigationViewcác câu trả lời khác như navigationView.getMenu().getItem(0).setChecked(true);navigationView.setCheckedItem(id);sẽ không hoạt động, hãy gọi setSelectedItemIdcác tác phẩm:

    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

Tạo bộ chọn cho mục Individaual của Ngăn kéo 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>

Thực hiện một vài thay đổi trong NavigationView của bạn

<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

về hoạt động của bạn (đằng sau ngăn kéo):

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

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

và trong menu của bạn:

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

Vì vậy, menu đầu tiên là nổi bậthiển thị như menu mặc định.


0

Mã bên dưới được sử dụng để chọn mục đầu tiêntô sáng mục đầu tiên được chọn trong menu.

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

Bạn có thể vui lòng cho tôi biết cách thức và nơi mà onNavulationItemSelected có thể truy cập được không? Vui lòng cung cấp một ví dụ mã đầy đủ hơn.
kilokahn

0

bạn có thể làm được việc này, nav_view.getMenu().findItem(R.id.menutem).setChecked(true)


-1

Vì một số lý do, tốt hơn là tìm MenuItem bằng ID.

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.