অ্যাকশনমোড ওভার টুলবার প্রদর্শন করুন


88

আমি প্রচলিত ছাড়াও android.view.ActionModeনতুনটির সাথে এটি ব্যবহার করার চেষ্টা করছি । আমি এটির সাথে এটি প্রদর্শন করতে সক্ষম:android.support.v7.widget.Toolbarandroid.app.ActionBar

toolbar.startActionMode(callback);

সমস্যাটি হ'ল ActionModeএটির উপরে প্রদর্শিত হয় এবং এটির উপরে ActionBarনয় Toolbar। যে পরিবর্তন করার কোন উপায় আছে?

আমি আমার থিমটিতে নিম্নলিখিতগুলি সেট করার চেষ্টা করেছি, তবে এতে কোনও পরিবর্তন হবে বলে মনে হচ্ছে না:

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

4
আমি মনে করি অ্যাকশনমোড অ্যাকশনবারের একটি অংশ এবং আপনি এর অবস্থানটি পরিবর্তন করতে পারবেন না
স্পাইজেপ

ওটা খুব খারাপ. উত্তরের জন্য ধন্যবাদ
গ্যাটান

4
আপনি কি টুলবারটি অ্যাকশনবার হিসাবে সেট করেছেন?
নিকোলা দেশপোটোস্কি

4
এখনও একই সমস্যা আছে, এই সম্পর্কে কোন আপডেট আছে? আমি একই অবস্থা পেয়েছি, ক্লাসিক অ্যাকশনবার হিসাবে একটি সরঞ্জামদণ্ড এবং নীচে দেখানো সামগ্রীগুলির শিরোনাম এবং বিকল্পমেনু হিসাবে একটি সরঞ্জামদণ্ড below এই সমস্যার মুখোমুখি, এবং অ্যাকশনমোডকে নিচে নামাতে সক্ষম নয়।
সিভি 2

উত্তর:


83

যেহেতু আপনি ব্যবহার করছেন 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? ধন্যবাদ
এক্সেল

মাল্টিচয়েসমোডলিস্টেনারের কোনও সমর্থন সংস্করণ আছে কি?
গ্যালাক্সিগর্ল

@ galaxigirl, দেখে মনে হচ্ছে না। তুমি তোমার অ্যাডাপ্টারের এবং দেখুন holderr ক্লিকের ঘটনাগুলিকে পরিচালনা করতে হবে
peterchaula

68

এটি আপনার ক্রিয়াকলাপ নয়, তবে আপনার সরঞ্জামদণ্ডে শুরু করবেন। আপনার ক্রিয়াকলাপে:

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

এবং আপনি ব্যবহার করতে হবে

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

আপনার থিম হিসাবে আন্ড্রে দ্বারা বিবৃত।


4
এটি আমার পক্ষে কাজ করেছিল, কারণ আমারও একটি বিশেষ প্রয়োজন ছিল। প্রয়োগের পরিবর্তে ActionMode.Callback, আমি বাস্তবায়ন করতে চেয়েছিলাম MultiChoiceModeListener। সমর্থনটি ব্যবহার করে সমস্যাটি ActionModeহ'ল এটির কোনও সমর্থন সংস্করণ বলে মনে হয় না MultiChoiceModeListener
jwir3

44

আপনার থিম এ চেষ্টা করুন:

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

আমার প্রশ্নের হিসাবে বলা হয়েছে, আমি ইতিমধ্যে সফলতা ছাড়াই এটি চেষ্টা করেছি। কিন্তু আপনাকে ধন্যবাদ!
গাতান

দুঃখিত, আমি বুঝতে পারিনি যে আপনি ইতিমধ্যে এটি চেষ্টা করে গেছেন। আপনি কি নিশ্চিত যে এটি কাজ করে না? এটা আমার জন্য কাজ করে.
আন্দ্রে রেজিভো

আমার একই সমস্যা ছিল এবং এটি এটিকে ঠিক করে দেয়। ধন্যবাদ!
মার্টা রদ্রিগেজ

4
আমি উপসর্গটির সাথে এবং ছাড়া চেষ্টা করেছি এবং এটি android:আমার অ্যাপ্লিকেশন থিমটিতে রেখেছি। ActionModeপ্রতিস্থাপক ActionBar, কিন্তু আমি আমার উপর এটি করতে চান Toolbar, যা নিচে ActionBar
গাতান

@ গাটান আপনি কি এর জন্য উত্তর পেয়েছেন? আমার অ্যাপটি একই সমস্যাটি নিয়ে চলেছে এবং আমার অ্যাপ্লিকেশনটি 21 এবং ততোধিক অ্যাপ্লিকেশনগুলিকে সমর্থন করে না থেকে আমি ক্রিয়াকলাপটি বাড়িয়ে দিচ্ছি এবং অ্যাপকম্প্যাটএকটিভিটি নয়।
এসজেডেভ

15

আমি মনে করি যে জিনিসগুলি মানুষ পরিষ্কার করছে না তা হ'ল লাইন

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

বেস থিমে স্থাপন করা হয়েছে অর্থাৎ অ্যাপপ্লেম এবং অ্যাপ থিম.নো অ্যাকশনবার নয় not

<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

আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল অনুসন্ধান করুন, তারপরে আপনার অ্যাপ্লিকেশন বা ক্রিয়াকলাপ থিমের কোডের নীচে যুক্ত করুন

<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

এই আমি তৈরি সমাধান।

আমার সালে onCreateActionMode পদ্ধতি ActionMode.Callback , আমি এই যোগ করুন:

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

এখানে, আমি সহায়তা লাইব্রেরির ক্রিয়া মোড এবং স্টার্টসুপার্টমোড পদ্ধতিটি ব্যবহার করেছি। একই সাথে আমি প্রদত্ত ক্রিয়াকলাপের থিমটিও সংশোধন করার চেষ্টা করেছি। অবশ্যই, এটি কাজ করে না। সুতরাং, আপনার যদি সত্যিই এর চেয়ে ভাল পছন্দ না থাকে তবে আপনি এটি ব্যবহার করে দেখতে পারেন।

সম্প্রতি, আমি খুঁজে পেয়েছি যে আমি আমার অ্যাপ্লিকেশনের একাধিক থিম সক্ষম করতে রঙিন ফ্রেমটি ব্যবহার করেছি, এটি থিমটিকে কোডে পরিবর্তন করবে। আমি যখন এই কাঠামোটিতে শৈলীটি সংশোধন করার চেষ্টা করেছি, এটি কাজ করে।

আশা করি এটা কাজ করবে.


এটিই আমার পক্ষে কাজ করেছে। অনেক ধন্যবাদ.
রচিত

1

সুতরাং, কয়েক দিন পরে এই থ্রেড পরে, আমি অবশেষে এটি কাজ পেয়েছিলাম। আমি যা করেছি তার সংক্ষিপ্ত বিবরণ দিতে চাই।

নোট: এই ব্যবহার সমাধান Toolbarডিফল্ট প্রতিস্থাপন ActionBarমধ্যে AppCompatActivity

  1. আমি এই লাইনটি আমার সাথে যুক্ত করেছি AppTheme: এটি অ্যান্ড্রয়েডকে বলে যে আপনি নিজের অ্যাকশন মোডটি সরঞ্জামদণ্ডে ওভারলে করতে চান
<item name="windowActionModeOverlay">true</item>
  1. সঠিক আমদানি ব্যবহার করুন:

কাজ করার জন্য আপনাকে এই আমদানিগুলি ব্যবহার করতে হবে AppCompatActivity:

import androidx.appcompat.view.ActionMode;
// or
import android.support.v7.view.ActionMode;
  1. আপনার ক্রিয়াকলাপে এর মতো অ্যাকশনমোড শুরু করুন:
actionMode = startSupportActionMode(callback);

এবং এর মতো নয়:

actionMode = startActionMode(callback);

আপনি ক্রিয়াকলাপটি স্বয়ংক্রিয়ভাবে সরঞ্জামদণ্ডে অ্যাকশনমোড তৈরি করে, কারণ এটি সমর্থনঅ্যাকশনটুলবার হিসাবে সেট করা আছে। স্টাইলটি ডিসপ্লেয়িংকে ওভারলে হিসাবে পরিচালনা করে।

@ কফস এবং @ লিফটিকে ধন্যবাদ।


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));
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.