0

In meiner App habe ich eine NavigationDrawer in meiner App, die zwei Fragmente, die ich anzeigen möchte (Fragment1 und Fragment2) in einer MainActivity. Ich habe einen Menüeintrag in meiner ToolBar in Fragment 1, wenn ich auf meine MainActivity geklickt habe, um zu Fragment2 zu wechseln und die NavigationView die Änderungen der Benutzeroberfläche widerzuspiegeln.Fragment zu fragmentieren Kommunikation innerhalb eines NavigationDrawer

public class MainActivity extends AppCompatActivity { 

    private DrawerLayout mDrawer; 
    private Toolbar toolbar; 
    private NavigationView nvDrawer; 
    private ActionBarDrawerToggle drawerToggle; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction().replace(R.id.flContent, new BookListFragment()).commit(); 
     } 

     // Set a Toolbar to replace the ActionBar. 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     // Find our drawer view 
     mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawerToggle = setupDrawerToggle(); 

     // Tie DrawerLayout events to the ActionBarToggle 
     mDrawer.addDrawerListener(drawerToggle); 

     // Find our drawer view 
     nvDrawer = (NavigationView) findViewById(R.id.nvView); 
     // Setup drawer view 
     setupDrawerContent(nvDrawer); 

    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     drawerToggle.syncState(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     // Pass any configuration change to the drawer toggles 
     drawerToggle.onConfigurationChanged(newConfig); 
    } 

    private ActionBarDrawerToggle setupDrawerToggle() { 
     // NOTE: Make sure you pass in a valid toolbar reference. ActionBarDrawToggle() does not require it 
     // and will not render the hamburger icon without it. 
     return new ActionBarDrawerToggle(this, mDrawer, toolbar, R.string.drawer_open, R.string.drawer_close); 
    } 

    private void setupDrawerContent(NavigationView navigationView) { 
     navigationView.setNavigationItemSelectedListener(
       new NavigationView.OnNavigationItemSelectedListener() { 
        @Override 
        public boolean onNavigationItemSelected(MenuItem menuItem) { 
         selectDrawerItem(menuItem); 
         return true; 
        } 
       }); 
    } 

    public void selectDrawerItem(MenuItem menuItem) { 
     // Create a new fragment and specify the fragment to show based on nav item clicked 
     Fragment fragment = null; 
     Class fragmentClass; 
     switch (menuItem.getItemId()) { 
      case R.id.book_list_fragment: 
       fragmentClass = BookListFragment.class; 
       break; 
      case R.id.discover_fragment: 
       fragmentClass = DiscoverFragment.class; 
       break; 
      default: 
       fragmentClass = BookListFragment.class; 
     } 

     try { 
      fragment = (Fragment) fragmentClass.newInstance(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // Insert the fragment by replacing any existing fragment 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit(); 

     // Highlight the selected item has been done by NavigationView 
     menuItem.setChecked(true); 
     // Set action bar title 
     setTitle(menuItem.getTitle()); 
     // Close the navigation drawer 
     mDrawer.closeDrawers(); 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // The action bar home/up action should open or close the drawer. 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       mDrawer.openDrawer(GravityCompat.START); 
       return true; 
     } 

     if (drawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

Fragment-Code

public class BookListFragment extends Fragment { 
    ... 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_insert_dummy_data: 
       insertBook(); 
       return true; 
      case R.id.action_delete_all_entries: 
       int rowsDeleted = getContext().getContentResolver().delete(ShelfHelpContract.BookEntry.CONTENT_URI, null, null); 
       return true; 
      case R.id.action_discover: 
       /*TODO Here I want to open another Fragment and have it reflect 
       in the UI on my NavigationView and MainActivity 
       */ 

       return true; 

     } 
     return super.onOptionsItemSelected(item); 
    .... 
} 
+0

"haben die NavigationView spiegeln die UI Änderungen" Welche Benutzeroberfläche ändert? –

+0

In der NavigationView möchte ich auf der Benutzeroberfläche anzeigen, dass die Einträge im Menü "Schublade" geändert wurden und nicht nur mein aktuelles Fragment durch ein neues ersetzt wurde. –

+0

Eigentlich sollten Sie nur navigieren, indem Sie das ausgewählte Element in der Navigationsansicht festlegen. Der Listener sollte die Navigation zum Fragment übernehmen. – EpicPandaForce

Antwort

0

Der folgende Code übernimmt Ihre ersetzen Fragment, wenn der Benutzer auf einen der Navigationspunkte klickt

// Insert the fragment by replacing any existing fragment 
FragmentManager fragmentManager = getSupportFragmentManager(); 
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit(); 

Neben dem Fragment ersetzt werden Sie wollen auch update the title Ihrer Aktivität mit etwas in der Art von:

((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("Home");

Und schließlich müssen Sie Ihre NavigationView sagen das richtige Element mit der setChecked(boolean) Funktion zu markieren. Es sollte wie folgt aussehen:

nvDrawer.getMenu().findItem(/*your item id*/).setChecked(true);

Wenn Sie die gleiche Aktion ausgeführt werden soll, wenn der Benutzer auf einen Menüpunkt klickt dann in Ihrem onOptionsItemSelected(MenuItem item) und nur gefunden stellen Sie sicher, einen neuen Fall an den Schalterblock hinzufügen rufen Sie die gleichen Linien in der rechten Fragment

+0

Hey! Danke für die Antwort. Diese Implementierung wechselt zum rechten Fragment, aber die Änderungen werden nicht in der Navigationsansicht angezeigt. Es zeigt immer noch, dass ich in meinem ersten Fragment bin. –

+0

Meinst du, dass die Navigationsansicht einen anderen Bildschirm markiert als den, den du gerade ansiehst? –

+0

Ich glaube schon. Hier ist ein [Beispiel] (https://flic.kr/p/Vu6DjC) von dem, was ich tun möchte und ein [Beispiel] (https://flic.kr/p/VPtuEY) von dem, was passiert ist. –

Verwandte Themen