AppCompat-v7 के साथ टूलबार और प्रासंगिक ActionBar


182

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

इसलिए, अनिवार्य रूप से, मैंने इसे इस तरह स्थापित किया। मेरे पास एक xml फ़ाइल में टूलबार परिभाषित है जिसे मैं टैग के साथ उपयोग करता हूं:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"/>

फिर, मैं इसे अपने विचार में तुरंत लिखता हूं:

<LinearLayout
    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:orientation="vertical"
    android:id="@+id/root"
    tools:context=".MainActivity">

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

    <!-- Rest of view -->

    </LinearLayout>

कोड में, मैंने इसे इस तरह सेट किया:

    // On Create method of activity:
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

क्या किसी को पता है कि इसे कैसे बनाना है ताकि टूलबार से प्रासंगिक एक्शनबेर आ जाए?

टूलबार और प्रासंगिक एक्शनबार


आपकी गतिविधि किस विषय का उपयोग कर रही है?
अलानव

डेविड, मैंने अभी लिंक पर क्लिक किया है और यह मेरे लिए काम कर रहा है।
Ariets

जवाबों:


320

अपडेट करें:

समाधान: WindowActionModeOverlay प्रॉपर्टी का उपयोग करें । इसे अपनी थीम में सेट करें:

<item name="windowActionModeOverlay">true</item>

और एक्शन बार को धकेलने के बजाय एक्शन बार के ऊपर दिखाया जाएगा। (यदि आप नवीनतम AppCompat का उपयोग नहीं कर रहे हैं तो आपको संपत्ति में "android:" उपसर्ग जोड़ने की आवश्यकता है)। यह मूल रूप से AppCompat को यह बताता है कि आपके पास स्क्रीन के शीर्ष में स्थित एक टूलबार है और इसके शीर्ष पर ActionMode को आकर्षित करना चाहिए।


पुराना उत्तर / समाधान:

मैं एक समस्या मे फंस गया। कोई फर्क नहीं पड़ता कि मैं किस विषय को सेट करता हूं, यह हमेशा टूलबार I को एक्शनबार के रूप में सेट करता है। मैंने समर्थन पुस्तकालय के साथ और उसके बिना प्रयास किया, लेकिन इससे कोई फर्क नहीं पड़ा।

दुर्भाग्य से मैं इसे ठीक करने में सक्षम नहीं था इसलिए मैंने इसके बजाय वर्कअराउंड बनाया है। मेरे में ActionModeCallback'एस onCreateActionModeमैं कार्रवाई बार छिपाने:

actionBarToolbar.setVisibility(View.GONE);

और onDestroyActionModeमैं इसे फिर से दिखाता हूं:

actionBarToolbar.setVisibility(View.VISIBLE);

छिपाना / दिखाना इतनी जल्दी होता है कि यह मेरे परीक्षण उपकरणों पर ध्यान देने योग्य नहीं है। निश्चित रूप से एक नकारात्मक पक्ष है: यद्यपि प्रवेश-एनीमेशन अभी भी काम करता है, प्रासंगिक एक्शन बार का निकास-एनीमेशन खो जाता है क्योंकि टूलबार तुरंत उस पर पॉप हो जाता है। लेकिन जब तक हम एक बेहतर समाधान नहीं निकालते, मुझे लगता है कि हम इसके साथ फंस गए हैं।


(मेरी गतिविधि वास्तव में एक कस्टम प्रदान कर रहा है BaseActivityजो एक विधि कहा जाता है वर्ग getActionBarToolbar(), से लिया गूगल आई / ओ 2014 एप्लिकेशन स्रोत कोड , तो मैं आसानी से प्राप्त कर सकते हैं लाने टूलबार:

BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);

बहुत बुरा I / O ऐप प्रासंगिक कार्रवाई बार का उपयोग नहीं करता है।)


हाँ, यह एकमात्र समाधान था जो मैं भी आ सकता था। हालांकि, ऐसे मामले हैं जहां तेह संबंधपरक एक्शनबार सिस्टम से होता है (उदाहरण के लिए एक वेब व्यू में या एक एडिट टेक्स्ट के साथ)। जिनके लिए आपको कॉलबैक नहीं मिलता है। तो, आप इसके लिए इसे दिखाने / छिपाने के बारे में कैसे जाएंगे? (या मैं गलत हूं और आप वास्तव में उन लोगों के साथ सीएबी के लिए कॉलबैक प्राप्त कर सकते हैं)?
Ariets

1
हां, आप उसके जवाब में वर्णित अलेक्जेंडर की तरह TextView.setCustomSelectionActionModeCallback () कर सकते हैं ।
जैकब रास

1
ओह, पहले से ही मेरी टिप्पणी को अब अपडेट नहीं कर सकता। छोटा जोड़: ऐसा लगता है जैसे setCustomSelectionActionModeCallback का उपयोग लाइब्रेरी से ActionModeCallback के साथ नहीं किया जा सकता है। मैं इसे सेट करने के लिए एक VERSION.SDK_INT चेक का उपयोग कर रहा हूं। अभी भी परीक्षण करने की आवश्यकता है कि क्या समस्या पूर्व-हनीकॉम्ब उपकरणों पर भी होती है।
जैकब रास

@ariets कृपया मेरा अद्यतन उत्तर देखें। मैं उस संपत्ति को पूरी तरह से भूल जाने के लिए थोड़ा डंप महसूस करता हूं, लेकिन कम से कम अब हम वर्कअराउंड से छुटकारा पा सकते हैं ;-)
जैकब रास

1
मजेदार मैं नवीनतम (संकलन 'com.android.support:appcompat-v7:22.0.0') का उपयोग कर रहा हूं, लेकिन मुझे एंड्रॉइड को छोड़ना होगा: काम करने के लिए इसका हिस्सा ...
Warpzit

16

इसे अपनी गतिविधि पर नहीं, बल्कि अपने टूलबार पर शुरू करें। आप गतिविधि में:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)

और आपको उपयोग करना होगा

<item name="windowActionModeOverlay">true</item>

मेरे लिए यह android.support.v7.app.ActionBar के लिए करता है
फ्रैंक

मुझे यह त्रुटि मिलती है- ViewActionMode (android.view.ActionMode.Callback) दृश्य में (android.support.v7.view.ActionMode.Callback) पर लागू नहीं किया जा सकता है
Faheem

आह ठीक है। मेरा न्यूनतम संस्करण 11 से छोटा नहीं है। इसलिए मैं android.view.ActionMode का उपयोग कर सकता हूं। Android.support.v7.widget.Toolbar पर कॉलबैक, मैंने कभी भी android.support.v7.view.ActionMode.Callback का उपयोग नहीं किया।
फ्रैंक

यह ध्यान देने योग्य है AppCompatActivity.startSupportActionMode(callback), app:iconTintमेनू आइटम xmls जैसी विशेषताओं के साथ संगतता प्राप्त करने के लिए ।
गीकले

14

बस एक छोटा सा जोड़: के लिए

<item name="windowActionModeOverlay">true</item>
काम करने के लिए अपनी गतिविधि में कॉलिंग super.onCreate(savedInstanceState) से पहले कॉल करना महत्वपूर्ण है setContentView(R.layout.your_activity)। यह वास्तव में इस मामले में एक फर्क पड़ता है!


11

मेरे मामले में, <item name="windowActionModeOverlay">true</item>काम नहीं किया है, लेकिन इस काम: <item name="android:windowActionModeOverlay">true</item>, androidकुंजी है।


8
आप <item name="windowActionModeOverlay">true</item>एप्कोम्पैट टूलबार के साथ उपयोग करते हैं, अन्यथा आप androidनेमस्पेस का उपयोग करते हैं ।
जेवियर मेंडोंका

मेरे लेआउट में मेरे लिए कोई उपयोग नहीं है टूलबार जोड़ रहा हूँ, गतिविधि में टूलबार को सेट करें और सही सेट करें कृपया मेरी मदद करें
हर्षा

<आइटम का नाम = "windowActionModeOverlay"> सच </ आइटम> अपेक्षित के रूप में काम किया!
फ्रेंकोइस

8

जैकब के समाधान ने मेरे लिए काम किया लेकिन प्रासंगिक एक्शनबार पारदर्शी था और टूलबार इसके माध्यम से दिखाई देता था। इसे निम्नानुसार हल किया जा सकता है:

<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    ....
    ....
    <item name="actionModeStyle">@style/CustomActionMode</item>
</style>

<style name="CustomActionMode" parent="@style/Widget.AppCompat.ActionMode">
    <item name="background">@color/primary_material_light</item>
</style>

"AppTheme.Base" थीम को टूलबार पर लागू किया जाना चाहिए।

प्रासंगिक ActionBar स्टाइल के बारे में अधिक जानकारी:

कैसे सामग्री डिजाइन में appCompat का उपयोग कर प्रासंगिक कार्रवाई बार अनुकूलित करने के लिए


0

टूलबार को सामने लाने के लिए बहुत उपयोगी विधि toolbar.bringToFront()


2
View.bringToFront()बहुत भारी ऑपरेशन है और आम तौर पर किसी भी कीमत पर बचा जाना चाहिए।
डोमिनस

आप सही हैं, लेकिन स्क्रीन के ऊपर से नीचे तक एनीमेशन के लिए टूलबार को ओवरलैप करेंगे। इसलिए हमें toolbar.bringToFront () का उपयोग टूलबार के नीचे करने की आवश्यकता है। यदि आपके पास कोई वैकल्पिक तरीका है जिसे आप साझा कर सकते हैं
:)

0

एक और छोटा जोड़: setContentView(R.layout.empty_screen)यदि आप पूरे ui को टुकड़ों ( ft.replace(android.R.id.content, fragment)) में लोड करते हैं, तो गतिविधि में कम से कम एक खाली स्क्रीन सेट करना सुनिश्चित करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.