অ্যান্ড্রয়েড স্বচ্ছ স্ট্যাটাস বার এবং অ্যাকশনবার


97

আমি এই বিষয় নিয়ে কয়েকটি গবেষণা করেছি এবং ধাপে ধাপে এবং কিছু পরীক্ষা ও ত্রুটির সাথে আমি একটি সম্পূর্ণ সমাধান খুঁজে পাইনি, শেষ পর্যন্ত আমি কীভাবে এই ফলাফলগুলি অর্জন করতে পারি তা আবিষ্কার করি: স্বচ্ছ বা বর্ণযুক্ত Actionbarএবং Statusbar। আমার উত্তর নম্র দেখুন।

উত্তর:


238

আমি এমন একটি অ্যাপ্লিকেশন বিকাশ করছি যা অ্যাকশনবার এবং স্ট্যাটাসবার কাস্টমাইজেশনের ক্ষেত্রে আসে> = API14 এর সাথে সমস্ত ডিভাইসে একই দেখতে পাওয়া দরকার। অবশেষে আমি একটি সমাধান খুঁজে পেয়েছি এবং যেহেতু এটি আমার কিছুটা সময় নিয়েছে আমি আপনার কিছুটি সংরক্ষণ করার জন্য এটি ভাগ করব। আমরা একটি অ্যাপকম্প্যাট -21 নির্ভরতা ব্যবহার করে শুরু করি।

স্বচ্ছ Actionbar :

মান / styles.xml :

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

<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
    <item name="android:windowContentOverlay">@null</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="colorPrimary">@android:color/transparent</item>
</style>

<style name="AppTheme.ActionBar" parent="AppTheme">
    <item name="windowActionBarOverlay">false</item>
    <item name="colorPrimary">@color/default_yellow</item>
</style>


মান-ভি 21 / স্টাইল.এক্সএমএল :

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

<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
    <item name="colorPrimary">@android:color/transparent</item>
</style>

<style name="AppTheme.ActionBar" parent="AppTheme">
    <item name="colorPrimaryDark">@color/bg_colorPrimaryDark</item>
    <item name="colorPrimary">@color/default_yellow</item>
</style>

AndroidManifest.xmlকোন ক্রিয়াকলাপ স্বচ্ছ বা বর্ণযুক্ত হবে তা নির্দিষ্ট করতে এখন আপনি এই থিমগুলি ব্যবহার করতে পারেন ActionBar:

    <activity
            android:name=".MyTransparentActionbarActivity"
            android:theme="@style/AppTheme.ActionBar.Transparent"/>

    <activity
            android:name=".MyColoredActionbarActivity"
            android:theme="@style/AppTheme.ActionBar"/>

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য: এপিআই> = 21 এ Actionbarস্বচ্ছ পেতে আপনাকেও স্বচ্ছ হওয়া দরকার Statusbar, অন্যথায় আপনার রঙের শৈলীর সম্মান করা হবে না এবং হালকা-ধূসর থাকবে।



স্বচ্ছ স্ট্যাটাসবার (শুধুমাত্র এপিআই> = 19 এর সাথে কাজ করে) :
এটি বেশ সহজ এটি কেবল নীচের কোডটি ব্যবহার করুন:

protected void setStatusBarTranslucent(boolean makeTranslucent) {
        if (makeTranslucent) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        } else {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

তবে আপনি একটি মজাদার ফলাফল লক্ষ্য করবেন: এখানে চিত্র বর্ণনা লিখুন

এটি ঘটবে কারণ Statusbarস্বচ্ছ হলে লেআউটটি তার উচ্চতা ব্যবহার করবে। এটি রোধ করতে আমাদের কেবল দরকার:

সমাধান এক: আপনার লেআউট ভিউ ধারকটিতে
এই লাইনটি যুক্ত করুন android:fitsSystemWindows="true"যা আপনি অ্যাকশনবারে বেলো রাখতে চান:

    ...
        <LinearLayout
                android:fitsSystemWindows="true"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
            ...
        </LinearLayout>
    ...

সমাধান দুটি:
আমাদের আগের পদ্ধতিতে কয়েকটি লাইন যুক্ত করুন:

protected void setStatusBarTranslucent(boolean makeTranslucent) {
        View v = findViewById(R.id.bellow_actionbar);
        if (v != null) {
            int paddingTop = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ? MyScreenUtils.getStatusBarHeight(this) : 0;
            TypedValue tv = new TypedValue();
            getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize, tv, true);
            paddingTop += TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
            v.setPadding(0, makeTranslucent ? paddingTop : 0, 0, 0);
        }

        if (makeTranslucent) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        } else {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

R.id.bellow_actionbarআমরা যাই হোক না কেন লেবু স্থাপন করতে চাই তার লেআউট কনটেইনার ভিউ আইডি কোথায় থাকবে Actionbar:

...
    <LinearLayout
            android:id="@+id/bellow_actionbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        ...
    </LinearLayout>
...

এখানে চিত্র বর্ণনা লিখুন

সুতরাং এটি এটি, এটি মনে হয় আমি কিছু ভুলে যাচ্ছি না। এই উদাহরণে আমি একটি ব্যবহার করি নি Toolbarতবে আমি মনে করি এটির একই ফলাফল হবে। আমি নিজের কাস্টমাইজটি এভাবেই করি Actionbar:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        View vg = getActionBarView();
        getWindow().requestFeature(vg != null ? Window.FEATURE_ACTION_BAR : Window.FEATURE_NO_TITLE);

        super.onCreate(savedInstanceState);
        setContentView(getContentView());

        if (vg != null) {
            getSupportActionBar().setCustomView(vg, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            getSupportActionBar().setDisplayShowCustomEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(false);
            getSupportActionBar().setDisplayShowTitleEnabled(false);
            getSupportActionBar().setDisplayUseLogoEnabled(false);
        }
        setStatusBarTranslucent(true);
    }

দ্রষ্টব্য: এটি এমন একটি abstract classযা ActionBarActivity
আশা করে এটি সাহায্য করে!


9
আপনার সত্যই অ্যান্ড্রয়েড ব্যবহার করা উচিত : ফিটসিসটেম উইন্ডো যদি আপনি নিশ্চিত করতে চান যে আপনার ভিউ স্বচ্ছ স্থিতি বারের নীচে নয়।
ianhanniballake

4
এটি সম্পূর্ণ সঠিক, আমি আমার কোডটি পর্যালোচনা করছিলাম এবং আমি এটিও ব্যবহার করছি। এই উদাহরণে আমি এটি মিস করেছি জানি না। আমি এটি আপডেট করব, ধন্যবাদ!
গিলহ

4
আপনাকে মিস করছে MyScreenUtils.getStatusBarHeight(this) এখানে উত্তর stackoverflow.com/a/3410200/1307690
রোমান Nazarevych

4
এটিকে স্বচ্ছ এবং সম্পূর্ণ স্বচ্ছ নয় এমন কোনও উপায় আছে কি? আমি API 23 am
অক্স

6
স্বচ্ছ স্ট্যাটাস বার ওয়ার্কস পেতে আমাকে FLAG_LAYOUT_NO_LIMITS পতাকা যুক্ত করতে হবে , তার getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);পরে কোডটি রেখেছিgetWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
এডুয়ার্ডো ইআর

3

এটি কিটকটের পরে সমর্থন করে supports আপনার ক্রিয়াকলাপের onCreate পদ্ধতির ভিতরে কেবল নিম্নলিখিত কোড যুক্ত করুন। ম্যানিফেস্ট ফাইলটিতে কোনও পরিবর্তন করার দরকার নেই।

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                Window w = getWindow(); // in Activity's onCreate() for instance
                w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            }

10
এটি নেভিগেশন
বারটিকেও

0

আপনার ক্রিয়াকলাপ / খণ্ড জাভা ফাইলে কোডের এই লাইনগুলি কেবল যুক্ত করুন:

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