탐색 창 : 시작시 선택한 항목을 어떻게 설정합니까?


229

내 코드는 완벽하게 작동합니다. Navigation Drawer의 항목을 클릭 할 때마다 항목이 선택됩니다.

물론 기본 조각 (홈)으로 앱을 시작하고 싶지만 탐색 창에는 항목이 선택되어 있지 않습니다. 프로그래밍 방식으로 해당 항목을 선택하려면 어떻게해야합니까?

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

여기에서 편집해야한다고 생각합니다.

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

또는 onCreateFragmentTransaction으로 앱 시작시.

당신의 지원에 감사드립니다.


답변 onNavigationItemSelected중 선택한 ID에 대한 조치가 트리거 됩니까?
Prabs

답변:


478

아래 코드를 사용하십시오 :

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

전화 한 후이 메소드를 호출하십시오. setNavDrawer();

getItem(int index)메소드는 on을 MenuItem호출 할 수 있으며, 기본적으로 가지고있는 요소 인덱스를 찾아 0을 해당 인덱스로 바꾸는 것입니다.setChecked(true);MenuItem

전화로 항목을 선택 (강조 표시) 할 수 있습니다

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

참조 링크는 다음과 같습니다. http://thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html

편집 nexus 4에서 작동하지 않았으며 라이브러리 개정 24.0.0을 지원합니다. 나는 사용을 추천합니다

navigationView.setCheckedItem(R.id.nav_item);

아래 @kingston에 의해 답변되었습니다.


65
Android 지원 라이브러리 v23이 추가되었습니다 setCheckedItem (int id).
Markus Rubey

1
setCheckedItem을 설정 한 후에도 @MarkusRubey 선택한 항목을 강조 표시 할 수 없습니다. 가능한 이유를 말씀해 주시겠습니까?
Dexto

3
나를 위해 일하지 않았다! 탐색 메뉴 드로어에서 다른 옵션에 대해 onNavigationItemSelected 메소드 를 호출 하면 "선택됨"으로 표시되는 초기 항목이 항상 상태를 유지합니다. 'navigationView.setCheckedItem (id);'를 사용할 때 완벽하게 일했다! 그런 다음 'navigationView.getMenu () performIdentifierAction (R.id.nav_market, 0);'메소드를 호출해야합니다. 원하는 항목을 선택합니다.
GFPF

3
언급 된 방법 중 어느 것도 어떤 이유로 든 나를 위해 일하지 않았습니다. 그러나 navigationView.post(new Runnable() { navigationView.setCheckedItem(...) })-일했다.
dimsuz

1
체크 된 항목을 메인 스레드와 다른 스레드에서 변경하려고합니다. :)
Arlind

105

당신은 또한 전화 할 수 있습니다 :

navigationView.setCheckedItem(id);

이 방법은 API 23.0.0에서 도입되었습니다

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

노트 : android:checkableBehavior="single"

참조


1
setCheckedItem을 설정 한 후에도 선택한 항목을 강조 표시 할 수 없습니다. 가능한 이유를 말씀해 주시겠습니까?
Dexto

3
@DeepeshDoshi 확인 가능한 동작이 있는지 확인하십시오.
Jared Burrows

1
홈 메뉴를 선택하려면 navigationView.setCheckedItem (R.id.menu_nav_home)
jaga

개별 항목의 경우 android:checkable="true"다른 항목 만 추가 하면 자체 검사되지 않습니다.
sud007

또한 navItemSelecteListener이 메소드가 리턴 된 후 항목이 선택 될 때이 메소드를 호출하지 마십시오 .
mallaudin

47

나 에게이 두 가지 방법이 효과가 없었습니다.

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

이것을 시도하십시오, 그것은 나를 위해 작동합니다.

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


2
이 팁에 감사드립니다. 위의 방법은 실제로는 문제가 있지만 문제가 다릅니다. 사용하는 경우 onNavigationItemSelected가 호출되지 않고 메뉴 항목 만 확인됩니다. 따라서 두 가지 방법을 모두 호출해야합니다.
user1209216

2
onNavigationItemSelected (navView.getMenu (). getItem (0)); 또는 onNavigationItemSelected (navView.getMenu (). getItem (R.id.nav_profile)); finditem 대신 getitem 대신 나를 위해 일했습니다.
Harsh Dalwadi

30

예 ( 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
이것은 그것을하는 한 가지 방법입니다. 나는 그것을 좋아합니다. 그러나 코드 전용 답변은 종종 권장되지 않습니다. 나는 왜 당신이 왜 사용 performIdentifierAction하고 있는지와 같은 코드를 조금 설명하기 위해 답변을 편집 할 것 입니다 onNavigationItemSelected. 당신에게 그것은 똑바로 보일지 모르지만, 새로운 개발자는 코드를 이해하는 데 어려움을 겪을 수 있습니다.
AdamMc331

@ McAdam331 물론, 오늘은 절반이 지났고 더 자세하게 쓸 시간이 없었습니다.
GFPF

25

Google의 "아주 너무 좋아"지원 라이브러리에는 항상 문제가 있습니다. 지원 라이브러리 버전을 다운 그레이드하지 않고 항목을 확인하려면 확인 상태를 설정하기 전에 확인 가능을 설정하십시오.

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

메뉴 xml 파일에서 확인 가능을 설정하면 작동 할 수도 있습니다



9

API 23은 다음과 같은 방법을 제공합니다.

navigationView.setCheckedItem(R.id.nav_item_id);

그러나 어떤 이유로이 기능으로 인해 탐색 항목 뒤의 코드가 실행되지 않았습니다. 이 방법은 내비게이션 드로어에서 항목을 강조 표시하거나 '확인'하지만 OnNavigationItemSelectedListener시작 화면이 내비게이션 드로어 선택에 의존하는 경우 시작시 빈 화면을 표시 하지 않는 것 같습니다 . 리스너를 수동으로 호출 할 수 있지만 해키처럼 보입니다.

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

위의 코드는 다음을 가정합니다.

  1. 당신은 NavigationView.OnNavigationItemSelectedListener당신의 활동에 구현 했습니다
  2. 이미 전화하셨습니다 :
    navigationView.setNavigationItemSelectedListener(this);
  3. 선택하려는 항목이 위치 0에 있습니다.

6

이를 위해 2 개의 함수를 호출해야합니다.

먼저onNavigationItemSelected 리스너 에서 구현 한 명령을 실행하십시오 .

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

둘째 : 탐색 창 메뉴 항목의 상태를 선택 (또는 확인)으로 변경합니다.

navigationView.setCheckedItem(R.id.nav_camera);

나는 두 기능을 모두 호출했고 그것은 나를 위해 일했다.


5

다음 코드는 메뉴 항목 만 선택합니다.

navigationView.setCheckedItem(id);

메뉴 항목을 선택하고 열려면 위의 줄 뒤에 다음 코드를 추가하십시오.

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


4

이것은 내 솔루션이며 매우 간단합니다.

다음은 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>

위 메뉴는 첫 번째 메뉴 항목을 강조 표시합니다. 아래 줄은 무언가를 할 것입니다 (예 : 첫 번째 조각 표시 등). 참고 : '서랍 코드 구성'후 작성

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

4

가장 쉬운 방법은 다음과 같이 xml에서 선택하는 것입니다.

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

라인에 주목 android:checked="true"


1
제 생각에 최선의 대답으로, cause는 기본 Android 제공 논리를 사용합니다. 메뉴가 레이아웃을 사용하고 메뉴 xml 파일이 아닌 어댑터에 의해 생성 된 경우에만 최상으로 투표하는 것이 좋습니다.
Andris

1
이것은 최선의 답변입니다
가네 Chowdhary Sadanala

2

우선 선택한 항목의 색상을 만듭니다. 여기 https://stackoverflow.com/a/30594875/1462969 좋은 예입니다. 아이콘 색상을 변경하는 데 도움이됩니다. 선택한 모든 항목의 배경을 변경하려면 values ​​\ style.xml 파일에 추가하십시오.

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

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

style.xml에서 색상을 선언 할 수있는 위치

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

그리고이 후

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

보시 다시피이 mainNavigationMenu_.getMenu (). findItem (itemId) .setChecked (true); 선택한 항목을 설정합니다. 여기 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"/>

나는이 방법을 좋아하며, 현재 내 프로젝트에서 사용하고 있습니다. @color/state_list답변에 코드 를 포함시키는 것이 도움이 될 수 있습니다 . 호기심에서 변수 이름 끝에 밑줄을 붙이는 명명 규칙을 어디서 얻었습니까? 나는 그 접근법을 본 적이 없다.
AdamMc331

나는 당신이 원하는 아마 생각 menuItem.getItemId()대신에itemId
크레이그 러셀

2

전화 통화 와 BottomNavigationView같은 다른 답변을 사용할 때 작동합니다.navigationView.getMenu().getItem(0).setChecked(true);navigationView.setCheckedItem(id);setSelectedItemId

    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

Nav Drawer의 개별 항목 선택기를 만듭니다.

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

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

귀하의 활동 (서랍 뒤에) :

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

그리고 메뉴에서 :

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

그래서 첫 번째 메뉴는 하이라이트 기본 메뉴로는.


0

아래 코드는 첫 번째 항목 을 선택 하고 메뉴에서 선택한 첫 번째 항목강조 표시하는 데 사용됩니다 .

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

이 onNavigationItemSelected에 액세스 할 수있는 방법과 위치를 알려주시겠습니까? 더 완전한 코드 예제를 제공하십시오.
kilokahn


-1

어떤 이유로 ID를 사용하여 MenuItem을 찾는 것이 좋습니다.

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.