टूलबार के ऊपर ActionMode प्रदर्शित करें


87

मैं पारंपरिक के अलावा, android.view.ActionModeनए के साथ उपयोग करने की कोशिश कर रहा हूं । मैं इसे प्रदर्शित करने में सक्षम हूं:android.support.v7.widget.Toolbarandroid.app.ActionBar

toolbar.startActionMode(callback);

समस्या यह है कि ActionModeइसे प्रदर्शित किया जाता है ActionBar, और इससे अधिक नहीं Toolbar। क्या इसे बदलने का कोई तरीका है?

मैंने अपनी थीम में निम्नलिखित सेट करने का प्रयास किया, लेकिन यह कुछ भी बदलने के लिए प्रतीत नहीं होता है:

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

1
मुझे लगता है कि ActionMode ActionBar का हिस्सा है और आप इसकी स्थिति नहीं बदल सकते हैं
SpyZip

यह बहुत बुरा है। जवाब के लिए धन्यवाद
Gaätan

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

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

जवाबों:


82

चूँकि आप इसका उपयोग कर रहे हैं Toolbar, मैं यह भी मानता हूँ कि आप इसका उपयोग कर रहे हैं AppCompatActivityऔर ActionBarआपके द्वारा Toolbarउपयोग किए गए कस्टम के साथ बिल्ट को बदल दिया हैsetSupportActionBar(toolbar);

सबसे पहले सुनिश्चित करें कि आप सही नाम स्थान का आयात कर रहे हैं:

import androidx.appcompat.view.ActionMode;
// Or
import android.support.v7.view.ActionMode;

और नहीं

import android.view.ActionMode;

तो उपयोग करें

_actionMode = startSupportActionMode(this);

और नहीं

_actionMode = startActionMode(this);

35
इस प्लस ने windowActionModeOverlayमेरे लिए काम किया।
जाइमक्स

4
मैं वर्तमान में उपयोग कर रहा हूं AppCompatActivityऔर जोड़ना windowActionModeOverlay मेरे लिए पर्याप्त था। मैंने आयात का उपयोग करने की कोशिश की, android.support.v7.view.ActionModeलेकिन इसके साथ काम नहीं किया MultiChoiceModeListener, इसलिए मैंने android.view.ActionModeइसके बजाय उपयोग करना समाप्त कर दिया। क्या आपको पता है कि इसका समर्थन संस्करण है MultiChoiceModeListener? धन्यवाद
एक्सल

क्या MultiChoiceModeListener का समर्थन संस्करण है?
गैलक्सीगर्ल

@galaxigirl, ऐसा नहीं लगता है कि वहाँ है। आपको अपने एडॉप्टर में क्लिक इवेंट्स को हैंडल करना है और धारक को देखना है
peterchaula

67

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

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

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

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

आपके विषय में आंद्रे द्वारा कहा गया है।


1
यह मेरे लिए काम कर गया, क्योंकि मुझे भी एक विशेष आवश्यकता थी। लागू करने के बजाय ActionMode.Callback, मैं लागू करना चाहता था MultiChoiceModeListener। समर्थन ActionModeका उपयोग करने में समस्या यह है कि इसमें समर्थन संस्करण नहीं दिखता है MultiChoiceModeListener
jwir3

43

इसे अपने विषय में आज़माएँ:

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

जैसा कि मेरे प्रश्न में कहा गया है, मैंने पहले ही सफलता के बिना यह कोशिश की। लेकिन आपका शुक्रिया!
Gaantan

क्षमा करें, मुझे नहीं पता था कि आप पहले से ही कोशिश कर चुके हैं। क्या आप सुनिश्चित हैं कि यह काम नहीं करता है? इससे मेरा काम बनता है।
एंड्रे रेस्टिवो

मुझे भी यही समस्या थी और यह इसे ठीक करता है। धन्यवाद!
मार्था रोड्रिग्ज

2
मैंने android:उपसर्ग के साथ और उसके बिना प्रयास किया , और इसे अपने एप्लिकेशन थीम में डाल दिया। ActionModeओवरले ActionBar, लेकिन मैं अपने से अधिक यह चाहते Toolbarहै, जो नीचे है ActionBar
गातन

@ Gaëtan क्या आपको इसके लिए जवाब मिला? मेरे पास एक ही समस्या है और मैं गतिविधि का विस्तार कर रहा हूं न कि AppCompatActivity का क्योंकि मेरा ऐप एपीआई 21 और उससे ऊपर का समर्थन करता है।
SjDev

15

मुझे लगता है कि एक बात जो लोग स्पष्ट नहीं कर रहे हैं वह है रेखा

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

बेस थीम यानी AppTheme और AppTheme.NoActionBar में नहीं रखा गया है

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionModeOverlay">true</item>
</style>

<style name="transparent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
</style>


<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />


यह एकमात्र बदलाव था जिसकी मुझे जरूरत थी। धन्यवाद!
पीएनडीए

5

अपना AndroidManifest.xml खोजें, अगला अपने एप्लिकेशन या गतिविधि थीम में नीचे कोड जोड़ें

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

बिल्कुल वैसा ही:

<style name="WorkTimeListTheme" parent="AppTheme.NoActionBar">
        <item name="windowActionModeOverlay">true</item>
        <item name="actionModeBackground">@color/theme_primary</item>
    </style>

1

यह मेरे द्वारा बनाया गया समाधान है।

ActionMode.Callback के मेरे onCreateActionMode विधि में , मैं इसे जोड़ता हूं:

StandaloneActionMode standaloneActionMode = (StandaloneActionMode) actionMode;
Field mContextView;
try {
     mContextView = StandaloneActionMode.class.getDeclaredField("mContextView");
     mContextView.setAccessible(true);
     View contextView = (View) mContextView.get(standaloneActionMode);
     MarginLayoutParams params = (MarginLayoutParams) contextView.getLayoutParams();
     params.topMargin = mToolbar.getTop();
  } catch (NoSuchFieldException e) {
            e.printStackTrace();
  } catch (IllegalAccessException e) {
            e.printStackTrace();
  } catch (IllegalArgumentException e) {
            e.printStackTrace();
  }

इससे मेरा काम बनता है।


1

मैंने ऊपर दिए गए सभी तरीकों की कोशिश की है, लेकिन यह अभी भी काम नहीं करता है। और फिर, मैंने नीचे दी गई विधि की कोशिश की:

    private class ActionModeCallback implements ActionMode.Callback {
    @Override
    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        actionMode.getMenuInflater().inflate(R.menu.note_find_action, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
        ((AppCompatActivity) getActivity()).getSupportActionBar().hide();
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode) {
        ((AppCompatActivity) getActivity()).getSupportActionBar().show();
    }
}

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

अभी हाल ही में, मैंने पाया है कि मैंने अपने ऐप के कई थीम को सक्षम करने के लिए रंगीन फ्रेम का उपयोग किया है, इससे थीम कोड में बदल जाएगी। जब मैंने इस ढांचे में शैली को संशोधित करने की कोशिश की, तो यह काम करता है।

मुझे भरोसा है ये काम करेगा।


यह केवल एक चीज है जो मेरे लिए काम करती है। बहुत बहुत धन्यवाद।
राचिट

0

यदि आप व्यू ट्री देखते हैं, तो आप नीचे कोड लिख सकते हैं:

 ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
    traverseView(decorView);
 /**
 * traverse find actionmodebar
 * @param root  view
 */
public void traverseView(View root) {
    if (root==null){
        return;
    }
    if (root instanceof ActionBarContextView){
        root.setVisibility(View.GONE);
        return;
    }
    if ((root instanceof ViewGroup)) { // If view is ViewGroup, apply this method on it's child views
        ViewGroup viewGroup = (ViewGroup) root;
        for (int i = 0; i < viewGroup.getChildCount(); ++i) {
            traverseView(viewGroup.getChildAt(i));
        }
    }
}

0

इसलिए, इस सूत्र को पूरा करने के दिनों के बाद, मैंने आखिरकार यह काम कर लिया। मैंने जो किया उसे संक्षेप में बताना चाहूंगा।

नोट: यह Toolbarडिफ़ॉल्ट ActionBarमें बदलने के लिए एक का उपयोग कर समाधान है AppCompatActivity

  1. मैंने इस लाइन को अपने साथ जोड़ा AppTheme: यह android को बताता है कि आप टूलबार को ओवरले करने के लिए अपना एक्शन मोड चाहते हैं
<item name="windowActionModeOverlay">true</item>
  1. सही आयात का उपयोग करें:

इसके साथ काम करने के लिए आपको इन आयातों का उपयोग करना होगा AppCompatActivity:

import androidx.appcompat.view.ActionMode;
// or
import android.support.v7.view.ActionMode;
  1. अपनी गतिविधि पर ActionMode को इस तरह शुरू करें:
actionMode = startSupportActionMode(callback);

और ऐसा नहीं है:

actionMode = startActionMode(callback);

आप गतिविधि स्वचालित रूप से टूलबार पर ActionMode बनाता है, क्योंकि यह supportActionToolbar के रूप में सेट है। शैली ओवरले के रूप में dsiplaying को संभालती है।

@Kuffs और @Lefty का शुक्रिया।

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