অ্যান্ড্রয়েড অ্যাপকোম্প্যাট ভি 7 21 লাইব্রেরি থেকে ড্রয়ারআরটগল কীভাবে প্রয়োগ করা যায়


97

সুতরাং এখন যে অ্যানড্রয়েড 5.0 প্রকাশিত হয়েছিল আমি ভাবছিলাম কীভাবে অ্যানিমেটেড অ্যাকশনবার আইকনগুলি প্রয়োগ করতে হয়।

এখানে এই গ্রন্থাগারটি এটি আমার জন্য সূক্ষ্মভাবে প্রয়োগ করে তবে অ্যাপকম্প্যাট ভি 7 লাইব্রেরিটি যেহেতু এটি কার্যকর করা যায় কীভাবে?

লাইব্রেরি থিমস.এক্সএমএলে এটি উল্লেখ করে

 <item name="drawerArrowStyle">@style/Widget.AppCompat.DrawerArrowToggle</item>

এই শৈলী অধীনে

 <style name="Base.V7.Theme.AppCompat" parent="Platform.AppCompat">

হালনাগাদ

আমি v7 ড্রয়ারটগল ব্যবহার করে এটি বাস্তবায়ন করেছি। তবে আমি এটি স্টাইল করতে পারি না। সাহায্য করুন

আমি v7 স্টাইল_বেস.এক্সএমএল এর জন্য স্টাইলিংটি পেয়েছি

<style name="Base.Widget.AppCompat.DrawerArrowToggle" parent="">
    <item name="color">?android:attr/textColorSecondary</item>
    <item name="thickness">2dp</item>
    <item name="barSize">18dp</item>
    <item name="gapBetweenBars">3dp</item>
    <item name="topBottomBarArrowSize">11.31dp</item>
    <item name="middleBarArrowSize">16dp</item>
    <item name="drawableSize">24dp</item>
    <item name="spinBars">true</item>
</style>

আমি এটি আমার শৈলীতে যুক্ত করেছি এবং কাজ করে নি। আমার অ্যাটর্সএক্সএমএল এও যুক্ত হয়েছে

<declare-styleable name="DrawerArrowToggle">
    <!-- The drawing color for the bars -->
    <attr name="color" format="color"/>
    <!-- Whether bars should rotate or not during transition -->
    <attr name="spinBars" format="boolean"/>
    <!-- The total size of the drawable -->
    <attr name="drawableSize" format="dimension"/>
    <!-- The max gap between the bars when they are parallel to each other -->
    <attr name="gapBetweenBars" format="dimension"/>
    <!-- The size of the top and bottom bars when they merge to the middle bar to form an arrow -->
    <attr name="topBottomBarArrowSize" format="dimension"/>
    <!-- The size of the middle bar when top and bottom bars merge into middle bar to form an arrow -->
    <attr name="middleBarArrowSize" format="dimension"/>
    <!-- The size of the bars when they are parallel to each other -->
    <attr name="barSize" format="dimension"/>
    <!-- The thickness (stroke size) for the bar paint -->
    <attr name="thickness" format="dimension"/>
</declare-styleable>

কিন্তু ক্র্যাশ করে এবং রঙ করার সময় ত্রুটিটি এটি করার সময় বলে। আমি কী মিস করছি?

উত্তর:


243

প্রথমত, আপনার এখন জানা উচিত যে android.support.v4.app.ActionBarDrawerToggleএটি অবমানিত।

আপনাকে অবশ্যই এটির সাথে প্রতিস্থাপন করতে হবে android.support.v7.app.ActionBarDrawerToggle

এখানে আমার উদাহরণ এবং আমি Toolbarনতুনটি প্রতিস্থাপন করতে ব্যবহার করি ActionBar

মেইনএ্যাকটিভিটি.জভা

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);
    DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
        this,  mDrawerLayout, mToolbar,
        R.string.navigation_drawer_open, R.string.navigation_drawer_close
    );
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    mDrawerToggle.syncState();
}

styles.xML

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
</style>

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">true</item>
    <item name="color">@android:color/white</item>
</style>

আপনি অ্যান্ড্রয়েড ডকুমেন্ট # ড্রয়ার অ্যারোগল টগল_স্পিনবারগুলিতে দস্তাবেজগুলি পড়তে পারেন

এই বৈশিষ্ট্যটি মেনু-থেকে-তীর অ্যানিমেশনটি কার্যকর করার মূল চাবিকাঠি।

সার্বজনীন স্ট্যাটিক ইন্ট ড্রয়ারআরো টগল_স্পিনবারগুলি বার্সার

পরিবর্তনের সময় ঘোরানো উচিত কি না তা
অবশ্যই "সত্য" বা "মিথ্যা" বুলিয়ান মান হওয়া উচিত।

সুতরাং, আপনি সেট করুন: <item name="spinBars">true</item>

তারপরে অ্যানিমেশন উপস্থাপন করা যেতে পারে।

আশা করি এটি আপনাকে সহায়তা করতে পারে।


12
আমি হ্যামবার্গার আইকনটি দেখাতে পেয়ে সমস্যার মুখোমুখি হয়েছি। কলিং mDrawerToggle.syncState();এটি স্থির।
অহিউরম্যান

4
আমার জন্য সাপোর্টঅ্যাকশনবার () বাতিল করে দেয় .. কারণ কী হতে পারে?
রমেশ_ডি

4
অ্যান্ড্রয়েড স্টুডিও বলেছেন Cannot resolve method setSupportActionBar(android.widget.Toolbar)। আমিও চেষ্টা করেছি android.support.v7.toolbar। কেউকি জানে এটা কেনো ঘটেছে?
পেজ

4
আমি ব্যবহার করেছি setSupportActionBar(mToolbar);এবং সংজ্ঞায়িত করেছি <item name="spinBars">true</item>তবে অ্যানিমেশনটি কাজ করছে না
সুইটওয়িশার ツ

4
যদি আপনি নিজের ক্রিয়াকলাপের অ্যাকশনবার হিসাবে সরঞ্জামদণ্ডটি সেট করে থাকেন তবে অ্যাকশনবারড্রওয়ারটগল (ক্রিয়াকলাপ, ড্রয়ারলআউট, ইনট, ইনট) ব্যবহার করা উচিত।
পিটার ঝাও 13

24

আপনি ব্যবহার করে থাকেন সাপোর্ট লাইব্রেরী প্রদত্ত DrawerLayout হিসাবে প্রস্তাব একটি নেভিগেশান ড্রয়ার প্রশিক্ষণ তৈরি করা হচ্ছে , আপনি নতুন যোগ ব্যবহার করতে পারেন android.support। v7 .app.ActionBarDrawerToggle (দ্রষ্টব্য: বর্তমানে অবচিত থেকে আলাদা । android.support V4 .app.ActionBarDrawerToggle ):

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

অবচয় / নতুন শ্রেণিকে বিবেচনায় নেওয়ার জন্য প্রশিক্ষণটি আপডেট করা হয়নি, আপনি এটি প্রায় একই কোডটি ব্যবহার করতে সক্ষম হবেন - এটি বাস্তবায়নের একমাত্র পার্থক্য নির্মাতা।


আমি আমার অ্যাপ্লিকেশন বিসি-তে ভি 4 ব্যবহার করছি আমাকে এপিআই 15 এর আগে ডিভাইসগুলি সমর্থন করার দরকার নেই So সুতরাং আমি যদি এটি কাজ করতে চাই তবে আমাকে ভি 7 অ্যাকশনবার ড্রয়ার টগল ব্যবহার করতে হবে? যদি আমি তা না করতাম তবে আমার সমস্ত শৈলীর অ্যাপকম্প্যাট এবং টুকরো ক্রিয়াকলাপগুলিকে অ্যাকশনবারের ক্রিয়াকলাপে রূপান্তর করতে হবে না ইত্যাদি? অথবা আমি v7 থেকে কেবল ড্রয়ার টগল প্রয়োগ করতে পারি। এই মুহুর্তে আমি কার্ড ভিউয়ের জন্য v7 ব্যবহার করি। আমি যদি 15 এর নীচে এপিআই সমর্থন না করি তবে আমার কি ভি 4 ব্যবহার করা উচিত? এবং আমার মনে হয় কার্ড ভিউয়ের জন্য আমার ভি 7 দরকার।
বিগনাডাদ

মেটেরিয়াল ডিজাইনের জন্য সমস্ত সাপোর্ট লাইব্রেরি সামঞ্জস্যতা v7-appcompat এ প্রয়োগ করা হয় এবং আপনি <5.0 ডিভাইসে স্টাইলিং সমর্থন করতে চান তবে প্রস্তাবিত হয়। অ্যাপকম্প্যাটটি তৈরি করা হয়েছে এবং v4 এর দরকার আছে তাই আপনি যদি অ্যাপকম্প্যাটটি একেবারেই ব্যবহার করতে চান তবে এটি সত্যই আপ। আপনি যদি ইতিমধ্যে ফ্র্যাগমেন্টএকটিভিটি ব্যবহার করে থাকেন তবে আপনি ইতিমধ্যে খুব কাছাকাছি রয়েছেন - স্টাইলিংয়ের পার্থক্য এখন বেশ ছোট (বেশিরভাগই কেবল অ্যান্ড্রয়েডের প্রতিস্থাপন: অ-নামকরণ গতির বৈশিষ্ট্য সহ বৈশিষ্ট্য)।
ianhanniballake

আপনি যদি একবার দেখে নিতে আগ্রহী না হন তবে প্রশ্নটি আপডেট করেছেন
বিগনাডাদ

স্টাইলিং সম্পর্কে এটি সত্যিই সম্পূর্ণ পৃথক প্রশ্ন। আমি সেই অংশটি সম্পূর্ণ অন্যান্য প্রশ্ন হিসাবে জমা দেওয়ার পরামর্শ দিচ্ছি (এটির কোনও লিঙ্কের সাথে কোনও মন্তব্য যুক্ত করতে নির্দ্বিধায়)।
ianhanniballake

4
@ মিরাভিয়েটার - হ্যাঁ: এক্সএমএল পরিবর্তন করুন, তারপরে ভি 7 তৈরি করুন এবং সংযুক্ত করুন ActionBarDrawerToggleক্যানোনিকাল উত্তর AppCompat এর সৃষ্টিকর্তা থেকে একটি পূর্ণ দৃষ্টান্তমূলক আপনার XML গঠিত হতে উচিত।
ianhanniballake

17

আমি একটি ছোট অ্যাপ্লিকেশন তৈরি করেছি যার অনুরূপ কার্যকারিতা ছিল

প্রধান কাজ

public class MyActivity extends ActionBarActivity {

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

        DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer);
        android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(
                this,
                drawerLayout,
                toolbar,
                R.string.open,
                R.string.close
        )

        {
            public void onDrawerClosed(View view)
            {
                super.onDrawerClosed(view);
                invalidateOptionsMenu();
                syncState();
            }

            public void onDrawerOpened(View drawerView)
            {
                super.onDrawerOpened(drawerView);
                invalidateOptionsMenu();
                syncState();
            }
        };
        drawerLayout.setDrawerListener(actionBarDrawerToggle);

        //Set the custom toolbar
        if (toolbar != null){
            setSupportActionBar(toolbar);
        }

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        actionBarDrawerToggle.syncState();
    }
}

আমার ক্রিয়াকলাপের এক্সএমএল

<android.support.v4.widget.DrawerLayout 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"
    tools:context=".MyActivity"
    android:id="@+id/drawer"
    >

    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <include layout="@layout/toolbar_custom"/>
    </FrameLayout>
    <!-- The navigation drawer -->
    <ListView
        android:layout_marginTop="?attr/actionBarSize"
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#457C50"/>


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

আমার কাস্টম টুলবার এক্সএমএল

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/toolbar"
    android:background="?attr/colorPrimaryDark">
    <TextView android:text="U titel"
        android:textAppearance="@android:style/TextAppearance.Theme"
        android:textColor="@android:color/white"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</android.support.v7.widget.Toolbar>

আমার থিম শৈলী

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

    <style name="AppTheme.Base" parent="Theme.AppCompat">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primaryDarker</item>
        <item name="android:windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
    </style>

    <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
        <item name="spinBars">true</item>
        <item name="color">@android:color/white</item>
    </style>

    <color name="primary">#457C50</color>
    <color name="primaryDarker">#580C0C</color>
</resources>

মানগুলিতে আমার স্টাইলগুলি - v21

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        <item name="android:windowContentTransitions">true</item>
        <item name="android:windowAllowEnterTransitionOverlap">true</item>
        <item name="android:windowAllowReturnTransitionOverlap">true</item>
        <item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
        <item name="android:windowSharedElementExitTransition">@android:transition/move</item>
    </style>
</resources>

4
এটি নিখুঁতভাবে কাজ করে তবে আমি শিরোনামটি ব্যবহার করতে চাই না আমি কীভাবে এটি পরিচালনা করতে পারি? কারণ যদি আমি ব্যবহার Theme.AppCompat.Light.NoActionBar , এটা স্পষ্টভাবে আমাকে শূন্য এ দেব getSupportActionBar
SweetWisherツ

আমি উপরে কোড ব্যবহার করেছি। আমি ব্যতিক্রম পেয়েছি: এই ক্রিয়াকলাপটিতে ইতিমধ্যে সেটসপোর্টটিবারবার (সরঞ্জামদণ্ড) লাইনে উইন্ডো সজ্জা দ্বারা সরবরাহ করা একটি অ্যাকশন বার রয়েছে। আমি getSupportActionBar ()। গোপন (); সেটকন্টেন্টভিউ (R.layout.activity_main) এর আগে; এখন এটি কাজ করছে।
তিরুমালওয়ালভান

setSupportActionBar (টুলবার); এছাড়াও মন্তব্য।
তিরুমালওয়ালওয়ান

9

আপনার প্রশ্নের আপডেট হওয়া অংশটির উত্তর দিতে: ড্রয়ার আইকন / তীরটি স্টাইল করতে আপনার কাছে দুটি বিকল্প রয়েছে:

তীরটি নিজেই স্টাইল করুন

এটি করার জন্য, drawerArrowStyleআপনার থিমটিতে এ জাতীয় ওভাররাইড করুন :

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="drawerArrowStyle">@style/MyTheme.DrawerArrowToggle</item>
</style>
<style name="MyTheme.DrawerArrowToggle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="color">@android:color/holo_purple</item>
    <!-- ^ this will make the icon purple -->
</style>

এটি সম্ভবত আপনি চান না , কারণ অ্যাকশনবারে নিজেই তীরটির সাথে ধারাবাহিক স্টাইলিং থাকা উচিত, তাই সম্ভবত, আপনি বিকল্পটি দুটি চান:

অ্যাকশনবার / সরঞ্জামদণ্ডকে থিম করুন

গ্লোবাল অ্যাপ্লিকেশন থিমের android:actionBarTheme( actionBarThemeঅ্যাপকম্প্যাট জন্য) বৈশিষ্ট্যটিকে নিজের থিমের সাথে (যা সম্ভবত আপনার কাছ থেকে নেওয়া উচিত) ওভাররাইড করুন ThemeOverlay.Material.ActionBar/ThemeOverlay.AppCompat.ActionBar:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="actionBarTheme">@style/MyTheme.ActionBar</item>
</style>
<style name="MyTheme.ActionBar" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="android:textColorPrimary">@android:color/white</item>
    <!-- ^ this will make text and arrow white -->
    <!-- you can also override drawerArrowStyle here -->
</style>

এখানে একটি গুরুত্বপূর্ণ নোটটি হ'ল Toolbarস্টক অ্যাকশনবার বাস্তবায়নের পরিবর্তে একটি কাস্টম বিন্যাস ব্যবহার করার সময় (যেমন আপনি যদি পদার্থ-স্টাইলের ড্রয়ারের প্রভাবটি ট্রান্সলুসেন্ট স্ট্যাটাস বারের অধীন প্রদর্শিত হয়) অর্জন করতে DrawerLayout- NavigationView- Toolbarকম্বো ব্যবহার করছেন , তখন actionBarThemeঅ্যাট্রিবিউটটি আপত্তিজনকভাবে নয় স্বয়ংক্রিয়ভাবে বাছাই করা হয়েছে (কারণ এটি AppCompatActivityডিফল্টরূপে এটির যত্ন নেওয়া উচিত ActionBar), সুতরাং আপনার কাস্টমটির জন্য Toolbarআপনার থিমটি ম্যানুয়ালি প্রয়োগ করতে ভুলবেন না:

<!--inside your custom layout with DrawerLayout
and NavigationView or whatever -->
<android.support.v7.widget.Toolbar
        ...
        app:theme="?actionBarTheme">

- ThemeOverlay.AppCompat.ActionBarআপনি যদি আপনার উদ্ভূত থিমটিতে বৈশিষ্ট্যটি সেট করেন তবে এটি অ্যাপকম্প্যাটটির ডিফল্ট বা আপনার ওভাররাইডের সমাধান করবে either

drawerArrowStyleওভাররাইড এবং spinBarsবৈশিষ্ট্য সম্পর্কে পিএস একটি সামান্য মন্তব্য - যা প্রচুর উত্সের পরামর্শ দেয় trueযে ড্রয়ার / তীর অ্যানিমেশনটি সেট করতে হবে। কথাটি হ'ল spinBarsএটি অ্যাপকম্প্যাট-এ true ডিফল্টরূপে রয়েছে ( Base.Widget.AppCompat.DrawerArrowToggle.Commonস্টাইলটি দেখুন), actionBarThemeঅ্যানিমেশনটি কাজ করতে আপনাকে কিছুটা ওভাররাইড করতে হবে না । আপনি অ্যানিমেশনটি এটিকে ওভাররাইড করেও এবং এট্রিবিউটটি সেট করলেও false, এটি কেবল একটি আলাদা, কম দ্বিগুণ অ্যানিমেশন। এখানে গুরুত্বপূর্ণ বিষয়টি হ'ল ActionBarDrawerToggleঅভিনব অ্যানিমেটেড আঁকতে সক্ষম টান।


2

আমি উপরের কোডটি কিছুটা সংশোধন করতে চাই

    public class MainActivity extends ActionBarActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
        DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
            this,  mDrawerLayout, mToolbar,
            R.string.navigation_drawer_open, R.string.navigation_drawer_close
        );
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
    }

এবং অন্যান্য সমস্ত জিনিস একই থাকবে ...

যাঁরা Drawerlayoutওভারলেয়িং সরঞ্জামদণ্ডে সমস্যায় পড়েছেন For

android:layout_marginTop="?attr/actionBarSize"ড্রয়ারের সামগ্রীর মূল বিন্যাসে যুক্ত করুন


আপনি getSupportActionBar()যখন প্রসারিত Activityকরবেন তখন আপনি কীভাবে ব্যবহার করবেন ?
wzieba

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