समन्वय या गतिविधि में टूलबार के साथ समन्वयक लेआउट


94

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

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


1
नमस्ते, क्या आपको कोई हल मिला?
SERG

2
अपनी वर्तमान परियोजना के लिए मैंने गतिविधि में टूलबार के साथ चिपके रहने और आवश्यकता पड़ने पर उचित एनिमेशन करने का निर्णय लिया है। लेकिन यह थोड़ा जटिल है। मैंने प्रत्येक टुकड़े में टूलबार का उपयोग करने की कोशिश की और यह ठीक काम करता है, लेकिन टुकड़ा संक्रमणों के बीच टूलबार को एनिमेट करना अधिक कठिन है और मुझे यह भी नहीं पता कि क्या यह संभव है क्योंकि मेरे पास टुकड़ा संक्रमण एनिमेशन के साथ बहुत अनुभव नहीं है।
मोबाइल पोटेटो

किसी भी अद्यतन या इस के लिए बेहतर समाधान अब?
सागर नायक

जवाबों:


56

मेरे लिए जैसा कि प्रत्येक टुकड़े में ऐपबार और टूलबार होना बहुत अजीब लगता है। इसलिए मैंने गतिविधि में टूलबार के साथ एकल ऐपबार चुना है।

समन्वयक के साथ उस समस्या को हल करने के लिए, आपको अपने FrameLayout(या किसी भी अन्य लेआउट) के अलग-अलग व्यवहार को सेट करना होगा, जो कि प्रत्येक उस टुकड़े से टुकड़े को पकड़ना चाहिए जिसे आप डिफ़ॉल्ट व्यवहार को ओवरराइड करना चाहते हैं।

मान लेते हैं, कि आपका डिफ़ॉल्ट व्यवहार है app:layout_behavior="@string/appbar_scrolling_view_behavior"

तब आपके खंड_नियंत्रण_लेआउट.xml में आपके पास कुछ ऐसा हो सकता है:

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/dashboard_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.Toolbar"
            app:layout_scrollFlags="scroll|enterAlways"/>
    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/dashboard_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>

और प्रत्येक टुकड़े में आप इसे लागू नहीं करने की इच्छा app:layout_behavior="@string/appbar_scrolling_view_behavior"रखते हैं onAttachऔर आपको उन onDetachतरीकों और तरीकों को अपनाना होगा जो आपके व्यवहार को बदल देंगे FrameLayout:

CoordinatorLayout.Behavior behavior;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if(behavior != null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    behavior = params.getBehavior();
    params.setBehavior(null);

}

@Override
public void onDetach() {
    super.onDetach();
    if(behavior == null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    params.setBehavior(behavior);

    layout.setLayoutParams(params);

    behavior = null;
}

उसके बाद CoordinatorLayout ऐपबार इत्यादि को ध्वस्त नहीं करेगा, और खंड लेआउट को पूर्ण-ऊँचाई पर ले जाने की अनुमति देगा।


एक अच्छा, यह कोशिश करनी होगी और देखना होगा कि क्या यह चीजों को सरल करता है। धन्यवाद।
mobilepotato7

अगर आपको कुछ सरल लगता है - मुझे बताएं। मुझे लगता है कि टुकड़ों के जीवन चक्र के दौरान किसी भी समय समन्वयक व्यवहार को बदलना संभव है (उदाहरण के लिए आपके पास आमतौर पर कुछ सामान के साथ एक पुनर्नवीनीकरण है लेकिन दुर्लभ मामलों में यह खाली हो सकता है और आपको पता चल जाएगा कि लोडर के बाद ही onLoadFinished, यह संभव है यह दर्शाता है कि छवि को यह दर्शाने के लिए कि यहाँ कुछ भी नहीं है, इनबॉक्स ऐप की तरह ही), लेकिन मैंने अभी तक कोशिश नहीं की। शायद आज बाद में।
Клаус арварц

ठीक है, यह बहुत अच्छा काम करता है। मैंने एक सहायक को cr8ted किया है जो उपयुक्त होने पर समन्वयक को सक्षम / अक्षम करने के लिए ध्यान रखता है, इसलिए मैं सिर्फ टुकड़ों से enableCoordinator(Activity activity)/ कॉल करता हूं disableCoordinator(Activity activity)
Клаус арварц

आपका सहायक, @ Клаус yourварц कहां है? आप इसे कब कहते हैं?
संथागो

1
@ मेसेंथियागो फ्रैगमेंट में
Клаус цварц

8

यहाँ मेरा समाधान है

<!-- Put your fragment inside a Framelayout and set the behavior for this FrameLayout -->
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <!-- Your fragment -->
    <include layout="@layout/content_main" />

</FrameLayout>

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

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


1

यह वास्तव में अच्छा सवाल है: क्या Toolbarऐसा ActionBarहोना चाहिए जो एक Activityया एक में रखे जाने की तरह कार्य करने की आवश्यकता है Fragment? विभिन्न प्रश्नों और दस्तावेज़ीकरण के आसपास खोज करने के बाद, मुझे ऐसा समाधान नहीं मिला जो सभी मामलों को कवर करता हो। इसलिए यह वास्तव में जाने के लिए आपकी स्थिति पर निर्भर करता है।

केस 1: टूलबार एक्शनबार रिप्लेसमेंट होना चाहिए

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

Fragments से ActionBar (-behaviour) को बदलना भी संभव है, लेकिन मैं इसकी सिफारिश नहीं करूंगा, क्योंकि यह आपको ट्रैक रखने के लिए मजबूर करता है कि Fragment ने कब ActionBar को बदल दिया। मुझे यह भी पता नहीं है कि एक्शनबार को कई बार सेट किया जा सकता है या नहीं।

केस 2: प्रत्येक फ्रैगमेंट का अपना (टूलबार का हिस्सा) होना चाहिए

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

मुझे उम्मीद है कि यह एक विकल्प बनाने में मदद करेगा।

(क्षमा करें अगर मैंने कोई भी (भाषा-) गलतियाँ की हैं)


4
क्षमा करें, लेकिन यह वास्तव में नई डिज़ाइन लाइब्रेरी के सापेक्ष समस्याओं का जवाब नहीं देता है। टूलबार को एक्शनबार के रूप में सुनिश्चित करना उद्देश्य है, लेकिन विभिन्न प्रकार के टूलबार के लिए कई समन्वयक लेआउट होना मुश्किल हो सकता है। मैंने जो पाया वह यह है कि टूलबार को आवश्यकतानुसार चेतन करना संभव है। मुझे अभी भी इसे बेहतर परीक्षण करने की आवश्यकता है लेकिन ऐसा लगता है कि अच्छे परिणाम हैं
mobilepotato7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.