AppCompat-v7 সহ সরঞ্জামদণ্ড এবং প্রাসঙ্গিক অ্যাকশনবার


182

ললিপপ এবং অ্যাপকম্প্যাট-ভি 7 লাইব্রেরিতে নতুনভাবে যুক্ত হওয়া টুলবারটি ব্যবহার করার জন্য আমি কাজ করছি। আমি এই গাইড অনুসরণ করে টুলবারটি সেট আপ করার জন্য করেছি এবং আমি লক্ষ্য করেছি যে আপনি যখন প্রাসঙ্গিক অ্যাকশনবার (যেমন অনুলিপি / পেস্ট করার জন্য পাঠ্যকে হাইলাইট করা) আনবেন এমন কোনও অনুরোধ করবেন, তখন এটি সরঞ্জামদণ্ডটিকে পৃষ্ঠায় নীচে ঠেলে দেবে। পৃষ্ঠার নীচে চিত্রটিতে আমি কী সম্পর্কে বলছি তা দেখতে পারেন:

সুতরাং, মূলত, আমি এটি এটি সেট আপ। আমি অন্তর্ভুক্ত ট্যাগগুলি সহ যে এক্সএমএল ফাইলটি ব্যবহার করি তাতে আমার সরঞ্জামদণ্ডটি সংজ্ঞায়িত করা হয়েছে:

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

কনটেক্সুয়াল অ্যাকশনবারটি সরঞ্জামদণ্ডের ওপরের উপরে আসে যাতে কেউ কীভাবে এটি তৈরি করতে জানেন?

সরঞ্জামদণ্ড এবং প্রাসঙ্গিক অ্যাকশনবার


আপনার ক্রিয়াকলাপটি কোন থিম ব্যবহার করছে?
অ্যালানভ

ডেভিড, আমি কেবল লিঙ্কটি ক্লিক করেছি এবং মনে হচ্ছে এটি আমার জন্য কাজ করছে।
এয়ারেটস

উত্তর:


319

হালনাগাদ:

সমাধান: উইন্ডোঅ্যাকশনমোড ওভারলে সম্পত্তি ব্যবহার করুন । আপনার থিম এ সেট করুন:

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

এবং অ্যাকশনমোডটি নীচে নামানোর পরিবর্তে অ্যাকশন বারের উপরে প্রদর্শিত হবে। (আপনি যদি সর্বশেষ অ্যাপকম্প্যাটটি ব্যবহার না করে থাকেন তবে আপনাকে সম্পত্তিটিতে "অ্যান্ড্রয়েড:" উপসর্গটি যুক্ত করতে হবে)। এটি মূলত অ্যাপকম্প্যাটকে জানতে দেয় যে আপনার পর্দার শীর্ষে একটি সরঞ্জামদণ্ড রয়েছে এবং এটির উপরে এটি অ্যাকশনমোড আঁকতে হবে।


পুরানো উত্তর / কার্যত:

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

দুর্ভাগ্যক্রমে আমি এটি সংশোধন করতে সক্ষম হই নি তাই পরিবর্তে আমি একটি কার্যনির্বাহ তৈরি করেছি। আমার ActionModeCallbackএর মধ্যে onCreateActionModeআমি অ্যাকশন বারটি আড়াল করি:

actionBarToolbar.setVisibility(View.GONE);

এবং onDestroyActionModeআমি আবার এটি দেখায়:

actionBarToolbar.setVisibility(View.VISIBLE);

লুকানো / দেখানো এত তাড়াতাড়ি ঘটে যা আমার পরীক্ষার ডিভাইসে এটি লক্ষণীয় নয়। অবশ্যই একটি নেতিবাচক দিক রয়েছে: যদিও এন্টি-অ্যানিমেশনটি এখনও কাজ করে তবে প্রাসঙ্গিক ক্রিয়া বারের প্রস্থান-অ্যানিমেশনটি হারিয়ে যায় কারণ সরঞ্জামদণ্ডটি সাথে সাথে এটির উপরে উঠে যায়। তবে যতক্ষণ না আমরা আরও ভাল সমাধানটি পাব আমি অনুমান করি আমরা এটির সাথে আটকে আছি।


(আমার ক্রিয়াকলাপটি আসলে একটি কাস্টম BaseActivityক্লাস প্রসারিত করছে যার কাছাকাছি getActionBarToolbar()থেকে নেওয়া একটি পদ্ধতি রয়েছে গুগল আই / ও ২০১৪ অ্যাপ্লিকেশন উত্স কোড , যাতে আমি সহজেই সরঞ্জামদণ্ডটি আনতে পারি:

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

খুব খারাপ I / O অ্যাপ্লিকেশন প্রাসঙ্গিক ক্রিয়া বার ব্যবহার করে না))


হ্যাঁ, আমিও আসতে পারি এটির একমাত্র সমাধান। যাইহোক, কিছু ক্ষেত্রে রয়েছে যে প্রসঙ্গে সিস্টেম থেকে প্রাসঙ্গিক অ্যাকশনবারটি ঘটে (উদাহরণস্বরূপ একটি ওয়েবউভে বা একটি সম্পাদনা পাঠ্য সহ)। যাদের জন্য আপনি কলব্যাকগুলি পান না। সুতরাং, আপনি এটির জন্য এটি কীভাবে প্রদর্শন / লুকিয়ে রাখবেন? (বা আমি কি ভুল হয়েছি এবং বাস্তবে আপনি সেগুলির সাথে সিএবির কলব্যাকগুলি পেতে পারেন)?
এরিয়ट्स

1
হ্যাঁ, আপনি তার জন্য টেক্সটভিউ.সেটাস্টমসলেশনএকশনমোডক্যালব্যাক () করতে পারেন , যেমন তার উত্তরে বর্ণিত আলেকসান্দার।
জ্যাকব রস

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

@ আরিটস দয়া করে আমার আপডেট হওয়া উত্তর দেখুন। এই সম্পত্তিটি সম্পূর্ণরূপে ভুলে যাওয়ার জন্য আমি কিছুটা ডাম্প অনুভব করি, তবে কমপক্ষে আমরা এখনই কাজটি থেকে মুক্তি পেতে পারি ;-)
জ্যাকব রাস

1
মজার বিষয় আমি সর্বশেষ (সংকলন 'com.android.support:appcompat-v7:22.0.0') করছি তবে আমাকে অ্যান্ড্রয়েডটি ছেড়ে দিতে হবে: এটির কাজ করার জন্য অংশটি ...
ওয়ারপজিট

16

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

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

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

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

আমার জন্য এটি android.support.v7.app.ActionBar
ফ্র্যাঙ্ক

আমি এই ত্রুটিটি পেয়েছি-> স্টার্টএকশনমোড (android.view.ActionMode.Callback) এ প্রয়োগ করা যাবে না (android.support.v7.view.ActionMode.Callback)
ফাহিম

আহ ঠিক আছে. আমার ন্যূনতম সংস্করণটি ১১-এর চেয়ে কম নয় So সুতরাং আমি একটি Android.view.ActionMode ব্যবহার করতে পারি। একটি android.support.v7.widget.Toolbar এ কলব্যাক, আমি কখনই android.support.v7.view.ActionMode.Callback ব্যবহার করি না।
ফ্রাঙ্ক

এটি উল্লেখ AppCompatActivity.startSupportActionMode(callback)করার মতো app:iconTint, মেনু আইটেম xmls এর মতো বৈশিষ্ট্যের সাথে সামঞ্জস্যতা পেতে ।
geekley

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নেমস্পেসটি ব্যবহার করেন ।
জাভিয়ের মেন্ডোনিয়া

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

<আইটেমের নাম = "উইন্ডোঅ্যাকশনমোড ওভারলে"> সত্য </ i>> প্রত্যাশায় কাজ করেছে!
ফ্রাঙ্কোয়াস

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" থিমটি অবশ্যই সরঞ্জামদণ্ডে প্রয়োগ করা উচিত।

প্রাসঙ্গিক অ্যাকশনবারের স্টাইলিং সম্পর্কিত আরও বিশদ:

উপাদান নকশায় অ্যাপকম্প্যাট ব্যবহার করে কীভাবে প্রাসঙ্গিক অ্যাকশন বারটি কাস্টমাইজ করবেন


0

টুলবারটি সামনে আনার জন্য খুব দরকারী পদ্ধতি toolbar.bringToFront()


2
View.bringToFront()খুব ভারী অপারেশন এবং সাধারণত যে কোনও মূল্যে এড়ানো উচিত।
4'15

আপনি ঠিক বলেছেন, তবে অ্যানিমেশনের জন্য যেমন উপরে থেকে নীচে স্ক্রিনটি টুলবারটি ওভারল্যাপ করবে। সুতরাং
টুলবারের

0

আরেকটি ছোট সংযোজন: setContentView(R.layout.empty_screen)আপনি যদি পুরো ইউআই টুকরো টুকরো টুকরো করে লোড করেন তবে তার মাধ্যমে ক্রিয়াকলাপে কমপক্ষে একটি ফাঁকা স্ক্রিন সেট করা নিশ্চিত করুন ft.replace(android.R.id.content, fragment)

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