عکس : سایت http://www.androidhive.info  

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

یک ویژگی viewpager این است که setoffscreenpagelimit  برای اون حداقل می تونه یک باشه. 

Setoffscreenpagelimit = امکان این که چند تب از هر دو طرف تب در حال اجرای شما، همزمان با هم لود شوند.

من میخواستم که وقتی بین تب ها هر وقت سویچ می کنم فرگمنت داخل اونها کامل Destroy‌ بشه و دوباره از اول ساخته بشه اما این عمل انجام نمی شد یعنی اگر شما بلافاصله به تب های کناریتون سویچ کنید،‌اونها از قبل لود شدن. هرکاری کردم این کار درست نشده که بتونم کاری کنم که تب های کناری بدون اینکه Select بشن لود نشن از قبل. بعد از کلی تحقیق متوجه شدم که  راهی جز حذف ویوپیجر ندارم.

این Tablayout whithout Viewpager   لینکی است که ازش استفاده کردم برای این کار 


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

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

راه حلش رو پیدا کردم و براتون قرار دادم امیدوارم بتونه به صرفه جویی در زمان شما کمک کنه.


چند نکته هست که باید رعایت کنید 
۱- در کد رو به رو باید اخرین فرگمنت دست چپ رو قرار بدهید. (منظور شماره اون هست)
tabs_fragment.getTabAt(1).select();

۲- کدهایی رو که مربوط به Ui نیست رو در متد onActivityCreat‌ قراردهید. 

۳-  یکی از نکته هایی که من متوجه شدم این بود که در این روش اولویت ها مهم هستن یعنی از بالا اخرین فرگمنت سمت چپ می باشد.(دلیل آن هم انگلیسی بودن این موضوع است که  سازندگان از چپ اول را در نظر می گیرند و ما میخوایم برای فارسی از راست در نظر بگیریم) . 
true  را هم به اخرین تب سمت چپی می دهیم. در حالت نرمال باید به اولین تب سمت راست true‌ را در نظر بگیریم که هنگام اجرا روی اولین تب سمت راست سلکت شده باشد اما در اینجا برعکس است.

private void setupTabLayout() {
   
fragment2 = new RequestFrienshipFragment();
   
fragment1 = new FriendshipFragment();
   
tabs_fragment.addTab(tabs_fragment.newTab().setText("two"), true);
   
tabs_fragment.addTab(tabs_fragment.newTab().setText("one"));
}


۴- اولویتی که رو هم که در بالا اجرا کردیم باید همین را در این قسمت اجرا کنیم.

private void setCurrenttabFragment(int tabPosition) {
   
switch (tabPosition) {
       
case 0:
            replaceFragment(
fragment2);
           
break;
       
case 1:
            replaceFragment(
fragment1);
           
break;
    }
}

اگر سوالی در مورد Tablayout‌ داشتید در قسمت نظرات بپرسید در کمترین زمان پاسخ گوی شما هستم. 


کد کامل :

public class FriendsFragment2 extends Fragment {
    CustomTabLayout
tabs_fragment;
    FriendshipFragment
fragment1;
    RequestFrienshipFragment
fragment2;
   
public FriendsFragment2() {
       
// Required empty public constructor
   
}

   
@Nullable
    @Override
   
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container
            ,
@Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.
fragment_friends2, container, false);
       
tabs_fragment = (CustomTabLayout) rootView.findViewById(R.id.tabs_fragment);
       
return rootView;
    }
   
@Override
   
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
       
super.onActivityCreated(savedInstanceState);

       setupTabLayout();
       EventTab();
       
tabs_fragment.post(new Runnable() {
           
@Override
           
public void run() {
               
tabs_fragment.getTabAt(1).select();
            }
        });
   }

   
private void setupTabLayout() {
       
fragment2 = new RequestFrienshipFragment();
       
fragment1 = new FriendshipFragment();
       
tabs_fragment.addTab(tabs_fragment.newTab().setText("درخواست دوستی"), true);
       
tabs_fragment.addTab(tabs_fragment.newTab().setText("دوستان"));
    }
   
private void EventTab() {
       
tabs_fragment.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
           
@Override
           
public void onTabSelected(TabLayout.Tab tab) {
                setCurrenttabFragment(tab.getPosition());
            }

           
@Override
           
public void onTabUnselected(TabLayout.Tab tab) {
            }
           
@Override
           
public void onTabReselected(TabLayout.Tab tab) {
            }
        });
    }
   
private void setCurrenttabFragment(int tabPosition) {
       
switch (tabPosition) {
           
case 0:
                replaceFragment(
fragment2);
               
break;
           
case 1:
                replaceFragment(
fragment1);
               
break;
        }
    }
   
private void replaceFragment(Fragment fragment) {
        FragmentManager fm = getChildFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
;         ft.replace(R.id.frame_container_friends_fragment, fragment);
        ft.setTransition(FragmentTransaction.
TRANSIT_FRAGMENT_OPEN);
        ft.commit()