অ্যাকশনবার / সরঞ্জামদণ্ডে এবং স্থিতি দণ্ডের নীচে প্রদর্শন করতে আমি কীভাবে ড্রয়ারলআউট ব্যবহার করব?


394

আমি নতুন মেটাল ডিজাইন সাইড ন্যাভ স্পেসে দেখেছি যে আপনি অ্যাকশন বারের উপর দিয়ে এবং স্ট্যাটাস বারের পিছনে ড্রয়ারটি প্রদর্শন করতে পারেন। আমি কীভাবে এটি বাস্তবায়ন করতে পারি?


4
আজও কোনও স্পষ্ট উত্তর নেই যা পশ্চাদগম্য সামঞ্জস্যের সাথে কাজ করে। এই ধরণের সমস্যাগুলি সত্যই কোনও প্রোগ্রামারকে হতাশ করে। অ্যান্ড্রয়েড সিস্টেমে উন্নতি করতে ইতিমধ্যে "এন" এপিআই এবং অনেকগুলি বুনিয়াদি দিকগুলি প্রচার করছে।
মার্টিনেজ

উত্তর:


528

ফ্রেমওয়ার্ক এবং সমর্থন লিবগুলিতে নতুন কার্যকারিতা ঠিক এটি মঞ্জুরি দেয়। তিন ধাঁধা ধাঁধা আছে:

  1. সরঞ্জামদণ্ড ব্যবহার করে যাতে আপনার ক্রিয়াকলাপটি আপনার দর্শন শ্রেণিবদ্ধে এম্বেড করতে পারে।
  2. ড্রয়ারলয়আউট তৈরি করা fitsSystemWindowsযাতে এটি সিস্টেম বারগুলির পিছনে ছড়িয়ে যায়।
  3. Theme.Materialসাধারণ স্ট্যাটাস বারের রঙটি অক্ষম করা হচ্ছে যাতে ড্রয়ারলয়েট পরিবর্তে সেখানে আঁকতে পারে।

আমি ধরে নেব যে আপনি নতুন অ্যাপকম্প্যাটটি ব্যবহার করবেন।

প্রথমত, আপনার বিন্যাসটি দেখতে এমন হওয়া উচিত:

<!-- The important thing to note here is the added fitSystemWindows -->
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <!-- Your normal content view -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <!-- We use a Toolbar so that our drawer can be displayed
             in front of the action bar -->
        <android.support.v7.widget.Toolbar  
            android:id="@+id/my_awesome_toolbar"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:minHeight="?attr/actionBarSize"
            android:background="?attr/colorPrimary" />

        <!-- The rest of your content view -->

    </LinearLayout>

    <!-- Your drawer view. This can be any view, LinearLayout
         is just an example. As we have set fitSystemWindows=true
         this will be displayed under the status bar. -->
    <LinearLayout
        android:layout_width="304dp"
        android:layout_height="match_parent"
        android:layout_gravity="left|start"
        android:fitsSystemWindows="true">

        <!-- Your drawer content -->

    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

তারপরে আপনার ক্রিয়াকলাপ / খণ্ডে:

public void onCreate(Bundled savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Your normal setup. Blah blah ...

    // As we're using a Toolbar, we should retrieve it and set it
    // to be our ActionBar
    Toolbar toolbar = (...) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

    // Now retrieve the DrawerLayout so that we can set the status bar color.
    // This only takes effect on Lollipop, or when using translucentStatusBar
    // on KitKat.
    DrawerLayout drawerLayout = (...) findViewById(R.id.my_drawer_layout);
    drawerLayout.setStatusBarBackgroundColor(yourChosenColor);
}

তারপরে আপনাকে নিশ্চিত করতে হবে যে স্থিতি দণ্ডের পিছনে ড্রয়ারলআউট দৃশ্যমান। আপনি আপনার মান-ভি 21 থিমটি পরিবর্তন করে এটি করেন:

মান-v21 / themes.xml

<style name="Theme.MyApp" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

দ্রষ্টব্য: যদি এর <fragment android:name="fragments.NavigationDrawerFragment">পরিবর্তে ব্যবহৃত হয়

<LinearLayout
    android:layout_width="304dp"
    android:layout_height="match_parent"
    android:layout_gravity="left|start"
    android:fitsSystemWindows="true">

    <!-- Your drawer content -->

</LinearLayout>

প্রকৃত বিন্যাস, fitsSystemWindows(boolean)আপনি onCreateViewপদ্ধতি থেকে ফিরে আসা এমন কোনও ভিউটিতে কল করলে কাঙ্ক্ষিত প্রভাবটি অর্জন করা হবে ।

@Override
public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container,
                         Bundle savedInstanceState) {
    View mDrawerListView = inflater.inflate(
        R.layout.fragment_navigation_drawer, container, false);
    mDrawerListView.setFitsSystemWindows(true);
    return mDrawerListView;
}

3
হ্যাঁ, DrawerLayoutএটি সিস্টেম বারগুলির আওতায় আনা দরকার। তারপরে আপনাকে এটিকে ড্রয়ার ভিউতে সেট করা দরকার যাতে DrawerLayoutএটি উইন্ডো ইনসেটের মধ্যে রেখে দেয়।
ক্রিস ব্যানস

11
এটি মোটেও কাজ করতে পারে না। একটি নতুন ডেমো অ্যাপ্লিকেশনে উপরের কোডের সাথে ফলাফলটি @ স্কুটারনোভা যা বর্ণনা করেছে তার অনুরূপ দেখাচ্ছে। এই স্ক্রিনশটটি দেখুন: imgur.com/QLk3syt
মাইকেল শ্মিট

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

26
স্ট্যাটাস বারের মাধ্যমে যেখানে ড্রয়ারটি দৃশ্যমান রয়েছে তার প্রভাব পেতে, আমি অ্যান্ড্রয়েড সেট করে শেষ করেছি: ড্রয়ারলাইআউটটিতে অ্যান্ড্রয়েড: ফিটসিসটেম উইন্ডোগুলি মিথ্যাতে সেট করে, ফিটসিসটেম উইন্ডোগুলি সত্যভাবে আমার মূল সামগ্রীর বিন্যাসে (টুলবারযুক্ত লেআউট) এবং <আইটেমের নাম যুক্ত করে = "অ্যান্ড্রয়েড: উইন্ডো ট্রান্সলুসেন্ট স্ট্যাটাস"> সত্য </item> আমার থিম - ললিপপ যা
জাকব

8
এই উত্তরটি অসম্পূর্ণ। আপনার নিজের নেভিগেশন ড্রয়ারকে স্ক্রিমলাউটের অভ্যন্তরে মোড়ানোও দরকার। স্ট্যাকওভারফ্লো.com
মার্কাস হাই

138

সম্পাদনা: নতুন ডিজাইন সমর্থন লাইব্রেরি এটি সমর্থন করে এবং পূর্ববর্তী পদ্ধতির আর প্রয়োজন হয় না।

এটি এখন নতুন অ্যান্ড্রয়েড ডিজাইন সমর্থন লাইব্রেরি ব্যবহার করে অর্জন করা যেতে পারে ।

আপনি ক্রিস ব্যানসের চিজস্কয়ার নমুনা অ্যাপটি দেখতে পাচ্ছেন যা সমস্ত নতুন বৈশিষ্ট্য ডেমো করে।


পূর্ববর্তী পদ্ধতি:

যেহেতু পোস্টের কোনও সম্পূর্ণ সমাধান নেই, তাই আমি পছন্দসই ফলাফলটি এখানে পেয়েছি।

আপনার প্রকল্পে প্রথমে একটি স্ক্রিমআইনসেটস ফ্রেমলআউট অন্তর্ভুক্ত করুন ।

/*
* Copyright 2014 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/**
* A layout that draws something in the insets passed to 
* {@link #fitSystemWindows(Rect)}, i.e. the area above UI chrome
* (status and navigation bars, overlay action bars).
*/
public class ScrimInsetsFrameLayout extends FrameLayout {
    private Drawable mInsetForeground;

    private Rect mInsets;
    private Rect mTempRect = new Rect();
    private OnInsetsCallback mOnInsetsCallback;

    public ScrimInsetsFrameLayout(Context context) {
        super(context);
        init(context, null, 0);
    }

    public ScrimInsetsFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public ScrimInsetsFrameLayout(
        Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        final TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.ScrimInsetsView, defStyle, 0);
        if (a == null) {
            return;
        }
        mInsetForeground = a.getDrawable(
            R.styleable.ScrimInsetsView_insetForeground);
        a.recycle();

        setWillNotDraw(true);
    }

    @Override
    protected boolean fitSystemWindows(Rect insets) {
        mInsets = new Rect(insets);
        setWillNotDraw(mInsetForeground == null);
        ViewCompat.postInvalidateOnAnimation(this);
        if (mOnInsetsCallback != null) {
            mOnInsetsCallback.onInsetsChanged(insets);
        }
        return true; // consume insets
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);

        int width = getWidth();
        int height = getHeight();
        if (mInsets != null && mInsetForeground != null) {
            int sc = canvas.save();
            canvas.translate(getScrollX(), getScrollY());

            // Top
            mTempRect.set(0, 0, width, mInsets.top);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            // Bottom
            mTempRect.set(0, height - mInsets.bottom, width, height);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            // Left
            mTempRect.set(
                0, 
                mInsets.top, 
                mInsets.left, 
                height - mInsets.bottom);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            // Right
            mTempRect.set(
                width - mInsets.right, 
                mInsets.top, width, 
                height - mInsets.bottom);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            canvas.restoreToCount(sc);
        }
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (mInsetForeground != null) {
            mInsetForeground.setCallback(this);
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mInsetForeground != null) {
            mInsetForeground.setCallback(null);
        }
    }

    /**
     * Allows the calling container to specify a callback for custom 
     * processing when insets change (i.e. when {@link #fitSystemWindows(Rect)}
     * is called. This is useful for setting padding on UI elements 
     * based on UI chrome insets (e.g. a Google Map or a ListView). 
     * When using with ListView or GridView, remember to set
     * clipToPadding to false.
     */
    public void setOnInsetsCallback(OnInsetsCallback onInsetsCallback) {
        mOnInsetsCallback = onInsetsCallback;
    }

    public static interface OnInsetsCallback {
        public void onInsetsChanged(Rect insets);
    }
}

তারপরে একটি স্টাইলযোগ্য তৈরি করুন যাতে insetForegroundসেটটি সেট করা যায়।

মান / attrs.xml

<declare-styleable name="ScrimInsetsView">
    <attr name="insetForeground" format="reference|color" />
</declare-styleable>

আপনার ক্রিয়াকলাপের এক্সএমএল ফাইল আপডেট করুন এবং নিশ্চিত করুন যে পাশাপাশি android:fitsSystemWindowsদুটি DrawerLayoutহিসাবে সত্য হয়ে গেছে ScrimInsetsFrameLayout

বিন্যাস / activity_main.xml

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <!-- The main content view -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <!-- Your main content -->

    </LinearLayout>

    <!-- The navigation drawer -->
    <com.example.app.util.ScrimInsetsFrameLayout 
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/scrimInsetsFrameLayout"
        android:layout_width="320dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@color/white"
        android:elevation="10dp"
        android:fitsSystemWindows="true"
        app:insetForeground="#4000">

        <!-- Your drawer content -->

    </com.example.app.util.ScrimInsetsFrameLayout>

</android.support.v4.widget.DrawerLayout>

আপনার ক্রিয়াকলাপের অনক্রিট পদ্ধতির অভ্যন্তরে ড্রয়ার বিন্যাসে স্ট্যাটাস বারের পটভূমির রঙ সেট করুন।

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // ...

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
    mDrawerLayout.setStatusBarBackgroundColor(
        getResources().getColor(R.color.primary_dark));
}

অবশেষে আপনার অ্যাপের থিমটি আপডেট করুন যাতে DrawerLayoutস্থিতি বারের পিছনে থাকে।

মান-v21 / styles.xml

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

ফলাফল:


10
এটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে। আমি এই জিনিসটি কাজ করতে 2 দিন ব্যয় করেছি এবং এটিই এক। এটি উত্তর হিসাবে চিহ্নিত করা উচিত। তোমাকে অনেক ধন্যবাদ.
kalehv

2
আমি অ্যাপকম্প্যাট ব্যবহার করছি না এবং এটি কার্যকর হয়নি। :( অ্যাপকম্প্যাট ব্যতিরেকে এই নির্দেশনা পাওয়ার কোনও গাইড আছে কি?
জারেড রুম্মার

3
এটি সবচেয়ে নিখুঁত উত্তর। আমি এটি 4.X থেকে 5.X পর্যন্ত বিভিন্ন অ্যান্ড্রয়েড ডিভাইসে এটি প্রয়োগ করেছি এবং পরীক্ষা করেছি এবং এটি নিখুঁতভাবে কাজ করে তা নিশ্চিত করতে পারি। অনেক ধন্যবাদ.
অরিত্র রায় 20

2
আমি যেমন বলেছি, এটি নিখুঁতভাবে কাজ করে তবে আমার কিছুটা সমস্যা আছে। ন্যাভিগেশন ড্রয়ারের ক্রিয়াকলাপে স্বচ্ছ স্থিতি দণ্ড রয়েছে তবে অন্যান্য সমস্ত ক্রিয়াকলাপ স্ট্যাটাস বার থেকে "প্রাথমিকতম" রঙ হারিয়েছে। কীভাবে ফিরে পাব?
অরিত্র রায় রায়

5
ড্রয়ার খণ্ডের চারপাশে মোড়ানো এই অতিরিক্ত বিন্যাসটি ব্যবহার করা ছাড়া আর কোনও উপায় নেই তা মেনে নিতে আমাকে তিন দিন সময় লেগেছে। অন্যথায় স্থিতি বারটি হয় ধূসর (প্রথম সন্তানের পটভূমির রঙ) বা ড্রয়ারটি স্ট্যাটাস বারের নীচে প্রদর্শিত হবে।
ডেনিস লোহ

96

সর্বশেষতম অ্যান্ড্রয়েড সমর্থন লাইব্রেরি প্রকাশের সাথে (রেভ 22.2.0) আমরা একটি নকশা সহায়তা লাইব্রেরি পেয়েছি এবং এর অংশ হিসাবে নেভিগেশনভিউ নামে একটি নতুন ভিউ পেয়েছি । সুতরাং ScrimInsetsFrameLayoutএবং অন্যান্য জিনিসগুলির সাথে আমরা নিজেরাই সবকিছু করার পরিবর্তে আমরা কেবল এই দৃষ্টিভঙ্গিটি ব্যবহার করি এবং আমাদের জন্য সমস্ত কিছু করা হয়ে থাকে।

উদাহরণ

ধাপ 1

Design Support Libraryআপনার build.gradleফাইল এ যোগ করুন

dependencies {
    // Other dependencies like appcompat
    compile 'com.android.support:design:22.2.0'
}

ধাপ ২

এতে NavigationViewআপনার যুক্ত করুন DrawerLayout:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/drawer_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fitsSystemWindows="true"> <!-- this is important -->

     <!-- Your contents -->

     <android.support.design.widget.NavigationView
         android:id="@+id/navigation"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:layout_gravity="start"
         app:menu="@menu/navigation_items" /> <!-- The items to display -->
 </android.support.v4.widget.DrawerLayout>

ধাপ 3

এতে একটি নতুন মেনু-সংস্থান তৈরি করুন /res/menuএবং আপনি যে আইটেমগুলি এবং আইকনগুলি প্রদর্শন করতে চান তা যুক্ত করুন:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_home"
            android:icon="@drawable/ic_action_home"
            android:title="Home" />
        <item
            android:id="@+id/nav_example_item_1"
            android:icon="@drawable/ic_action_dashboard"
            android:title="Example Item #1" />
    </group>

    <item android:title="Sub items">
        <menu>
            <item
                android:id="@+id/nav_example_sub_item_1"
                android:title="Example Sub Item #1" />
        </menu>
    </item>

</menu>

পদক্ষেপ 4

নেভিগেশনভিউটি আরম্ভ করুন এবং ক্লিক ইভেন্টগুলি পরিচালনা করুন:

public class MainActivity extends AppCompatActivity {

    NavigationView mNavigationView;
    DrawerLayout mDrawerLayout;

    // Other stuff

    private void init() {
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mNavigationView = (NavigationView) findViewById(R.id.navigation_view);
        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                mDrawerLayout.closeDrawers();
                menuItem.setChecked(true);
                switch (menuItem.getItemId()) {
                    case R.id.nav_home:
                        // TODO - Do something
                        break;
                    // TODO - Handle other items
                }
                return true;
            }
        });
    }
}

পদক্ষেপ 5

সেট নিশ্চিত করা android:windowDrawsSystemBarBackgroundsএবং android:statusBarColorvalues-v21অন্যথায় আপনার ড্রয়ার "এর অধীনে" স্ট্যাটাস প্রদর্শন করা won`t

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Other attributes like colorPrimary, colorAccent etc. -->
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

Ptionচ্ছিক পদক্ষেপ

নেভিগেশনভিউতে একটি শিরোনাম যুক্ত করুন। এর জন্য কেবল একটি নতুন বিন্যাস তৈরি করুন app:headerLayout="@layout/my_header_layout"এবং নেভিগেশনভিউতে যুক্ত করুন।

ফলাফল

নেভিগেশন ভিউ দেখাচ্ছে ছবি

মন্তব্য

  • হাইলাইট রঙ রঙ মাধ্যমে সংজ্ঞায়িত ব্যবহার colorPrimaryঅ্যাট্রিবিউট
  • তালিকা আইটেমগুলি ব্যবহার রঙ মাধ্যমে সংজ্ঞায়িত textColorPrimaryঅ্যাট্রিবিউট
  • আইকন ব্যবহার রঙ মাধ্যমে সংজ্ঞায়িত textColorSecondaryঅ্যাট্রিবিউট

এছাড়াও আপনি পরীক্ষা করতে পারবেন উদাহরণস্বরূপ অ্যাপ্লিকেশন দ্বারা ক্রিস Banes যা অন্যান্য নতুন মতামত যে ডিজাইন সাপোর্ট লাইব্রেরি (মত অংশ সহ NavigationView হাইলাইট FloatingActionButton , TextInputLayout , Snackbar , TabLayout ইত্যাদি)


1
ধন্যবাদ @ রিভার্স !! > আপনি যদি শৈলীর ফাইলগুলি থেকে তালিকার প্রতিটি আইটেম এবং আইকন আপডেট করতে চান তবে আপনি এটি ব্যবহার করে এটি করতে পারেন:<item name="itemTextColor">@color/YOUR_COLOR</item> <item name="itemIconTint">@color/YOUR_COLOR</item>
জুয়ান সরভিয়া

আপনি কীভাবে নির্বাচিত আইটেমটির পটভূমি রঙ পরিবর্তন করবেন?
Joop

2
এই পদ্ধতির এখনও অ্যাকশনবারের পিছনে থাকা নেভিগেশনভিউ উত্পাদন করে।
সাউথের্টন

1
@ সাউথের্টন অবশ্যই আপনাকে একটি ব্যবহার করতে হবে Toolbar- এটি করার কোনও উপায় নেইActionBar
22:59

1
@ রিগ্যান29 mDrawerLayout.openDrawer(GravityCompat.START);আপনি যেখানেই চান কেবল কল করুন । আপনি যদি এটি ব্যবহার করছেন ActionBarDrawerToggleতবে হ্যামবার্গার আইকনে ক্লিক করার সাথে সাথে এটি স্বয়ংক্রিয়ভাবে করা উচিত।
পুনর্বিবেচনা করুন

6

মান-v21 শৈলীতে বা থিম এক্সএমএল এ এই বৈশিষ্ট্যটি ব্যবহার করা দরকার: এটি এটিকে কার্যকর করুন:

<item name="android:windowTranslucentStatus">true</item>

যে ম্যাজিক!


3
এটি আমার অ্যাকশনবারের পাশাপাশি স্ট্যাটাসবারের পিছনে উপস্থিত হয়।
মিশিগেল

তবে সেই প্রভাবটিই আমরা অর্জন করতে চাইছি, জিমেইল 5.0 অ্যাপটি দেখুন? এটি স্ট্যাটাস বারের পিছনে সাইড বারটি দেখায়।
নিকোলাস জাফল

আমি যা বলতে চাইছিলাম তা নয়। নেভিগেশন ড্রয়ারটি কোডের এই লাইনের সাথে স্ট্যাটাসবারের পিছনে রয়েছে তেমনি টুলবার / অ্যাকশনবারও রয়েছে।
মিশিগেল

2
পোস্টার এবং উত্তরদাতা হ'ল গুগল কর্মচারী যিনি অ্যাপকম্প্যাটটি ডিজাইন করেছিলেন, সুতরাং আমি নিশ্চিত যে তিনি লিখিত বিষয়বস্তুটি লেখার সময় তিনি কী করছিলেন তা তিনি নিশ্চিত knew
আফলিস্টেড

@ মিক্সেক্স, আপনি অ্যান্ড্রয়েড সেট করতে পারেন: ফিটসিসটেম উইন্ডোজ = আপনার সাধারণ সামগ্রী দেখার জন্য "সত্য" (উদাহরণস্বরূপ গৃহীত উত্তর লেআউটটি নেওয়া হলে)। এটি কাজ করতে পারে, এমনকি অ্যান্ড্রয়েড ৪.৪ এর জন্যও। তবে এখানে একটি সামান্য পার্থক্য রয়েছে: অ্যান্ড্রয়েড 5.0 এ জিএমইলের চেয়ে স্ট্যাটাস বারের স্বচ্ছতার স্তরটি কিছুটা বেশি (উচ্চতর আলফা মান), স্ট্যাটাস বারটিকে আরও গাer় করে তোলে।
কিয়ানকিয়ান

6

উপরের সমস্ত পদ্ধতির সঠিক এবং কাজ করা হতে পারে। আমি উপরের গাইডেন্সিকে অনুসরণ করে একটি ওয়ার্কিং ডেমো তৈরি করেছি এবং 2.x থেকে 5.x এ পরীক্ষা করেছি

আপনি গিথুব থেকে ক্লোন করতে পারেন

চারপাশে খেলা গুরুত্বপূর্ণ জিনিসটি মূল ক্রিয়াকলাপ

toolbar = (Toolbar) findViewById(R.id.toolbar);
res = this.getResources();

this.setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    ScrimInsetsFrameLayout scrimInsetsFrameLayout = (ScrimInsetsFrameLayout)
            findViewById(R.id.linearLayout);
    scrimInsetsFrameLayout.setOnInsetsCallback(this);
} 

এবং কল ফিরে

@Override
public void onInsetsChanged(Rect insets) {
    Toolbar toolbar = this.toolbar;
    ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)
        toolbar.getLayoutParams();
    lp.topMargin = insets.top;
    int top = insets.top;
    insets.top += toolbar.getHeight();
    toolbar.setLayoutParams(lp);
    insets.top = top; // revert
}

একেবারে ভি 21 এর থিমটি যাদু করে

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- API 21 theme customizations can go here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/accent_material_light</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

এবং স্ক্রিমআইনেসেটস ফ্রেমলয়আউট

এখন এটি নতুন ডিজাইন সমর্থন লাইব্রেরির সাহায্যে আরও সহজ

compile 'com.android.support:design:22.2.0'

@ ক্রিস ব্যানস থেকে ক্লোন করুন https://github.com/chrisbanes/cheesesquare


4

এখানে উল্লিখিত সমস্ত উত্তরগুলি খুব পুরানো এবং দীর্ঘ। সর্বশেষ এবং সংক্ষিপ্ত সমাধান যা সর্বশেষ নেভিগেশনভিউয়ের সাথে কাজ করে

@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
    super.onDrawerSlide(drawerView, slideOffset);

    try {
        //int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
            // Do something for lollipop and above versions

        Window window = getWindow();

        // clear FLAG_TRANSLUCENT_STATUS flag:
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

        // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

        // finally change the color to any color with transparency

         window.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDarktrans));}

    } catch (Exception e) {

        Crashlytics.logException(e);

    }
}

আপনি যখন ড্রয়ার খুলবেন তখন এটি আপনার স্ট্যাটাস বারের রঙকে স্বচ্ছ করে তুলবে

এখন আপনি যখন ড্রয়ারটি বন্ধ করবেন তখন আপনাকে আবার স্ট্যাটাস বারের রঙ অন্ধকারে পরিবর্তন করতে হবে o সুতরাং আপনি এইভাবে এটি করতে পারেন।

        public void onDrawerClosed(View drawerView) {
        super.onDrawerClosed(drawerView);
        try {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    // Do something for lollipop and above versions

    Window window = getWindow();

    // clear FLAG_TRANSLUCENT_STATUS flag:
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

    // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

    // finally change the color again to dark
    window.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));}
    } catch (Exception e) {
    Crashlytics.logException(e);
                    }
                    }

এবং তারপরে মূল বিন্যাসে একটি একক লাইন যুক্ত করুন

            android:fitsSystemWindows="true"

এবং আপনার ড্রয়ার বিন্যাসটি দেখতে দেখতে ভাল লাগবে

            <android.support.v4.widget.DrawerLayout     
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/drawer_layout"
            android:fitsSystemWindows="true"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

এবং আপনার নেভিগেশন ভিউ মত চেহারা হবে

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_height="match_parent"
        android:layout_width="wrap_content"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/navigation_header"
        app:menu="@menu/drawer"
        />

আমি এটি এবং এটির পুরোপুরি কাজ করে যাচাই করেছি ope আশা করি এটি কাউকে সহায়তা করে his এটি সর্বোত্তম পদ্ধতির নাও হতে পারে তবে এটি সুচারুভাবে কাজ করে এবং কার্যকর করা সহজ। যদি এটি সাহায্য করে তবে এটি চিহ্নিত করুন H হ্যাপি কোডিং :)


বিকল্পভাবে, আপনি যদি অ্যাকশনবারে একটি কাস্টম ভিউ ব্যবহার করে থাকেন তবে আপনি কাস্টম ভিউটির দৃশ্যমানতা অনড্রাইব্লাইডে অনড্রিজার্লাইড () এবং অনড্রাইভার ক্লোজড () এ ভিসিবল করতে পারেন।
মিলান

3

আমি ডিজাইন সমর্থন লাইব্রেরি ব্যবহার করছি। এবং ঠিক কাস্টম থিম ব্যবহার করে আমি ন্যাভিগেশন ড্রয়ারটি খোলার সময় স্বচ্ছ স্ট্যাটাস বারটি অর্জন করেছি।

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

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

<style name="NavigationStyle" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/primaryColor</item>
    <item name="colorPrimaryDark">@color/primaryColorDark</item>

    <!-- To Make Navigation Drawer Fill Status Bar and become Transparent Too -->
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>

</style>

পরিশেষে ম্যানিফেস্ট ফাইলে থিম যুক্ত করুন

<activity
  ........
  ........
 android:theme="@style/NavigationStyle"> 
</activity>

android:fitsSystemWindows="true""ড্রয়ারলাউট" এ , সম্পত্তিটি ব্যবহার করতে ভুলবেন না


1
এপিআই লেভেল 19 ডিভাইসের জন্য এটি কীভাবে ব্যবহার করবেন?
অ্যান্ড্রয়েডগুই

2

এটি সবচেয়ে সহজ এবং এটি আমার পক্ষে কাজ করেছে:

21-মানগুলিতে:

<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        ...
        <item name="android:windowTranslucentStatus">true</item>
    </style>
    <dimen name="topMargin">25dp</dimen>
</resources>

মানগুলিতে:

<resources>
    <dimen name="topMargin">0dp</dimen>
</resources>

এবং আপনার সরঞ্জামদণ্ডে সেট করুন

android:layout_marginTop="@dimen/topMargin"

আমি এটিও করেছি, এবং এটি ললিপপে একটি কবজির মতো কাজ করেছে। তবে আমি 24dpশীর্ষ মার্জিনের জন্য ব্যবহার করেছি ।
রাফা

আপনি যখন অ্যান্ড্রয়েড .1.১ এর সাথে ডিভাইসে স্ক্রিনটি বিভক্ত করবেন আপনি অ্যাপটি যদি স্ক্রিনের দ্বিতীয় অংশ হয় তবে আপনি শীর্ষে এই ফাঁকটি দেখতে পাবেন।
সিসেরো মৌরা

1

ব্যবহার না করে ScrimInsetsFrameLayout... কেবলমাত্র একটি নির্দিষ্ট উচ্চতা 24dpএবং এর পটভূমির সাথে একটি ভিউ যুক্ত করা কি সহজ নয় primaryColor?

আমি বুঝতে পারি যে এর সাথে হায়ারার্কিতে একটি ছদ্মবেশী দৃষ্টিভঙ্গি যুক্ত রয়েছে তবে এটি আমার কাছে আরও পরিষ্কার মনে হয়।

আমি ইতিমধ্যে এটি চেষ্টা করেছি এবং এটি ভাল কাজ করছে।

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_base_drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <!-- THIS IS THE VIEW I'M TALKING ABOUT... -->
        <View
            android:layout_width="match_parent"
            android:layout_height="24dp"
            android:background="?attr/colorPrimary" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/activity_base_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:elevation="2dp"
            android:theme="@style/ThemeOverlay.AppCompat.Dark" />

        <FrameLayout
            android:id="@+id/activity_base_content_frame_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>

    <fragment
        android:id="@+id/activity_base_drawer_fragment"
        android:name="com.myapp.drawer.ui.DrawerFragment"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:elevation="4dp"
        tools:layout="@layout/fragment_drawer" />

</android.support.v4.widget.DrawerLayout>

আপনি যখন অ্যান্ড্রয়েড .1.১ এর সাথে ডিভাইসে স্ক্রিনটি বিভক্ত করবেন আপনি অ্যাপটি যদি স্ক্রিনের দ্বিতীয় অংশ হয় তবে আপনি শীর্ষে এই ফাঁকটি দেখতে পাবেন।
সিসেরো মৌরা

0

এটি দিয়ে চেষ্টা করুন:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/drawer_layout"
android:fitsSystemWindows="true">


<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--Main layout and ads-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <FrameLayout
            android:id="@+id/ll_main_hero"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">

        </FrameLayout>

        <FrameLayout
            android:id="@+id/ll_ads"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <View
                android:layout_width="320dp"
                android:layout_height="50dp"
                android:layout_gravity="center"
                android:background="#ff00ff" />
        </FrameLayout>


    </LinearLayout>

    <!--Toolbar-->
    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/toolbar"
        android:elevation="4dp" />
</FrameLayout>


<!--left-->
<ListView
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@null"
    android:background="@mipmap/layer_image"
    android:id="@+id/left_drawer"></ListView>

<!--right-->
<FrameLayout
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="right"
    android:background="@mipmap/layer_image">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@mipmap/ken2"
        android:scaleType="centerCrop" />
</FrameLayout>

শৈলী:

<style name="ts_theme_overlay" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/red_A700</item>
    <item name="colorPrimaryDark">@color/red1</item>
    <item name="android:windowBackground">@color/blue_A400</item>
</style>

প্রধান ক্রিয়াকলাপ অ্যাকশনবার অ্যাক্টিভিটি প্রসারিত করে

toolBar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolBar);

এখন আপনি onCreateOptionsMenuটুলবারের সাথে সাধারণ অ্যাকশনবারের মতো পছন্দ করতে পারেন।

এটি আমার লেআউট

  • শীর্ষ: বাম ড্রয়ার - ডান ড্রয়ার
    • এমআইডি: টুলবার (অ্যাকশনবার)
    • বটম: তালিকাফ্র্যাগমেন্ট

আশা করি বুঝতে পারছেন! মজা করুন!

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