2016-10-25 96 views
0

我正在使用SDK API級別23, 安卓應用程序我有一個屏幕與選項卡布局與viewpager。問題是當我點擊一個選項卡上的下一個選項卡上創建是火!安卓選項卡意外的行爲

這裏是標籤片段的代碼:

package com.systemonline.fanscoupon.coupon_tabs; 

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.design.widget.TabLayout; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.systemonline.fanscoupon.Base.BaseFragment; 
import com.systemonline.fanscoupon.R; 

import java.lang.reflect.Field; 

public class CouponTab extends BaseFragment { 

public static TabLayout tabLayout; 
public static ViewPager viewPager; 
public static int int_items = 3; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View x = inflater.inflate(R.layout.cop_tabs_layout, null); 
    tabLayout = (TabLayout) x.findViewById(R.id.tabs); 
    viewPager = (ViewPager) x.findViewById(R.id.viewpager); 

    viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 

    tabLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      tabLayout.setupWithViewPager(viewPager); 
     } 
    }); 

    return x; 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 

    try { 
     Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); 
     childFragmentManager.setAccessible(true); 
     childFragmentManager.set(this, null); 

    } catch (NoSuchFieldException e) { 
     throw new RuntimeException(e); 
    } catch (IllegalAccessException e) { 
     throw new RuntimeException(e); 
    } 
} 
class MyAdapter extends FragmentPagerAdapter { 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return new AllCouponsFragment(); 
      case 1: 
       return new OnlyForYouCouponsFragment(); 
      case 2: 
       return new MyCouponsFragment(); 
     } 
     return null; 
    } 


    @Override 
    public int getCount() { 

     return int_items; 

    } 

    @Override 
    public CharSequence getPageTitle(int position) { 

     switch (position) { 
      case 0: 
       return getResources().getString(R.string.all_cop); 
      case 1: 
       return getResources().getString(R.string.only_for_you); 
      case 2: 
       return getResources().getString(R.string.my_cop); 
     } 
     return null; 
    } 
} 
} 

這裏是佈局的XML代碼:

<android.support.design.widget.TabLayout 
    android:id="@+id/tabs" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/material_blue_grey_800" 
    app:tabGravity="fill" 
    app:tabIndicatorColor="@color/orange" 
    app:tabMode="fixed" 
    app:tabSelectedTextColor="@color/orange" 
    app:tabTextColor="@color/white"> 

</android.support.design.widget.TabLayout> 

<android.support.v4.view.ViewPager 
    android:id="@+id/viewpager" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

</android.support.v4.view.ViewPager> 
+0

根據android的內存管理,由「FragmentPagerAdapter」完成。它創建並保存內存中的下一個和前一個片段,輕鬆地進行輕掃/更改。 –

回答

1

我不認爲這是一個意外的行爲。因爲ViewPager默認加載3個項目。

  1. 以前
  2. 當前
  3. 下一個

出於這個原因,當你走任何項目,它會自動創建一個項目& onCreate()被調用。

+0

感謝您的答案,但是我可以阻止viewPager加載上一個和下一個項目,如果沒有,是否有另一種方式,而不是使用viewpager來創建不加載其他項目的選項卡? –

+0

setOffscreenPageLimit(0)不起作用.. –

+0

通常,viewpager.setOffscreenPageLimit()將執行保留屏幕外存的工作。但在代碼中,我看到它不會接受小於1.您可以根據您的要求將代碼寫入其他回調,如onCreateView或setUserVisibleHint(boolean isVisibleToUser)。 – Sayem