دوره مجازی اندروید (جلسه 12): آشنایی با ViewPager و TabLayout

‏  1 دقیقه
۰۹ مرداد ۱۳۹۵
دوره مجازی اندروید (جلسه 12): آشنایی با ViewPager و TabLayout

به نام خدا، دوستان سلام. توی این جلسه به معرفی viewpager و tablayout می پردازیم.برای پیاده سازی viewpager دوباره با recyclerview و fragment ها کار خواهیم کرد تا هم اینکه مروری بشه، همین که بیشتر کاربردشون رو درک بکنید.

مطالب مطرح شده در این جلسه عبارتند از :

 

  • ViewPager چیست؟
    • FragmentPagerAdapter چیست؟
    • FragmentStatePagerAdapter چیست؟
    • ایجاد Adapter برای ViewPager
    • متصل کردن Adapter به ViewPager
  • TabLayout چیست؟
    • متصل نمودن Tablayout به ViewPager
    • نمایش متن در Tablayout
:: توجه

این مطلب یک جلسه از آموزش برنامه نویسی اندروید می باشد و برای مشاهده آن باید در دوره ثبت نام کنید.

ثبت نام در آموزش برنامه نویسی اندروید

چه امتیازی به این مقاله می دید؟
نویسنده سعید شاهینی

جلسات دوره

پایان زمان پشتیبانی

دانشجوی گرامی، بازه پشتیبانی فعال برای این دوره ۳ ماه است که برای شما به پایان رسیده است.

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

نیاز به لاگین

برای ارسال دیدگاه و یا پرسیدن سوال خود در این قسمت، باید در سایت لاگین شوید.

نظرات کاربران

محمد صالح سالاری

سلام استاد خسته نباشید من تو ویدیوی شماره دوازده تون گیر کردم و چند بار سعی کردم و پروژه رو از نو نوشتم ولی بازم این ارور رو میده لطفا بگین چیکار کنم؟؟؟
Process: com.example.tamrin1, PID: 10366
java.lang.NullPointerException: Attempt to invoke virtual method ‘void androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)’ on a null object reference
at com.example.tamrin1.ClothFFragment.onCreateView(ClothFFragment.java:25)

این قطعه کدی که میگه مشکل داره

        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
سید محمد وجدانی زاده

سلام خسته نباشید من در آخر اموزش
اخرین بخش کد نویسی متد getSupportFragmentManager رو ندارم
لطفا راهنمایی کنید ممنون

Hadi

سلام. دو تا سوال داشتم
1. وقتی TabLayout رو در اکتیویتی میگیرم پروژه ران نمیشه و میگه متاسفانه متوقف شد. توی بخش Android Monitor اروری نمیبینم که بشه برا شما بفرستم. چه چیزی بفرستم که بشه اشکال رو ازش متوجه شد؟
2. پروژه این جلسه رو وقتی با اندروید استدیو خودم (ورژن 2.3.3) باز میکنم فایل های پروژه رو نمیشناسه و نوار زرد رنگی بالای صفحه میاد و مینویسه Project SDK is not defined. کنارش هم نوشته setup SDK و وقتی روش میزنم میگه SDK رو انتخاب کن و بعدش هم هیچ اتفاقی نمیوفته. مشکل رو چطور باید برطرف کنم؟
تشکر

سعید شاهینی

سلام،
پاسخ 1: داخل تب Logcat (پایین اندروید استودیو) می تونید نوشته هایی رو ببینید که متن ارور ها داخلش با رنگ قرمز نمایش داده می شن.
پاسخ 2: باید روی لینک setup sdk کلیک کنید و مسیر پوشه sdk خودتون رو بهش بدید

Hadi

اروری که برا سوال اول میده نمایش داده شد. ارور این هست:

10-17 08:55:44.763 19210-19210/? E/memtrack: Couldn’t load memtrack module (No such file or directory)
10-17 08:55:44.763 19210-19210/? E/android.os.Debug: failed to load memtrack module: -2
10-17 08:55:45.036 19229-19229/? E/memtrack: Couldn’t load memtrack module (No such file or directory)
10-17 08:55:45.036 19229-19229/? E/android.os.Debug: failed to load memtrack module: -2
10-17 08:55:47.767 19243-19243/? E/memtrack: Couldn’t load memtrack module (No such file or directory)
10-17 08:55:47.767 19243-19243/? E/android.os.Debug: failed to load memtrack module: -2
10-17 08:55:47.968 19257-19257/? E/memtrack: Couldn’t load memtrack module (No such file or directory)
10-17 08:55:47.968 19257-19257/? E/android.os.Debug: failed to load memtrack module: -2
10-17 08:55:48.302 19272-19272/? E/memtrack: Couldn’t load memtrack module (No such file or directory)
10-17 08:55:48.302 19272-19272/? E/android.os.Debug: failed to load memtrack module: -2
10-17 08:55:48.542 19287-19287/? E/memtrack: Couldn’t load memtrack module (No such file or directory)
10-17 08:55:48.542 19287-19287/? E/android.os.Debug: failed to load memtrack module: -2
10-17 08:55:49.012 19301-19301/? E/cutils-trace: Error opening trace file: Permission denied (13)
10-17 08:55:49.288 1784-3148/com.google.android.gms.persistent E/NetworkScheduler.SR: Unrecognised action provided: android.intent.action.PACKAGE_REMOVED
10-17 08:55:49.621 19331-19331/? E/memtrack: Couldn’t load memtrack module (No such file or directory)
10-17 08:55:49.621 19331-19331/? E/android.os.Debug: failed to load memtrack module: -2
10-17 08:55:49.695 19344-19344/? E/libprocessgroup: failed to make and chown /acct/uid_10059: Read-only file system
10-17 08:55:50.102 19344-19344/com.example.hadi_lenovo.project1 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                  Process: com.example.hadi_lenovo.project1, PID: 19344
                                                                                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hadi_lenovo.project1/com.example.hadi_lenovo.project1.view.activity.BooticActivity}: java.lang.ClassCastException: android.widget.TableLayout cannot be cast to android.support.design.widget.TabLayout
                                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
                                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                                                                                      at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                      at android.os.Looper.loop(Looper.java:135)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                                                                                   Caused by: java.lang.ClassCastException: android.widget.TableLayout cannot be cast to android.support.design.widget.TabLayout
                                                                                      at com.example.hadi_lenovo.project1.view.activity.BooticActivity.onCreate(BooticActivity.java:17)
                                                                                      at android.app.Activity.performCreate(Activity.java:5990)
                                                                                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
                                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                                                                                      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                      at android.os.Looper.loop(Looper.java:135) 
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:5254) 
                                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                                      at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
10-17 08:55:50.122 1171-1171/? E/EGL_emulation: tid 1171: eglCreateSyncKHR(1865): error 0x3004 (EGL_BAD_ATTRIBUTE)
سیدسبحان صانعی

سلام من وقتی میخام پروژمو تست کنم این پیام برا میاد باید چیکار کنم؟؟؟
Error:Execution failed for task ‘:app:processDebugManifest’.
> Manifest merger failed : Attribute meta-data#[email protected] value=(25.3.1) from [com.android.support:appcompat-v7:25.3.1] AndroidManifest.xml:27:9-31
is also present at [com.android.support:recyclerview-v7:26.0.0-alpha1] AndroidManifest.xml:24:9-38 value=(26.0.0-alpha1).
Suggestion: add ‘tools:replace=”android:value”‘ to element at AndroidManifest.xml:25:5-27:34 to override.

سعید شاهینی

سلام، دلیلش تداخل manifest لایبرری هایی که به پروژه اضافه کردید با manifest پروژه خودتون هست. بایستی ورژن لایبرری recyclerview با appcompat داخل build.gradle یکی باشه، ورژن recyclerview رو به ۲۵.۳.۱ تغییر بدید مشکل حل می شه.

حامد

چطور می توان از یک Fragment یک activity دیگری را باز کرد ؟؟

سعید شاهینی

سلام، از متد startActivity باید استفاده کنید و اکتیویتی مقصد رو مشخص کنید

حامد

ارور دیگه ای هم دارم که تو صفحه xml هست
Failed to load AppCompat ActionBar with unknown error. (3 similar errors not shown)
بخاطر این ارور
Preview اپ رو ندارم

سعید شاهینی

داخل فایل styles.xml برید و theme رو AppCompat.Theme.Light.NoActionBar رو انتخاب کنید ببینید درست می شه یا نه

مهدی پاکروان

سلام
واقعا از این دوره ی خوب ممنونم من تا حالا 3 تا دوره از سایت های دیگه خریدم ولی واقعا آموزش های سایت شما با بقیه سایت ها فرق داره خیلی عالیه و کاربردی .
به همه ی دوستام که میخوان آموزش جدیدی بخرن حتما پیشنهاد میکنم ممنونم

سعید شاهینی

سلام، خیلی ممنونم، شما لطف دارید. خوشحالم که اینطوره

Hamid Azhdari

سلام و خسته نباشید استاد
من تمامی مراحل رو 3 بار یعنی از اول ساخت یک layout برای recycle view پیش رفتم تا آخر این جلسه و هر بار موقع اجرای نهایی بدون نشون دادن یه ارور توی android studio برنامه توی ماشین مجازی بعد از نشون دادن یه صفحه سفید می نوشت متاسفم برنامه متوقف شد و می پرید بیرون
امروز بعد کلی مغز ترکوندن رفتم یه اندروید بالاتر یعنی اندروید 7 و برنامه اجرا شد بدون هیچ مشکلی

حالا مشکل من اینه که من اول کار api 17 رو انتخاب کردم ولی الان باید حتمی اندروید 7 باشه تا اجرا بشه
ممنون میشم بگید مشکل کارم کجاست
خودم فکر می کنم از قسمتی که depencnsiy رو انتخاب کردم باشه چون بعد از گرفتن liberary بصورت دستی ورژن liberary رو به ورژن compile خودم تغییر دادم.

  compile ‘com.android.support:appcompat-v7:24.0.0’
 testCompile ‘junit:junit:4.12’
 compile ‘com.android.support:recyclerview-v7:24.0.0’
 compile ‘com.android.support:design:24.0.0’ 

قسمت هاییrecycle و design بعد از اضافه شدن خودشون 26-0-0-alpha بود که خودم مجبور شدم تغییرش بدم

ممنون ببخشید سرتونو درد اوردم

سعید شاهینی

سلام٬ احتمالا از متدی استفاده شده داخل کدهاتون که داخل api 17 کار نمی کنه. از خطایی که می ده اسکرین شات بگیرید و ارسال کنید تا دقیق تر بتونم راهنماییتون کنم.

مسعود معینی

سلام

اینطور که من متوجه شدم به این دلیل از ViewPager استفاده میکنیم تا کاربر بتونه بین فرگمنت ها swipe کنه. اگر درست متوجه شده باشم ما میتونیم چند فرگمنت رو توسط چند دکمه در یک FrameLayout فراخوانی کنیم بدون اینکه نیاز به ViewPager باشه. درسته ؟

سعید شاهینی

سلام٬ بله اما viewpager کارهایی دیگه ای هم انجام می ده مثل مدیریت lifecycle فرگمنت ها. مثلا زمانی که تعداد فرگمنت های زیاد باشه فقط مقدار مشخصی از اون ها رو داخل حافظه نگه می داره.

Rochezto Delaporana

سلام استاد شاهینی

بنده مطالب این جلسه رو انجام دادم. در آخر شکل اکتیویتی بوتیک من به این شکل در آمد:
http://s1.picofile.com/file/8287060968/malehman.PNG

به غیر از ردیف اول بقیه ردیف ها نیستن. اینم فایل جاوا و xml مربوط به پروژه:
java

 package com.example.pooria.a7learnpractice.view.activity;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.pooria.a7learnpractice.R;
import com.example.pooria.a7learnpractice.adaptor.ClothesViewPagerAdaptor;
public class BoutiqueActivity extends AppCompatActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_boutique);
  TabLayout tabLayout=(TabLayout)findViewById(R.id.tablayout);
  ViewPager viewPager=(ViewPager)findViewById(R.id.viewpager);
  ClothesViewPagerAdaptor adaptor=new ClothesViewPagerAdaptor(getSupportFragmentManager());
  viewPager.setAdapter(adaptor);
  tabLayout.setupWithViewPager(viewPager);
 }
}
 

xml:

http://s4.picofile.com/file/8287062334/xml.PNG

اگر به کد مربوط به قسمت های دیگه هم نیاز هست بفرمایید اونهارو هم می فرستم.

با تشکر

سعید شاهینی

سلام٬ متاسفانه عکس هاتون باز نمی شن. به ایمیلم فایل xml مربوط به layout سطر رو ارسال کنید.

سعید شاهینی

سلام٬ بله داخل لیست آموزش ها قرار دادم٬ اردیبهشت ماه دوره آپدیت می شه و این آموزش رو هم یادداشت کردم که قرار بدم