11

używam pojedyncze działanie i wiele fragmentów podejście w mojej aplikacjiJak uchwyt szuflady przełącznika i pasek narzędzi, gdy mając pasek dla każdego fragmentu

Teraz ponieważ w moich niektórych fragmentów Mam widok niestandardowy w pasku postanowiłem mieć oddzielny pasek narzędzi dla każdego fragmentu.

Jak wdrożyć oddzielny pasek narzędzi dla każdego fragmentu również układ szuflada jest w mojej działalności Home page category page

+0

Czy znalazłeś jakieś rozwiązanie? –

+0

nie znaleziono żadnego rozwiązania – alphanso

Odpowiedz

0

Nie jestem pewien, czy zrozumiałem swój opis swojej aplikacji poprawnie, ale ostatnio zrobił to, co ja myślę, że opisałeś. Mój układ działań był DrawerLayout z dołączonym układem CoordinatorLayout/AppBar z jednym paskiem narzędzi i FrameLayout poniżej. Plik menu.xml zawierał wszystkie potrzebne elementy na moim pasku narzędzi dla wszystkich fragmentów. Elementy kliknięte w menu nav zamieniły fragmenty w FrameLayout. My onNavigationItemSelected() nazywa się na tej metodzie, aby zamienić się fragmenty i obsługiwać backstack:

public void switchView(int id, int optArg) { 
    if (currentView != id) { 
    currentView = id; //currentView keeps track of which fragment is loaded 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    //Fragment contentFragment is the current fragment in the FrameLayout 
    switch (id) { 
     case 0: //menu item 1 
     contentFragment = new Nav_Item1_Fragment(); 
     transaction.replace(R.id.fragment_container, contentFragment, ""); 
     break; 
     case 1: //menu item 2 
     contentFragment = new Nav_Item2_Fragment(); 
     transaction.replace(R.id.fragment_container, contentFragment, ""); 
     break; 
     case 2: //menu item 3 
     contentFragment = new Nav_Item3_Fragment(); 
     transaction.replace(R.id.fragment_container, contentFragment, ""); 
     break; 
    } 
    // Replace whatever is in the fragment_container view with this fragment, 
    // and add the transaction to the back stack 
    // transaction.replace(R.id.fragment_container, contentFragment); 
    transaction.addToBackStack(null); 
    // Commit the transaction 
    transaction.commit(); 
    } 
} 

a każdy fragment za onPrepareOptionsMenu() Ja setVisible() ukrył/wykazało pozycje menu w pasku narzędzi związanych z tym fragmentem. Każdy element miał metodę w działaniu wskazywaną przez atrybut onClick elementu menu, który wiedział, z jakiego fragmentu pochodzi i jakie widoki zostały mu przekazane.

szuflada została ustawiona w onCreate() aktywności w ActionBarDrawerToggle tak:

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

aktywności xml:

<android.support.v4.widget.DrawerLayout 
    android:id="@+id/drawer_layout" 
    ...> 

    <include 
     layout="@layout/app_bar_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

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

</android.support.v4.widget.DrawerLayout> 

app_bar_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    ...> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     ...> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:gravity="top" 
      .../> 

    </android.support.design.widget.AppBarLayout> 

    <FrameLayout 
     android:id="@+id/fragment_container" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 
    </FrameLayout> 

</android.support.design.widget.CoordinatorLayout> 

Dlatego ... Jedno menu nawigacji, jedna aplikacja/pasek narzędzi, wiele fragmentów

+0

nie to nie chcę Chcę mieć pasek narzędzi dla każdego fragmentu i chcę obsługiwać przełączanie szuflady w tym samym czasie – alphanso

0

Dlaczego konkretnie chcesz osobny pasek narzędzi dla każdego fragmentu? Możesz łatwo zmienić widok paska narzędzi dla każdego fragmentu.

W swojej funkcji, aby przełączyć fragmenty -

public void selectDrawerItem(MenuItem item) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction; 
     switch (item.getItemId()) { 

        case R.id.nav_home : 
         getSupportActionBar().setCustomView(R.layout.home_nav_bar); 
         fragmentClass = HomeFragment.class; 
         break; 
        case R.id.nav_settings : 
         getSupportActionBar().setCustomView(R.layout.settings_nav_bar); 
         fragmentClass = SettingsFragment.class; 
         break; 

     } 
     fragment = (Fragment) fragmentClass.newInstance(); 
     fragmentManager.popBackStack(null, 
     FragmentManager.POP_BACK_STACK_INCLUSIVE); 

     fragmentTransaction = fragmentManager.beginTransaction(); 
       fragmentTransaction.replace(R.id.fragment_container, fragment); 
       fragmentTransaction.addToBackStack(null); 
       fragmentTransaction.commit(); 
} 

Więc można łatwo korzystać z tego samego paska narzędzi i dostosować go zgodnie z własnymi wymaganiami dla każdego fragmentu.

+0

Chcę użyć oddzielnego paska narzędzi dla każdego fragmentu proszę ponownie przeczytać pytanie – alphanso

+0

Czy możesz wyjaśnić, dlaczego chcesz użyć oddzielnego paska narzędzi? Korzystanie z widoku niestandardowego przypomina korzystanie z oddzielnego paska narzędzi. Jeśli nadal jesteś nieugięty na oddzielnym pasku narzędzi, jedyną opcją, którą mogę wymyślić jest utworzenie wielu instancji ActionBarDrawerToggle z instancją paska narzędzi, która ma się podobać - 'ActionBarDrawerToggle toggle1 = new ActionBarDrawerToggle ( to, drawerLayout, toolbar1, R.string.navigation_open , R.string.navigation_close); 'A następnie przed załadowaniem żądanego fragmentu,' drawerLayout.addDrawerListener (toggle1); 'To nie jest testowane. Więc daj mi znać, jeśli to działa. – user3911483

4

Mam ten sam problem, dodam niestandardowy widok paska narzędzi dla każdego fragmentu.

Moja metoda Utility jest:

public static View addRemoveViewFromToolbar(FragmentActivity fragmentActivity, int resourceId) { 
    Toolbar toolbar = removeViewFromToolbar(fragmentActivity); 
    if (resourceId == 0) { 
     return null; 
    } else { 
     View view = LayoutInflater.from(fragmentActivity).inflate(resourceId, toolbar, false); 
     toolbar.addView(view); 
     return view; 
    } 
} 


public static Toolbar removeViewFromToolbar(FragmentActivity fragmentActivity) { 
    Toolbar toolbar = (Toolbar) fragmentActivity.findViewById(R.id.toolbar); 
    if (toolbar.getChildCount() > 1) { 
     for (int i = 1; i <= toolbar.getChildCount(); i++) { 
      toolbar.removeViewAt(1); 
     } 
    } 
    return toolbar; 
} 

W moim każdego fragmentu

//Create your custom view based on requirement 
    View view = Utility.addRemoveViewFromToolbar(getActivity(), R.layout.toolbar_search_view); 
     if (view != null) { 
      edtCategory1 = (EditText) view.findViewById(R.id.edtCategory1); 
      edtCategory1.setOnClickListener(this); 
     } 

Nadzieja to wyjaśnienie pomóc :)

0

Można to zrobić w bardzo prosty sposób.

  1. Najpierw utwórz działanie z drawerlayout.

  2. drugie utworzyć kontener viewpager wewnątrz aktywności trzymać fragments

  3. trzecie zaimplementować słuchacza na swoim viewpager że będzie ustawić istotnych toolbar na podstawie fragment na wyświetlaczu.

Pozwól mi zilustrować za pomocą odpowiednich plików XML i kodu

najpierw XML Drawerlayout dla głównej działalności

<?xml version="1.0" encoding="utf-8"?> 
    <android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true" 
     tools:openDrawer="start"> 
<include 
    layout="@layout/app_bar_landing_page" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<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:headerLayout="@layout/nav_header_landing_page" 
    app:menu="@menu/activity_landing_page_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

Uwaga układ kontenera app_bar_landing_page. Teraz XML dla tego

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="me.veganbuddy.veganbuddy.ui.LandingPage"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      android:elevation="4dp" 
      app:logo="@drawable/vegan_buddy_menu_icon" 
      app:popupTheme="@style/AppTheme.PopupOverlay" /> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/container_for_fragments" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 
</android.support.design.widget.CoordinatorLayout> 

Zanotować viewpager która będzie działać jako kontener dla fragmentów. Teraz OnPageChangeListener na ekranie podglądu.

mViewPager = (ViewPager) findViewById(R.id.container_for_fragments); 
    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      switch (position+1){ 
       case 0:setSupportActionBar(aToolbar); 
        break; 
       case 1:setSupportActionBar(bToolbar); 
        break; 
       case 2:setSupportActionBar(cToolbar);; 
        break; 
       case 3:setSupportActionBar(dToolbar); 
        break; 
       default: 
        break; 
      } 
     } 

Daj mi znać, jeśli w ogóle potrzebne jest dalsze uściślenie

0

Najprostsze podejście Proponuję jest użycie zwrotnych aktywności. Za każdym razem, gdy każdy fragment ładuje się w działaniu, ustaw wywołanie zwrotne dla działania i załaduj odpowiedni pasek narzędzi w działaniu.

Masz oddzielny pasek narzędzi xmls w swoim folderze układu. Użyj znacznika include, aby umieścić paski narzędzi w swojej aktywności. Przechowywać tylko 1 pasek narzędzi widoczny na raz. Kiedy wywołania zwrotne fragmentów przychodzą do Twojej aktywności, spraw, aby niezbędny był widoczny.

Powiązane problemy