2015-08-26 10 views
17

Bu nedenle, yeni malzeme tasarım destek kitaplığını kullanmak için uygulamanızı güncellemeye çalışıyorum. Uygulamamın drawerLayout ve navigation view ile bir ana etkinliği var. Uygulamanın ana içeriği, fragmanlar aracılığıyla bir frameLayout'ta gösterilir. Ancak, şimdi gezinme çekmecesinin parçalarından birine malzeme sekmeleri eklemeyi deniyorum. Ancak, fragmanları nav çekmecesinde çalışırken, bunu nasıl uygulayacağımı bilmiyorum. Ben başarmak ne çalışıyorum iyi bir örnek aşağıda gösterilmiştir: Bu uygulamadaGezinmeyi kullanmaKonumlu görünümLinkoutLayout

enter image description here

(Google müzik çalmak), sadece navigasyon çekmece en öğelerden bazıları sekmeler de diğerleri yapmadığı halde. Yani sorum şu, bunu nasıl uygularım? gezinmek için ( I (Uygulamamın içerik için) bir frameLayout bir ana düzen var ve navigationView:

açıklık/Özetlemek gerekirse (kod benim düzen organize edilmelidir nasıl sadece bir bakış görünümlü değil) farklı madde parçaları). Daha sonra, ana düzenin frameLayout öğesinin ilgili parçasını değiştiren bir dinleyici var. Şimdi, bu parçalardan sadece birine sekme eklemem gerekiyor (4 diğer parça arasında gezinmek için). Ayrı bir düzen olarak dahil ettiğim araç çubuğunu da kullanıyorum.

Herhangi bir tavsiye memnuniyetle karşılanır. Açıklamalarım biraz kafa karıştırıcıysa özür dilerim; Gerekli detayları açıklayacağım.

cevap

3

Yiyo'nun önerdiği şeyi öneremem. Farklı düzenlere sahip Fragmanlar alacaksanız, Fragments'ın bu düzenleri XML'de özelleştirmesine izin vermelisiniz. Bu nedenle Araç Çubuğunun tanıtımı Android geliştirme için çok anlamlıydı. Gelecekte, her Fragman arasında farklılık gösteren daha fazla gereksiniminiz olabilir. Bazıları bir Araç Çubuğu istemeyebilir, bazıları Araç Çubuğunun üzerinde başka bir Görünüme ihtiyaç duyabilir. Bazılarının, kaydırma davranışının gerektiği gibi çalışmasını sağlamak için Koordinator Düzenleme ve Uygulama Çubuğu'na erişilmesini istediğiniz bir Geri Dönüşüm Görüntülemesi olacaktır.

DrawerLayout öğesinin içeriği olarak yalnızca bir FrameLayout koymanızı öneririz (1'de belirtilen Yiyo olarak). Burada her Fragmanı Navigasyon Görünümü'nün geri bildirimlerinden yükleyeceksiniz.

<android.support.v4.widget.DrawerLayout 
    ... 
    android:fitsSystemWindows="true" 
    > 

    <FrameLayout 
     android:id="@+id/drawer_content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

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

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

Her Parçanın XML'sinde, bu Parçanın gerektirdiği takdirde, bir Araç Çubuğu yerleştirilir. Sekmeli Parçanın XML'inde, TabLayout'u ve eğer isterseniz, KoordinatörLayout ve AppBarLayout'u koyacaksınız. Bir araç çubuğu olan her Fragment itibaren, İşlem Çubuğu olarak araç çubuğunu ayarlayacaktır: ona orada hepsi

Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); 
AppCompatActivity activity = (AppCompatActivity) getActivity(); 
activity.setSupportActionBar(toolbar); 

. Elbette kendinizi her Fragman içinde tekrarlamak istemezsiniz, bu nedenle, örneğin bu kodu bir DrawerFragment'e yerleştirebilir ve bir Araç Çubuğu ile parçalara ayırabilirsiniz. Ayrıca, Araç Çubuğu XML yapılandırmanızı tek bir dosyaya koymak ve Fragment'ın XML <include layout="@layout/toolbar" /> içerisine dahil etmek isteyeceksiniz. Veya Araç Çubuğunu bazı parçalardan çıkarmak veya rengini, temasını vb. Değiştirmek isteyebilirsiniz.

+0

Araç çubuğunun her durumda bulunması gerektiğini düşünüyorum, sadece 1 gezinti görünümü öğesi için sekme eklememiz gerekiyor – Jey10

+0

@ Jey10 Bu iyi. Etkinlikte değil, Araç Çubuğunu Fragmana eklemelisiniz. Bu size sadece daha fazla esneklik kazandırmakla kalmayacak, aynı zamanda CoordinatorLayout'u Fragmanlar İçindeki RecyclerViews ile çalışmasını kolaylaştıracaktır. – sorianiv

6

Navigasyon Görünümünüzün iki seçeneği olduğunu, birincisi parçayı sekmelerle (sekme düzeni) görüntülediğini ve ikincisinin de yalnızca bir araç çubuğuna sahip bir parçayı görüntülediğini varsayalım. -> uygulama çubuğu -> araç çubuğu

  1. Sen sadece bir çerçeve düzeni olan bir ana düzen var ve
  2. Sen koordinatörü düzeniyle bir ana düzen olabilir istediğini tüm değiştirebilirsiniz: Daha sonra iki seçenek vardır -> sekmesi düzeni ve bir çerçeve düzeni yüzden bu keresinde ne yaptığını hep araç çubuğunu yapılandırmak zorunda kalmamak için ikinci seçeneği tercih içeriği silme

koymak:

<!-- layout_main --> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <android.support.design.widget.CoordinatorLayout 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     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:background="?attr/colorPrimary" 
       app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
       app:layout_scrollFlags="scroll|enterAlways"/> 

      <android.support.design.widget.TabLayout 
       android:id="@+id/tab_layout" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:visibility="gone" 
       app:tabGravity="fill" 
       app:tabMode="fixed" /> 

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

     <FrameLayout 
      android:id="@+id/main_content" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

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

    <!-- The NavigationView --> 
    <fragment 
     android:id="@+id/navigation_fragment" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:name="some.path.to.the.NavigationViewFragment" 
     tools:layout="@layout/fragment_navigation_view" /> 

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

A Görüyorsunuz ki TabLayout'un görünebilirliğini "gitti" olarak değiştirdim, böylece sekmeli fragman görünür hale getirmeye dikkat ediyor. Fragment sekmeleri sadece Layout'ta ViewPager sahip olan:

<!-- fragment_with_tabs --> 
<android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/view_pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

Şimdi sekmeleri ile parça her sayfa için parçalarıyla ViewPager başlatmak:

@Override 
public onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    // The getChildFragmentManager() is Very important! Because fragments inside fragments are 
    // not supported with the tipical fragmentManager, it requires NestedFragments and those 
    // uses a childFragmentManager(). In other case a strange behaviour occurs 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager()); 
    adapter.addFragment(new TabOneFragment(), "Tab 1"); 
    adapter.addFragment(new TabTwoFragment(), "Tab 2"); 
    viewPager.setAdapter(adapter); 

    tabLayout = (TabLayout) getActivity().findViewById(R.id.tab_layout); 
    tabLayout.setVisibility(View.VISIBLE); 
    tabLayout.setupWithViewPager(viewPager); 
} 

Ve nihayet yapmak sen istersen senin TabFragments, bu benim için iyi çalışıyor ve umarım bu sizin için de yararlı olur. Kod sözdizimi ile ilgili bir sorun için özür dilerim, Java ile değil, Kotlin ile android geliştiriyorum.

+0

ben adaptörü nasıl kodlayacağınıza detaylandırabileceğiniz? Özel bir bağdaştırıcı oluşturmayı ve gösterdiğiniz gibi bağlamayı denedim ama işler çalışmıyor gibi görünüyor. – Markoe7

+0

@Steve Size Projemde yaptığım Bağdaştırıcıyı gösterebilirim, Kotlin'de yazılmıştır fakat anlaşılması kolaydır https://github.com/yiyocx/GitlabAndroid/blob/master/app/src/main/kotlin/ yiyo/gitlabandroid/ui/adaptörler/ProjectsAdapter.kt –

+0

sadece meraktan dolayı, java yerine kotlin'de neden gelişiyorsunuz? – Markoe7

2

Bunu böyle yapabilirsiniz. Kendim yaparak kontrol ve çok iyi çalışıyor olması

1. Adım: Bu

<android.support.design.widget.AppBarLayout 
     android:id="@+id/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="wrap_content" android:background="@color/blue" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
      android:titleTextAppearance="@style/TextAppearance.AppCompat.Small" 
      app:layout_scrollFlags="scroll|enterAlways" /> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tab_layout" style="@style/FreeWiFiTabLayout" 
      android:layout_width="match_parent" android:layout_height="wrap_content" 
      android:layout_gravity="center" android:background="@color/blue" 
      android:visibility="gone" android:fitsSystemWindows="true" 
      android:minHeight="?attr/actionBarSize" /> 
    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/wifi_type_pager" android:layout_width="match_parent" 
     android:layout_height="match_parent" android:clipToPadding="false" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 
</android.support.design.widget.CoordinatorLayout> 
<fragment android:id="@+id/navigation_drawer" 
    android:name="com.easyway.freewifi.NavigationDrawerFragment" 
    android:layout_width="wrap_content" android:layout_height="match_parent" 
    android:layout_gravity="start|bottom" android:layout_marginTop="?attr/actionBarSize" 
    tools:layout="@layout/navigation_drawer_fragment" /> 

2. Adımda gibi ana aktivitenin bir düzen oluşturun: In

senin görüntüleyicinizde onpagechangelistener ayarlamak için gereken aktivite:

viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageSelected(int position) { 
     if(position ==0){ 
      tabLayout.setVisibility(View.GONE); 
     }else{ 
      tabLayout.setVisibility(View.VISIBLE); 
     } 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 

    } 
}); 

Bundan sonra viewPager.addOnPageChangeListener (yeni TabLayout.TabLayoutOnPageChangeListener (tabLayout)) eklemeniz gerekir;

Adım 3:

Bu viewpager için adaptör yapabilirsiniz nasıl:

public class WiFiPagerAdapter FragmentPagerAdapter genişletir { özel nihai Liste registeredFragments = new ArrayList <>();

public WiFiPagerAdapter(final FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(final int pos) { 
    Fragment fragment; 
    fragment = WiFiFragment.newInstance(pos); 
    registeredFragments.add(pos, fragment); 
    return fragment; 
} 

@Override 
public int getCount() { 
    return tabLayout.getTabCount(); 
} 

public List<Fragment> getRegisteredFragmentsList() { 
    return registeredFragments; 
} 

@Nullable 
public Fragment getRegisteredFragment(final int position) { 
    final Fragment wr = registeredFragments.get(position); 
    if (wr != null) { 
    return wr; 
    } else { 
    return null; 
    } 
} 

@Override 
public void notifyDataSetChanged() { 
    super.notifyDataSetChanged(); 
    for (int i = 0; i < registeredFragments.size(); i++) { 
    WiFiFragment wiFiFragment = ((WiFiFragment) registeredFragments.get(i)); 
    wiFiFragment.setWiFiFragmentRecyclerViewAdapter(); 
    } 
} 

}

İlgili konular