1

我想在我的應用程序的選項卡中創建選項卡。我在MainActivity XML文件和ViewPager中創建了一個TabLayout。然後我創建了另一個XML文件,其中包含內部TabLayout及其相應的ViewPager。現在,當我運行我的應用程序時,除了我的第一個選項卡(主圖標選項卡)外,我可以看到所有其他選項卡的充氣視圖。另外,當我選擇了一個沒有被看到的內部選項卡時,我會顯示一個CardView。請幫忙! 這是我的MainActivity.java代碼:ViewPager不會膨脹所有XML佈局文件

public class MainActivity extends AppCompatActivity { 

    ViewPager viewPagerOuter, viewPagerInner; 
    TabLayout tabLayoutouter, tabLayoutinner; 

    public static class InnerFragment extends Fragment{ 
    private static final String TAB_POSITION = "tab_position"; 
    View rootView; 
    public InnerFragment(){ 

    } 
    public static InnerFragment newInstance(int tabPosition){ 
     InnerFragment fragment = new InnerFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(TAB_POSITION, tabPosition); 
     fragment.setArguments(args); 
     return fragment; 
    } 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     Bundle args = getArguments(); 
     int tabPosition = args.getInt(TAB_POSITION); 
     switch (tabPosition){ 
      case 0:{ 
       rootView = inflater.inflate(R.layout.card_view_layout, container, false); 
       break; 
      } 
      case 1:{ 
       TextView tv = new TextView(getActivity()); 
       tv.setGravity(Gravity.CENTER); 
       tv.setText("Text in tab #" + tabPosition); 
       rootView = tv; 
       break; 
      } 
     } 
     return rootView; 
    } 
} 
static class InnerPagerAdapter extends FragmentStatePagerAdapter{ 
    public InnerPagerAdapter(FragmentManager fm){ 
     super(fm); 
    } 
    @Override 
    public Fragment getItem(int position) { 
     return InnerFragment.newInstance(position); 
    } 

    @Override 
    public int getCount() { 
     return 2; 
    } 

    @Override 
    public CharSequence getPageTitle(int position){ 
     String x = ""; 
     switch (position){ 
      case 0: 
       x = "feed"; break; 
      case 1: 
       x = "events"; break; 
     } 
     return x; 
    } 
} 

public static class OuterFragment extends Fragment{ 
    private static final String TAB_POSITION1 = "tab_position"; 
    View rootView; 
    public OuterFragment(){ 

    } 
    public static OuterFragment newInstance(int tabPosition){ 
     OuterFragment fragment1 = new OuterFragment(); 
     Bundle args1 = new Bundle(); 
     args1.putInt(TAB_POSITION1, tabPosition); 
     fragment1.setArguments(args1); 
     return fragment1; 
    } 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater1, ViewGroup container1, Bundle savedInstanceState){ 
     Bundle args1 = getArguments(); 
     int tabPosition = args1.getInt(TAB_POSITION1); 
     switch (tabPosition){ 
      case 0:{ 
       rootView = inflater1.inflate(R.layout.inner_tab_layout, container1, false); 
       break; 
      } 
      default:{ 
       TextView tv = new TextView(getActivity()); 
       tv.setGravity(Gravity.CENTER); 
       tv.setText("Text in tab #" + tabPosition); 
       rootView = tv; 
       break; 
      } 
     } 
     return rootView; 
    } 
} 
static class OuterPagerAdapter extends FragmentStatePagerAdapter{ 
    public OuterPagerAdapter(FragmentManager fm){ 
     super(fm); 
    } 
    @Override 
    public Fragment getItem(int position) { 
     return OuterFragment.newInstance(position); 
    } 

    @Override 
    public int getCount() { 
     return 4; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) {return null;} 
} 
final int icons[] = new int[]{R.drawable.ic_chat_black_24dp, R.drawable.ic_home_black_24dp, R.drawable.ic_notifications_black_24dp, R.drawable.ic_person_black_24dp}; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    InnerPagerAdapter innerPagerAdapter = new InnerPagerAdapter(getSupportFragmentManager()); 
    OuterPagerAdapter outerPagerAdapter = new OuterPagerAdapter(getSupportFragmentManager()); 

    viewPagerOuter = (ViewPager) findViewById(R.id.viewpagerouter); 
    viewPagerOuter.setAdapter(outerPagerAdapter); 
    tabLayoutouter = (TabLayout) findViewById(R.id.tablayoutouter); 

    final LayoutInflater factory = getLayoutInflater(); 
    final View view = factory.inflate(R.layout.inner_tab_layout, null); 
    viewPagerInner = (ViewPager) view.findViewById(R.id.viewpagerinner); 
    viewPagerInner.setAdapter(innerPagerAdapter); 
    tabLayoutinner = (TabLayout) view.findViewById(R.id.tabLayoutinner); 
    tabLayoutinner.setupWithViewPager(viewPagerInner); 
} 
} 

這是MainActivity的XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tablayoutouter" 
     android.support.tabIndicatorColor="?attr/colorPrimary" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="?attr/colorPrimary" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark" 
     app:tabGravity="fill" 
     app:tabIndicatorColor="@color/colorPrimary" 
     app:tabSelectedTextColor="@android:color/background_light"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpagerouter" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" > 

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

</LinearLayout> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentRight="true" 
    android:layout_marginRight="16dp" 
    android:layout_marginBottom="16dp" 
    android:src="@drawable/ic_create_black_24dp" /> 

</RelativeLayout> 

這是inner_tab_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<android.support.design.widget.TabLayout 
    android:id="@+id/tabLayoutinner" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:tabGravity="fill" 
    app:tabIndicatorColor="@color/colorPrimaryDark" 
    app:tabSelectedTextColor="@color/colorBlack"> 
</android.support.design.widget.TabLayout> 

<android.support.v4.view.ViewPager 
    android:id="@+id/viewpagerinner" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" /> 

</LinearLayout> 

我張貼這樣長的對不起代碼位。請不要介意..

回答

0

viewPagerInner,tabLayoutinnerinnerPagerAdapter代碼改爲OuterFragment

1.更新您的OuterFragment如下:

public static class OuterFragment extends Fragment { 
    private static final String TAB_POSITION1 = "tab_position"; 
    View rootView; 

    ViewPager viewPagerInner; 
    TabLayout tabLayoutinner; 

    public OuterFragment(){ 

    } 
    public static OuterFragment newInstance(int tabPosition){ 
     OuterFragment fragment1 = new OuterFragment(); 
     Bundle args1 = new Bundle(); 
     args1.putInt(TAB_POSITION1, tabPosition); 
     fragment1.setArguments(args1); 
     return fragment1; 
    } 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater1, ViewGroup container1, Bundle savedInstanceState){ 
     Bundle args1 = getArguments(); 
     int tabPosition = args1.getInt(TAB_POSITION1); 
     switch (tabPosition){ 
      case 0:{ 
       rootView = inflater1.inflate(R.layout.inner_tab_layout, container1, false); 

       viewPagerInner = (ViewPager) rootView.findViewById(R.id.viewpagerinner); 
       tabLayoutinner = (TabLayout) rootView.findViewById(R.id.tabLayoutinner); 

       InnerPagerAdapter innerPagerAdapter = new InnerPagerAdapter(getActivity().getSupportFragmentManager()); 

       viewPagerInner.setAdapter(innerPagerAdapter); 
       tabLayoutinner.setupWithViewPager(viewPagerInner); 

       break; 
      } 
      default:{ 
       TextView tv = new TextView(getActivity()); 
       tv.setGravity(Gravity.CENTER); 
       tv.setText("Text in tab #" + tabPosition); 
       rootView = tv; 
       break; 
      } 
     } 
     return rootView; 
    } 
} 

2.更新onCreate()方法如下:

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

    viewPagerOuter = (ViewPager) findViewById(R.id.viewpagerouter); 
    tabLayoutouter = (TabLayout) findViewById(R.id.tablayoutouter); 

    OuterPagerAdapter outerPagerAdapter = new OuterPagerAdapter(getSupportFragmentManager()); 

    viewPagerOuter.setAdapter(outerPagerAdapter); 
    tabLayoutouter.setupWithViewPager(viewPagerOuter); 
} 

希望這將工作〜

+0

在0的情況下,它說getSupportFragmentManager()不能從靜態上下文訪問。 – thapro

+0

使用getActivity()。getSupportFragmentManager();我已經更新了我的答案。 – FAT

+0

我發現了一個小問題。在滾動到外部TabLayout中最後一個選項卡並回到第一個選項卡後,我發現卡片視圖不顯示。此外,內TabLayout中的選項卡數量增加了...我不知道爲什麼...任何想法? – thapro