2015-08-26 5 views
17

के साथ नेविगेशन व्यू का उपयोग करना, इसलिए मैं हाल ही में नई सामग्री डिज़ाइन समर्थन लाइब्रेरी का उपयोग करने के लिए अपने ऐप को अपडेट करने पर काम कर रहा हूं। मेरे एप्लिकेशन में एक drawerLayout और नेविगेशन व्यू के साथ एक मुख्य गतिविधि है। ऐप की मुख्य सामग्री टुकड़ों के माध्यम से, फ्रेमआउट में दिखाया गया है। हालांकि, अब मैं नेविगेशन ड्रॉवर के टुकड़ों में से एक में भौतिक टैब जोड़ने की कोशिश कर रहा हूं। हालांकि, मुझे यकीन नहीं है कि एनवी ड्रॉवर फ़ंक्शनिंग में मेरे टुकड़े रखने के दौरान इसे कैसे कार्यान्वित किया जाए। मैं क्या हासिल करने की कोशिश कर रहा हूँ का एक अच्छा उदाहरण नीचे दिखाया गया है:टैबलेआउट

enter image description here

इस एप्लिकेशन में (गूगल संगीत खेलने), केवल नेविगेशन ड्रॉर के आइटम में से कुछ टैब हैं, जबकि दूसरों को नहीं। तो मेरा सवाल यह है कि, मैं इसे कैसे कार्यान्वित करूं? (कोड की तलाश नहीं है, बस कैसे मेरे लेआउट आयोजित किया जाना चाहिए का अवलोकन)

सारांश यह है/स्पष्ट करने के लिए: मैं (मेरे ऐप की सामग्री के लिए) एक frameLayout के साथ एक मुख्य लेआउट है, और एक navigationView (नेविगेट करने के लिए विभिन्न आइटम टुकड़े)। मेरे पास एक श्रोता है जो मुख्य लेआउट के फ्रेमआउट को आइटम के संबंधित खंड के साथ बदल देता है। अब, मुझे इन टुकड़ों में से किसी एक को टैब जोड़ने की आवश्यकता है (4 अन्य टुकड़ों के बीच नेविगेट करने के लिए)। मैं एक टूलबार का भी उपयोग कर रहा हूं जिसमें मैं एक अलग लेआउट के रूप में शामिल हूं।

किसी भी सलाह की सराहना की जाती है। मुझे खेद है कि मेरा विवरण थोड़ा उलझन में है; मैं किसी भी आवश्यक विवरण को स्पष्ट कर दूंगा।

उत्तर

3

मैं यियो ने सुझाव दिया कि मैं अनुशंसा नहीं कर सकता। यदि आप अलग-अलग लेआउट के साथ टुकड़े करने जा रहे हैं, तो आपको टुकड़ों को एक्सएमएल में इन लेआउट को कस्टमाइज़ करना चाहिए। यही कारण है कि टूलबार की शुरूआत ने एंड्रॉइड विकास के लिए बहुत अधिक समझदारी की। भविष्य में, आपके पास प्रत्येक फ्रेगमेंट के बीच भिन्नताएं भी हो सकती हैं। उनमें से कुछ टूलबार नहीं चाहते हैं, उनमें से कुछ को टूलबार के ऊपर एक और दृश्य की आवश्यकता हो सकती है, उनमें से कुछ को रीसाइक्लर व्यू होगा कि आप कोऑर्डिनेटरलाउट और ऐपबार में पहुंच योग्य होना चाहते हैं ताकि स्क्रॉलिंग व्यवहार ठीक से काम कर सके।

मैं आपको केवल अपने फ्रेमवेआउट की सामग्री के रूप में फ़्रेमलाउट डालने की सलाह देता हूं (जैसा कि यियो बिंदु 1 में उल्लिखित है)। यहां आप नेविगेशन व्यू के कॉलबैक से प्रत्येक टुकड़ा लोड करेंगे।

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

प्रत्येक फ्रैगमेंट के एक्सएमएल में, यदि आप उस टुकड़े, टूलबार द्वारा आवश्यक हो तो रखेंगे। आपके टैब्ड फ्रैगमेंट के एक्सएमएल में आप टैबलाउट डाल देंगे, और यदि आप चाहें तो कोऑर्डिनेटरलाउट और ऐपबारलाउट। प्रत्येक टुकड़ा एक टूलबार है से, आप ActionBar के रूप में टूलबार स्थापित करेगा:

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

इसके लिए बस इतना है कि। बेशक आप प्रत्येक टुकड़े में खुद को दोहराना नहीं चाहते हैं, इसलिए, उदाहरण के लिए, आप इस कोड को ड्रॉवरफ्रैगमेंट में डाल सकते हैं और इसे टूलबार के साथ टुकड़ों के लिए उपclass कर सकते हैं। आप अपने टूलबार एक्सएमएल कॉन्फ़िगरेशन को एक फ़ाइल में भी रखना चाहते हैं और इसे फ्रैगमेंट के एक्सएमएल <include layout="@layout/toolbar" /> में शामिल करना चाहते हैं। या आप कुछ टुकड़ों से टूलबार को हटाना चाहते हैं, या इसके रंग, विषय इत्यादि को बदलना चाहते हैं।

+0

मुझे लगता है कि टूलबार सभी मामलों में मौजूद होना चाहिए, हमें केवल 0 नेविगेशनव्यू आइटम के लिए tablayout जोड़ने की आवश्यकता है – Jey10

+0

@ जेई 10 यह अच्छा है। आपको अभी भी फ़ैगमेंट में टूलबार शामिल करना चाहिए, गतिविधि में नहीं। न केवल आपको अधिक लचीलापन देगा, लेकिन यह आपको आसानी से समन्वय के अंदर RecyclerViews के साथ काम करने के लिए CoordinatorLayout प्राप्त करने की अनुमति देगा। – sorianiv

6

ठीक है मान लीजिए कि आपके नेविगेशन व्यू में दो विकल्प हैं, पहला टैब टैब (टैब लेआउट) के साथ टुकड़ा प्रदर्शित करता है और दूसरा टूलबार के साथ केवल एक टुकड़ा प्रदर्शित करता है। -> एप्लिकेशन बार -> उपकरण पट्टी

  1. तुम सिर्फ एक फ्रेम लेआउट के साथ एक मुख्य लेआउट है और सभी के साथ बदलना आप क्या चाहते हैं
  2. आप समन्वयक लेआउट के साथ एक मुख्य लेआउट हो सकता है कर सकते हैं: आपके पास दो विकल्प तो है -> टैब लेआउट और एक फ्रेम लेआउट सामग्री

डाल करने के लिए मैं हमेशा उपकरण पट्टी कॉन्फ़िगर करने के लिए होने से बचने के लिए दूसरा विकल्प पसंद करते हैं तो यह है कि मैं क्या एक बार किया था है:

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

एक क्या आप देखते हैं कि मैं टैबलाउट की दृश्यता को "चला गया" में बदलता हूं ताकि टैब के साथ टुकड़े दिखाई देने के लिए सावधानी बरतें। टुकड़ा के साथ टैब सिर्फ लेआउट में ViewPager है:

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

अब टैब के साथ टुकड़ा प्रत्येक पृष्ठ के लिए टुकड़े के साथ ViewPager प्रारंभ:

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

और अंत में कर जो कुछ भी आप चाहते हैं कि आपके में TabFragments, यह मेरे लिए ठीक काम करता है और मुझे आशा है कि यह आपके लिए भी उपयोगी होगा। कोड सिंटैक्स के साथ कुछ समस्या के लिए खेद है, मैं कोटलिन के साथ एंड्रॉइड विकसित करता हूं, जावा के साथ नहीं।

+0

आप कैसे मैं एडाप्टर कोड हैं उस पर विस्तृत कर सकते हैं? मैंने एक कस्टम एडेप्टर बनाने की कोशिश की और इसे दिखाते हुए इसे लिंक किया लेकिन चीजें काम नहीं कर रही हैं। – Markoe7

+0

@Steve मैं आपको अपने प्रोजेक्ट में बनाए गए एडाप्टर को दिखा सकता हूं, यह कोटलिन में लिखा गया है लेकिन https://github.com/yiyocx/GitlabAndroid/blob/master/app/src/main/kotlin/ को समझना आसान है। yiyo/gitlabandroid/ui/adapters/ProjectsAdapter.kt –

+0

जिज्ञासा से बाहर, आप जावा के बजाय कोटलिन में क्यों विकसित होते हैं? – Markoe7

2

आप इसे ऐसा कर सकते हैं। मैं इसे अपने आप कर रही द्वारा जाँच की है और यह बहुत अच्छी तरह से काम करता है

चरण 1: इस

<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 की तरह अपने मुख्य गतिविधि के लेआउट बनाएं:

में अपने गतिविधि जो आपको अपने व्यूपेजर पर onpagechangelistener सेट करने की आवश्यकता है:

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

    } 
}); 

इसके बाद आपको viewPager.addOnPageChangeListener (नया TabLayout.TabLayoutOnPageChangeListener (टैबलाउट)) जोड़ने की आवश्यकता है;

चरण 3:

इस तरह आप viewpager के लिए अपने एडाप्टर कर सकते हैं:

सार्वजनिक वर्ग WiFiPagerAdapter फैली FragmentPagerAdapter { निजी अंतिम सूची registeredFragments = नए 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(); 
    } 
} 

}

संबंधित मुद्दे