2016-01-13 15 views
6

Przepraszam za uprzedzenie mojego złego kodu i złej wiedzy. Niedawno rozpocząłem kodowanie w systemie Android i JavaWyświetlane fragmenty kartek i normalne fragmenty

Mój problem polega na tym, że mam szufladę nawigacyjną i karty. Chociaż jeśli wybiorę coś z szuflady nawigacyjnej, która wczytuje się w Fragmentie, nie pokazuje się. Pokazują się tylko karty.

Mój plan jest taki, że jedna karta szuflady nawigacji ma 3 zakładki wewnątrz, a reszta tylko zwykłe strony bez kart.

MainActivity.java

http://pastebin.com/TV7aWy9c

activity_main.xml

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

    <FrameLayout 
     android:id="@+id/fragment_layout" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     android:background="#000000" /> 

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

</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:fitsSystemWindows="true" 
    tools:context="se.themeister.hello.MainActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     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" 
      app:popupTheme="@style/AppTheme.PopupOverlay" /> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tab_layout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/toolbar" 
      android:background="?attr/colorPrimary" 
      android:elevation="6dp" 
      android:minHeight="?attr/actionBarSize" 
      android:theme="@style/AppTheme.AppBarOverlay"/> 

     <android.support.v4.view.ViewPager 
      android:id="@+id/pager" 
      android:layout_width="match_parent" 
      android:layout_height="fill_parent" 
      android:background="#009900" 
      android:layout_below="@id/tab_layout"/> 

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

    <include layout="@layout/content_main"/> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="@dimen/fab_margin" 
     android:src="@android:drawable/ic_dialog_email" /> 

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

ja nie wiem, czy to wystarczy, czy więcej informacji lub kodu jest potrzebny

Odpowiedz

11

Problem z Twoim kodem polega na tym, że Twój ViewPager z TabLayout powinien być częścią Fragment, a nie częścią Activity. I NavigationDrawer powinien po prostu zamienić jeden fragment na inny w oknie roboczym (tj. W kontenerze). Teraz w swoim kodzie próbujesz w jakiś sposób wstawić nowy Fragment do ViewPager.

Here's bardzo prosty app z szuflady nawigacji, jeden fragment z kartami i odpocząć fragmentów bez zakładek, które można wykorzystać jako przykład:

enter image description here

Activity.xml:

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

    <android.support.design.widget.CoordinatorLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true"> 

     <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" 
       app:popupTheme="@style/AppTheme.PopupOverlay" /> 

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

     <FrameLayout 
      android:id="@+id/fragmentContainer" 
      android:layout_marginTop="?attr/actionBarSize" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 

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

    <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_main" 
     app:menu="@menu/activity_main_drawer" />  
</android.support.v4.widget.DrawerLayout> 

Kod w działaniu:

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 

    @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.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 

     getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, new FragmentWithTabs()).commit(); 
    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     if (id == R.id.fragment_1) { 
      getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, new FragmentWithTabs()).commit(); 
     } else if (id == R.id.fragment_2) { 
      getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, new FragmentWithoutTabs()).commit(); 
     } else if (id == R.id.fragment_3) { 
      getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, new Fragment()).commit(); 
     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 
} 

, tj., Jak widzimy, zastępuję fragmenty w FrameLayout o identyfikatorze fragmentContainer.

wszelkiej logice związanej z fragmentem z zakładek, incapsulated w FragmentWithTabs:

public class FragmentWithTabs extends Fragment { 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_with_tabs, container, false); 
     ViewPager viewPager = (ViewPager)rootView.findViewById(R.id.viewPager); 
     TabLayout tabLayout = (TabLayout)rootView.findViewById(R.id.tabLayout); 

     viewPager.setAdapter(new FragmentPagerAdapter(getChildFragmentManager()) { 
      @Override 
      public Fragment getItem(int position) { 
       return new SubFragment(position == 0? Color.BLUE : position == 1? Color.WHITE : Color.RED); 
      } 

      @Override 
      public CharSequence getPageTitle(int position) { 
       return position+""; 
      } 

      @Override 
      public int getCount() { 
       return 3; 
      } 
     }); 

     tabLayout.setupWithViewPager(viewPager); 
     return rootView; 
    } 
} 

Mam nadzieję, że to pomaga

+0

śledzę takie samo podejście, jak dobrze, ale jest jedna wada że ja również poszukuje naprawić. Idealnie 'Toolbar' i' TabLayout' powinny mieć ten sam kolor, ale używając powyższego podejścia będzie cień pomiędzy 'TabLayout' i' Toolbar' który nie jest idealny. – Sharj