web-dev-qa-db-de.com

So wählen Sie den ersten Eintrag in einer Navigationsleiste aus und öffnen ein Fragment beim Start der Anwendung

Ich habe MainActivity mit NavigationView erstellt. Wenn Activity geöffnet ist, möchte ich automatisch das erste Element in der Navigationsleiste auswählen und Fragment unter diesem Element öffnen. Ich habe viel gesucht, aber keine passenden Lösungen gefunden.

Was ist der richtige Weg, dies zu tun?

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();
}
}
14
DCK

In onCreate() lädt der folgende Code das Fragment des ersten Elements beim ersten Start:

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

Vielen Dank an calvinfly für diesen Kommentar .

40
DCK

Fügen Sie Android:checked="true" zu Ihrem ersten Menüpunkt hinzu.

Und wählen Sie manuell ein Element mit 

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

fragment öffnen.

14
Ellie Zou

Anstelle eines normalen Zuhörers ... 

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

Erstellen Sie den Listener als Obj:

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

... und benutze das Obj, um das Listener-Ereignis auszulösen:

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

... wobei getItem (0) der erste Menüpunkt ist.

Verwenden Sie die Methode getItem (0) .setChecked (true) oder Android: checked = "true" im Menüpunkt XML-Definition. 

3
Marcus Martinho

Sie können auch navigationView.setCheckedItem(R.id.default) ( javadoc ) verwenden, nachdem Sie Ihre Navigationsansicht eingerichtet haben.

1
KuroObi

Dies kann unter Berücksichtigung der Ausrichtung und anderer Konfigurationsänderungen noch besser durchgeführt werden. Wir können das Navi-Schubladenmenü auswählen, je nachdem, ob wir aus einem früheren Bundesstaat stammen. Prüfen Sie Folgendes: Für die Navigationsaktivität der Navigationsschublade: -

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

Die Toggle-Methode, mit der das Menüelement deaktiviert oder überprüft wird

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

So speichere ich den Zustand des ausgewählten Menüpunkts. Prüfen:-

@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: Die Zeile mit dem Code:

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

Kann durch den Code ersetzt werden:

onNavigationItemSelected(menuItem);
0
Rowland Mtetezi

1.) Um zuerst auf dem HomeFragment zu landen, verwenden Sie dies in Ihrem onCreate () in 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.) Um das Element als in navigationDrawer ausgewählt festzulegen, setzen Sie das Element in navigation_menu.xml als aktiviert 

 Android:checked = "true"
0
Saurabh Singh

in menu.xml müssen Sie Android:checkable="true" für ein einzelnes Element und Android:checkableBehavior="single" für eine Gruppe von Elementen angeben.

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

dann in NavigationItemSelectedListener verwenden Sie setCheckedItem(R.id.item_id_in_menu), um es auszuwählen.

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

Sie müssen nicht mehr die schmutzige Aufgabe übernehmen, das ausgewählte Element zu verwalten. navigationView verwaltet es selbst.

0
sud007

fügen Sie einfach diesen Code in der onCreate-Methode hinzu:

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

Arbeite für mich ! 

0
O6e36ashenII