آموزش اندروید bottom bar متریال دیزاین

سطح آموزش: #متوسط

تا اینجا آموزش‌های طراحی‌مون مربوط به المان‌هایِ استاندارد متریال دیزاین بود که توسط گوگل معرفی شدن. ولی این آموزش قصد داریم راجع به bottom bar صحبت کنیم.

 

 

Bottom bar به در طراحی‌های ios بیشتر به کار میره اما در متریال دیزاین تحتِ عنوانِ Bottom navigation معرفی شده. اما در کتابخونه design بطورِ پیش‌فرض قرار نگرفته و اگر تمایل به استفاده از این قابلیت داریم باید خودمون دست به طراحی بزنیم یا از کتابخونه‌های دیگه استفاده کنیم.

برای استفاده از bottom bar یا bottom navigation گوگل نکاتی رو مطرح کرده که باید رعایت کنیم و اینجا میتونید این نکات رو مطالعه کنید.

برای شروع نیاز دارید آیکون‌هایی رو در سایز‌هایِ استاندارد که در توضیحاتِ گوگل اومده تولید کنید. ابتدا این فایل رو دانلود کنید. سپس با استفاده از قابلیتِ image asset در اندروید استودیو سایزهای مختلف از عکس رو generate کنید.

من از یک اکتیویتی به اسمِ BottomBarAcitivity و فایلِ xmlـی با اسمِ activity_bottom_bar استفاده میکنم.

ابتدا به build.gradle کدِ زیر رو اضافه کنید:

بعد از اضافه  شدنِ کتابخونه یک دایرکتوری زیر شاخه‌ی res تولید کنید به نامِ xml و فایلِ bottombar_tabs.xml را در آن ایجاد کنید و کدهای زیر رو داخلش قرار بدید:

حالا به سراغِ لایه activity_bottom_bar.xml رفته و کدهایِ زیر رو اضافه می‌کنیم:

frame layout لایه اصلیِ ماست اما هیچ المانی در اون قرار نمیدیم. چون برای نشون دادن صفحات مختلف از fragmentها استفاده خواهیم کرد. برایِ ساختِ فرگمنت مشابه کاری که در آموزشِ کار با tab و viewpager کردیم رو تکرار می‌کنیم. چهار فرگمنتِ خالی با اسامیِ FirstFragment و SecondFragmet و ThirdFragment و FourthFragment می‌سازیم. برایِ نمونه کدِ یکی رو قرار میدم:

کد

لایه xml هم به شکل زیر خواهد بود:

اکنون به سراغِ اکتیویتی اصلی یعنی BottomBarActivity میریم و به شکل زیر کد میزنیم:

کد

بسیار خب. یکبار برنامه رو اجرا کنید. مشابه به تصویر زیر خواهد بود:

bottom bar آموزش اندروید متریال دیزاین bottom navigation

اگر بخواید میتونید تغییراتِ دیگری هم اعمال کنید. برای مثال برایِ اضافه کردنِ رنگ به bottom bar فایلِ bottombar_tabs.xml رو به شکلِ زیر تغییر بدید:

کد

سپس رنگ‌های دلخواه رو به colors.xml اضافه کنید.

برایِ اعمالِ تغییراتِ دیگه و آشنایی بیشتر با این کتابخونه به این لینک مراجعه کنید.

پی‌نوشت۱: الان یک خبر خوب پیدا کردم. bottom navigation در ورژنِ ۲۵ـه کتابخونه design پشتیبانی میشه. در آینده آموزشِ استفاده از bottom navigation با support design رو قرار خواهم داد.

پی‌نوشت۲: یک کتابخونه خوبِ دیگه پیدا کردم که میتونید از اون هم برایِ برنامه‌هاتون استفاده کنید. اما بهتره صبر کنید تا آموزشِ bottom navigationـه جدید رو قرار بدم و دیگه سراغِ کتابخونه‌های فرعی نریم.

73 دیدگاه برای “آموزش اندروید bottom bar متریال دیزاین

  1. سلام خسته نباشید میخاستم بدونم فقط مبحث طراحی رو آموزش میدید؟ مباحث ارتباط با سرور و اتصال به دیتابیس رو هم آموزش میدید با کتابخانه های والی و okhttp ؟؟
    ممنون از آموزش هاتون

  2. لایبرری رو نتونستم ادد کنم فک کنم بخاطر اینکه design م نسخه اش ۲۳ هست.
    بنظرتون همینه مشکل؟
    لایبرری بهتری پیدا نکردید؟

    1. نه احتمالا اگه از فیلتر شکن استفاده کنید درست میشه.
      اگر target api رو ۲۵ بکنید میتونید از bottom navigation جدید که گوگل در این نسخه به کتابخونه design اضافه کرده استفاده کنید ولی هنوز خیلی stable نیست. من خودم برای یه پروژه میخواستم استفاده کنم ولی باگ‌هایی داشت که منصرف شدم. این کتابخونه هم هست که اینم خوبه.

        1. یعنی چی گیر میده؟ این دو تا کتابخونه ارتباطی به ۲۳ یا ۲۵ ندارن. اون ۲۵ برای استفاده از bottom navigation پیش فرض اندروید بود.
          minimum sdkتون چنده؟

  3. این ارور رو میده:
    Error:A problem occurred configuring project ‘:app’.
    > Could not resolve all dependencies for configuration ‘:app:_debugCompile’.
    > Could not find com.android.support:design:25.0.0.
    Searched in the following locations:
    file:/C:/Program Files/Android/Android Studio/gradle/m2repository/com/android/support/design/25.0.0/design-25.0.0.pom
    file:/C:/Program Files/Android/Android Studio/gradle/m2repository/com/android/support/design/25.0.0/design-25.0.0.jar
    https://jcenter.bintray.com/com/android/support/design/25.0.0/design-25.0.0.pom
    https://jcenter.bintray.com/com/android/support/design/25.0.0/design-25.0.0.jar
    file:/C:/Users/AHMAD/AppData/Local/Android/sdk/extras/android/m2repository/com/android/support/design/25.0.0/design-25.0.0.pom
    file:/C:/Users/AHMAD/AppData/Local/Android/sdk/extras/android/m2repository/com/android/support/design/25.0.0/design-25.0.0.jar
    file:/C:/Users/AHMAD/AppData/Local/Android/sdk/extras/google/m2repository/com/android/support/design/25.0.0/design-25.0.0.pom
    file:/C:/Users/AHMAD/AppData/Local/Android/sdk/extras/google/m2repository/com/android/support/design/25.0.0/design-25.0.0.jar
    Required by:
    Factor:app:unspecified
    > Could not find com.android.support:design:25.0.0.
    Searched in the following locations:
    file:/C:/Program Files/Android/Android Studio/gradle/m2repository/com/android/support/design/25.0.0/design-25.0.0.pom
    file:/C:/Program Files/Android/Android Studio/gradle/m2repository/com/android/support/design/25.0.0/design-25.0.0.jar
    https://jcenter.bintray.com/com/android/support/design/25.0.0/design-25.0.0.pom
    https://jcenter.bintray.com/com/android/support/design/25.0.0/design-25.0.0.jar
    file:/C:/Users/AHMAD/AppData/Local/Android/sdk/extras/android/m2repository/com/android/support/design/25.0.0/design-25.0.0.pom
    file:/C:/Users/AHMAD/AppData/Local/Android/sdk/extras/android/m2repository/com/android/support/design/25.0.0/design-25.0.0.jar
    file:/C:/Users/AHMAD/AppData/Local/Android/sdk/extras/google/m2repository/com/android/support/design/25.0.0/design-25.0.0.pom
    file:/C:/Users/AHMAD/AppData/Local/Android/sdk/extras/google/m2repository/com/android/support/design/25.0.0/design-25.0.0.jar
    Required by:
    Factor:app:unspecified > com.aurelhubert:ahbottomnavigation:2.0.2

    1. اگه هنوزم با کتابخونه قبلی که آموزشش رو گذاشتم مشکل دارید و میخواید از این استفاده کنید سعی کنید از ورژن‌های قدیمی‌ترش استفاده کنید.
      اینجا لیست ورژن‌های مختلف رو می‌بینید.

        1. باید با فیلترشکن وارد اندروید استودیو بشید و بعد خودش پیشنهاد آپدیت میده و آپدیت کنید. اگه نداد میتونید از طریق منو‌های بالای صفحه آپدیت رو انتخاب کنید.
          یک راه دیگه هم که خودم انجام میدم اینه که توی gradle ورژن ۲۵ رو وارد میکنم و خود اندروید استودیو وقتی sdk نصب نباشه پیشنهاد میده که دانلود کنید.

          1. ممنون تونستم درستش کنم.وقتی داخل فرگمنت روی یک باتن کلیک میشه میخام اکتیویتی تو همون فرگمنت باز بشه مثل بازار و وقتی بک میزنه میخام به فرگمنت قبلی برگرده.با این کتابخانه امکانش هست؟ واگر بله اگر امکانش بود یه توضیح مختصری بدین ممنون میشم.

          2. بله اونجایی در کد که میگیم:

            transaction.replace(R.id.frameLayout, fragment1);
            transaction.commit();

            شما از این استفاده کنید:

            transaction.replace(R.id.frameLayout, fragment1);
            transaction.addToBackStack(null);
            transaction.commit();

  4. ببخشین زیاد سوال میپرسم.چطور میتونم اکتیویتی رو داخل فرگمنت لود کنم وقتی روی دکمه کلیک میکنه.
    transaction.replace(R.id.frameLayout, fragment1); این خط لود میکنه فرگمنت رو ؟؟؟؟؟

      1. برای مثال شما فکر کنین یه فروشگاه داریم که توی یه فرگمنت یه لیست ویو هست میخام با انتخاب هر آیتم توضیحات اون محصول توی همون فرگمنت نشون داده بشه و به تبهای کناری نمیخام بره و وقتی که بک میزنه دوباره تو همون فرگمنت لیست محصولات رو نشون بده.تشکر بابت پاسخگوییتون

        1. اگر بخواید توی همون فرگمنت که لیست هست نمایش داده بشه، یا باید لیست رو غیب و اطلاعات رو ظاهر کنید و با back زدن برعکس این کار رو انجام بدید. که اصلا کار درستی نیست و سربار بالایی هم داره. یا اینکه مثلا با کلیک روی هر آیتم توضیحات به شکل منوی کشویی زیر آیتم لیست (یا دیالوگ و…)نمایش داده بشه.
          اما کاری که درست و اصولی هست اینه که برای نمایش اطلاعات یک فرگمنت جدا در نظر بگیرید و با کلیک روی هر آیتم یک instance از فرگمنت جدید رو داخل تب نمایش بدید.

          1. اما کاری که درست و اصولی هست اینه که برای نمایش اطلاعات یک فرگمنت جدا در نظر بگیرید و با کلیک روی هر آیتم یک instance از فرگمنت جدید رو داخل تب نمایش بدید.?????متوجه نشدم میتونین بیشتر راهنمایی کنین ؟؟

  5. transaction.replace(R.id.frameLayout, fragment1);
    transaction.addToBackStack(null);
    transaction.commit();
    اینو اضافه کردم درست شد.ولی وقتی بک میزنم به تب قبلی برمیگرده ولی رنگش عوض نمیشه

    1. من با این مشکل برخورد نکردم ولی اگر وجود داره مشکل از کتابخونه‌ست. به صفحه کتابخونه برید و در قسمت issues جستجو کنید. اگر چنین مشکلی باشه احتمالا قبل از شما کسی پرسیده و جوابش موجوده. اگر نبود هم خودتون یک issue باز کنید و بپرسید.

  6. سلام
    ممنونم از اموزش های خوبت
    میگما بعد از ایمپورت کتابخونه ، نوشتی یه دایرکتوری زیرشاخه ی res درست می کنیم به اسم xml!!! فک کنم به اسم menu باید درست کنیم
    بعد اینکه من طبق آموزش شما پیش رفتم اما توی همین لایه ی xml که بالاتر گفتم به تگ های tab خطا میگیره !!!

  7. منظورم اینکه وقتی دکمه بک رو که میزنم به تب قبلی برمیگرده ولی مجدد میخام به تب قبلیه قبلی برگردم حتما باید ۲ بار بک رو بزنم؟ برای مثال من ۵ تا تب دارم (A,B,C,D,E,F) از تب A میرم به تب B و از تب B به تب C میرم و وقتی دکمه بک رو میزنم به تب B برمیگرده ولی وقتی دوباره از تب B به تب A میخام برگردم باید حتما ۲ بار دکمه بک رو بزنم.میدونین مشکلم کجاست؟ در ضمن از Bottombar Navigition استفاده میکنم.ممنون میشم راهنمایی کنین

      1. با تب قبل با یک بار زدن بک برمیگرده ولی وقتی به تب قبلی برگشتیم و خواستیم دوباره با تب قبلتر برگردیم این بار دیگه با یکبار زدن برنمیگرده باید ۲ بار زده بشه تا برگرده

  8. سلام مشکل رو فهمیدم کجاست حل شد ولی وقتی که بک میزنم و به تب قبلی برمیگرم رنگ تب عوض نمیشه؟ولی وقتی خودم تب رو انتخاب میکنم رنگش عوض میشه
    ممنون میشم راهنمایی کنید.

    1. شما باید این سوالات رو در قسمت issues مربوط به کتابخونه در گیت‌هاب مطرح کنی. معمولا این چنین باگ‌ها توی کتابخونه‌ها هست. بعد از اینکه گزارش کردی اگر مشکل قبلا مطرح شده باشه و حل شده باشه راه حل رو میگن وگرنه سوال رو علامت میزنن تا تو نسخه بعدی کتابخونه مشکل رو حل کنن.

  9. من این ارور را دارم
    Error:(33, 20) error: no suitable method found for add(int,FirstFragment)
    method FragmentTransaction.add(Fragment,String) is not applicable
    (argument mismatch; int cannot be converted to Fragment)
    method FragmentTransaction.add(int,Fragment) is not applicable
    (argument mismatch; FirstFragment cannot be converted to Fragment)

    1. باید همه کلاس‌ها و متدها از کتابخونه android.support.v4 باشن. توی importها دقت کن احتمالا اونجا اشتباه کردی.
      ایمپورت‌ها باید به شکل زیر باشن:
      android.support.v4.app.FragmentTransaction
      android.support.v4.app.Fragment

      1. سلام.تشکر.مشکل قبلی حل شد.
        اما این ارورهارو دارم و برنامه stop میشه.
        ۰۲-۰۶ ۰۰:۰۷:۳۸٫۷۴۲ ۱۳۹۵۵-۱۳۹۵۵/shop.mobcity.rubin.android.ir.shop E/AndroidRuntime: FATAL EXCEPTION: main
        Process: shop.mobcity.rubin.android.ir.shop, PID: 13955
        java.lang.RuntimeException: Unable to start activity ComponentInfo{shop.mobcity.rubin.android.ir.shop/shop.mobcity.rubin.android.ir.shop.SplashScreen}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2469)
        at android.app.ActivityThread.access$1100(ActivityThread.java:151)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362)
        at android.os.Handler.dispatchMessage(Handler.java:110)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:5551)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:730)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.NullPointerException
        at shop.mobcity.rubin.android.ir.shop.SplashScreen.onCreate(SplashScreen.java:37)
        at android.app.Activity.performCreate(Activity.java:5310)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2381)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2469) 
        at android.app.ActivityThread.access$1100(ActivityThread.java:151) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362) 
        at android.os.Handler.dispatchMessage(Handler.java:110) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:5551) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:730) 
        at dalvik.system.NativeStart.main(Native Method) 

          1. کرش تو خط ۳۷ کدهای splash screen اتفاق میفته که احتمالا مربوط به بخش‌های دیگه برنامتون میشه.
            اگه دقیقا طبق آموزش پیش رفتید نباید مشکلی باشه، یکبار کدهاتون رو با آموزش چک کنید.

  10. متشکرم واقعا شما اولین وب سایتی هستین ک چنین آموزش های کمیابی را قرار میدید و وب سایت شما را بوکمارک قرار دادم
    من همه کارای لازم انجام دادم و به درستی کار میکنه ولی برنامه ی من مثل اپ هایی مانند بازار یا سر آشپز پاپیون ک از همین کتابخونه استفاده میکنن میخوام داخل fragment از tablayout و viewpager استفاده کنم یعنی در حقیقت fragment inside fragment خواهد شد
    اگر متوجه نشدید میتونید داخل برنامه بازار و قسمت دسته بندی ها , برنامه و بازی تب بندی شدن … و درست کردن این قسمت هدف من هست
    من برنامه نویس مبتدی نیستم و سر نخ بدید میتونم انجام بدم متشکرم .

    1. خوشحالم به دردت میخوره آموزشا.
      ساده‌ست، فقط کافیه همونطوری که توی این آموزش viewpager رو داخل یک activity استفاده میکنیم به داخل فرگمنت ببری. تمام کارهایی که داخل اکتیویتی انجام شده رو میشه توی یک فرگمنت هم انجام داد.
      اگه نتونستی پیاده کنی بگو برات یکمی کد ایمیل کنم.

      1. طبق آموزش شما به نتیجه مورد نظرم رسیدم و انجام شد …
        فقط یک نکته من با هربار کلیک روی هر دکمه bottom bar فرگمنت ها refresh میشن و یا تخصصی تر redraw میشن ( فرض کنید حالا هر فرگمنت هم کلی لیست داره که از اینترنت میخونه و این باعث کندی میشه…) دقیقا هم کد های fragment من طبق آموزش هست .
        تشکر فراوان برای پاسخ گویی مفید و سریع

        1. خواهش میکنم. ما الان فرگمنت‌هامونو با دستور replace تغییر میدیم. این دستور باعث میشه جاوا فرگمنت قبلی رو متوقف و فرگمنت جدید رو اضافه کنه. اگه یه نگاهی به چرخه حیات فرگمنت بندازی میبینی که با متوقف شدن فرگمنت onViewCreated اجرا میشه. حالا اگر داده‌هات رو داخل این متد خونده باشی هر دفعه که فرگمنت متوقف میشه دوباره دیتا از اینترنت دانلود میشه ولی اگه خوندن دیتا رو منتقل کنی به onCreate این اتفاق نمیفته.
          ولی باز ممکنه این نیاز باشه که تو stateـی که کاربر توی فرگمنت قبلی بوده رو حفظ کنی. یعنی وقتی میاد روی تب قبلی دقیقا همون جایی باشه که قبلا بود. برای این کار بهترین راه اینه که به جای replace از دستور add استفاده کنی. فقط استفاده از این دستور یک مقداری ریزه کاری داره. نباید هردفعه که کاربر روی یک آیکون کلیک میکنه مجددا اون فرگمنت رو add کنی. بلکه دفعه اول فرگمنت رو add میکنی و دفعه‌های بعدی اون رو show میکنی. همچنین باید فرگمنت قبلی که ازونجا میای رو هم hide کنی.
          مثلا فرض کن کاربر از fragment1 اومده به fragment2 و حالا میخواد برگرده به fragment1 باید این کارو کنی:

          transaction.hide(fragment2);
          transaction.show(fragment1);

          1. سلام . تشکر از راهنمایی شما کاملا درست بود راهنماییتون و با استفاده از روش hide و show کردن سرعت تب ها بالا رفت .
            به امید به روز بودن سایت شما و استفاده از آموزش های خوبتون .

      2. خسته نباشید.آقای طاهر من یه مشکلی دارم میخوام از tab layout داخل bottom navigation استفاده کنم منتها tab layout سه تا تب(فرگمنت) داره و bottom navigation هم چهار تا تب(فرگمنت)داره که اون tablayout میخوام به یکی از تب هاش اضافه بشه.ینی فرگمنت توو فرگمنت میشه.من هنوز زیاد بلد نیستم هرچی ام میگردم راه حلشو پیدا نمیکنم. اگه میتونی بم شمرده توضیح بده چیکار کنم.دمت گرم

  11. سلام و خسته نباشید.وقتی با کلیک کردن روی یک دکمه وارد یک فرگمنت دیگه میشم و بعد در tab ها پیمایش میکنم برمیگرده به فرگمنت قبلی.چطوری جلوی این اتفاق رو بگیرم.یعنی بعد از پیمایشها و برگشت روی اون تب فرگمنت ٍثانویه نمایش داده بشه.

      1. سلام و درود مجدد.اقا فرض کنید سه تا تب داریم با فرگمنتهای a و b و c.که داخل فرگمنت a یک دکمه هست.با زدن این دکمه فرگمنت به d تغییر میکنه و وارد فرگمنت d میشه.ولی بعد از پیمایش بین تبها وقتی به همون تب برمیگرم به جای اینکه فرگمنت d رو نشون بده بر میگرده فرگمنت a رو نشون میده.چطور میشه روی همون فرگمنت d نگهس داشت؟

        1. یک boolean تعریف کنید و وقتی که فرگمنت d رو نمایش میدید مقدارش رو true کنید بعد توی activityـی که با استفاده از اون بین فرگمنت‌ها سوییچ می‌کنید باید یک شرط بذارید. اگر بولینتون true بود فرگمنت d رو نشون بدید و اگه false بود فرگمنت a.

          1. دقیقا همین کاررو هم کردم.ااما باز هم با پیمایش برمیگرده به فرگمنتی که در شروع برنامه باز شده بوده.
            case R.id.tab_profile:
            if (resault == 0) {
            transaction.add(R.id.frameLayout, fragmentprofile);

            }
            if (resault == 1) {
            transaction.add(R.id.frameLayout, tl);
            }
            if (resault == 2) {
            transaction.add(R.id.frameLayout, tabLogin2);
            }
            if (resault == 3) {
            transaction.add(R.id.frameLayout, tabLogin3);
            }
            if (resault == 4) {
            transaction.add(R.id.frameLayout, tabLogin4);
            }
            if (resault == 5) {
            transaction.add(R.id.frameLayout, profile);

            }
            یعنی من توی یکی از تبها اگر پنجتا فرگمنت تودرتو هم داشته باشم با پیمایش بین تبها و برگشت به همون تب برمیگرده به همون تبی که در ابتدای برنامه باز شده.

          2. اینجوری خیلی مشخص نیست مشکل چیه. شما باید پروژتون رو debug کنید ببینید مشکل از کجاست. حدسی که میزنم اینه که جایی که result رو میخواید تغییر بدید اشتباهی انجام شده یا اینکه یکبار مقدارش تغییر میکنه و دوباره جای دیگه مقدار قبلی رو میگیره.

  12. سلام.و تشکر بابت اموزسهای خوبتون.خیلی وقته مشکلی دارم حل هم نمیشه.چند بار هم از خودتون پرسیدم ولی به نتیجه نرسیدم.چون از if نمیتونم استفاده کنم.یعنی برنامم به گونه ای هستش که نمیشه با if این کارر رو کرد.سوالم این هستش:
    فرض کنید سه تا تب داریم با فرگمنتهای a و b و c.که داخل فرگمنت a یک دکمه هست.با زدن این دکمه از فرگمنت a به فرگمت d میریم و وارد فرگمنت d میشه.یعنی فرگمنتهای تودرتو.ولی بعد از پیمایش بین تبها وقتی به همون تب برمیگرم به جای اینکه فرگمنت d رو نشون بده،بر میگرده فرگمنت a رو نشون میده.چطور میشه روی همون فرگمنت d نگهش داشت؟

    1. خب باید اونجایی که کدهای مربوط به bottom bar رو نوشتی تغییر بدی. بدیهیه وقتی تعریف کردی که با کلیک روی یکی از المان‌های باتم بار فرگمنت a رو نشون بده، حتی اگه قبلا روی d بوده باشه باز هم a رو نشون میده. من متوجه نمیشم چه ساختاری هست که نمیشه if استفاده کرد. اگر طبق آموزش انجام داده باشی به راحتی می‌تونی یک شرط بذاری و اگر روی d رفته بود d رو نشون بدی. وقتی بین tab ها جابجا میشیم دیگه d از بین میره و چیزی برای نگه داشتن وجود نداره بنابراین باید جایی که داریم تعویض رو انجام میدیم حواسمون باشه قبلا روی d بوده یا a

  13. سلام . خسته نباشید آموزش خوبیه ولی من هنوز همون دستور اول گیر کردم.ممنون میشم اگه دقیقا بگیم من تو کدوم build.gridle و دقیقا کجاش کومپایل کنم؟ توی گریدل مربوط به پروژه که نوشته
    NOTE: Do not place your application dependencies here; they belong
    in the individual module build.gradle files
    توی گریدل app هم که میگه
    Error:Project :app: Provided dependencies can only be jars. com.roughike:bottom-bar:2.0.2@aar is an Android Library.
    چیکار کنم؟

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *