0

我的應用程序中的頂級活動包含一個帶有自定義ViewPager(禁用滑動手勢)和FragmentPagerAdapter的固定選項卡欄。由片段中的ViewPager控制的片段不會出現

這個標籤欄允許訪問三個不同的片段,並且在第一個片段中,我希望能夠在與該片段相關的視圖之間滑動。

最初我嘗試使用ViewFlipper,但是我無法獲得與ViewPager一樣的手勢,所以現在我試圖在片段中實現ViewPager。

我用於ViewPager的代碼來自AnimationsDemo項目,該項目可以在關於ViewPager的this頁面上找到。雖然我通過移除可以使用按鈕按下在視圖之間切換的下方條進行一些小調整。

這是我的片段是什麼樣子:

import android.app.Fragment; 
import android.app.FragmentManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v13.app.FragmentStatePagerAdapter; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup;  

public class NewsFragment extends Fragment { 
    private static final int NUM_PAGES = 5; 
    private ViewPager mPager; 
    private PagerAdapter mPagerAdapter;  

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.activity_screen_slide, container, false); 

     mPager = (ViewPager) rootView.findViewById(R.id.pager); 
     mPagerAdapter = new ScreenSlidePagerAdapter(getFragmentManager()); 
     new setAdapterTask().execute(); 

     return rootView; 
    } 

    private class setAdapterTask extends AsyncTask<Void,Void,Void>{ 
      protected Void doInBackground(Void... params) { 
       return null; 
      }  

      @Override 
      protected void onPostExecute(Void result) { 
         mPager.setAdapter(mPagerAdapter); 
      } 
    } 

    /** 
    * A simple pager adapter that represents 5 {@link ScreenSlidePageFragment} objects, in 
    * sequence. 
    */ 
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
     public ScreenSlidePagerAdapter(FragmentManager fm) { 
      super(fm); 
     }  

     @Override 
     public Fragment getItem(int position) { 
      return ScreenSlidePageFragment.create(position); 
     }  

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

以及屬於它的XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 
    <TextView 
     android:id="@+id/textviewscreenslide" 
     android:text="Screen slide fragment" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     /> 
    <android.support.v4.view.ViewPager 
     android:layout_below="@+id/textviewscreenslide" 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</RelativeLayout> 

我使用的AsyncTask由於this這裏後在計算器上,因爲我偶爾會在快速切換標籤項時出現該錯誤。

這是什麼,我要顯示的片段看起來像:

import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView;  

public class ScreenSlidePageFragment extends Fragment { 
    public static final String ARG_PAGE = "page"; 
    private int mPageNumber;  

    public static ScreenSlidePageFragment create(int pageNumber) { 
     ScreenSlidePageFragment fragment = new ScreenSlidePageFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PAGE, pageNumber); 
     fragment.setArguments(args); 
     return fragment; 
    }  

    public ScreenSlidePageFragment() { 
    }  

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mPageNumber = getArguments().getInt(ARG_PAGE); 
    }  

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_screen_slide_page, container, false); 
     ((TextView) rootView.findViewById(android.R.id.text1)).setText(getString(R.string.title_template_step, mPageNumber + 1)); 
     return rootView; 
    }  

    public int getPageNumber() { 
     return mPageNumber; 
    } 
} 

而且連同它的XML:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <LinearLayout android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:padding="16dp"> 
     <TextView android:id="@android:id/text1" 
      style="?android:textAppearanceLarge" 
      android:textStyle="bold" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="16dp" /> 
     <TextView style="?android:textAppearanceMedium" 
      android:lineSpacingMultiplier="1.2" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/lorem_ipsum" /> 
    </LinearLayout> 
</ScrollView> 

所以,當我運行該程序包含的片段ViewPager顯得很好,我可以在頂部看到文本「屏幕幻燈片片段」,並且我沒有收到任何錯誤。我實際上也可以在這個片段中滑動ViewPager。當我向右滑動時,我可以看到左側出現的藍色指示符,表示我處於第一個片段,而當我向左滑動幾次時,此指示符出現在右側。所以ViewPager實際上就在那裏,碎片就不會出現。

我遇到this項目,這是關於一個嵌套的ViewPager,但看起來這個需要至少API級別17.所以它可能不可能。

所以我的問題是,有沒有辦法讓這些碎片出現(只支持4.0和更新)或者是否有另一種更有效的方式來切換碎片/視圖(碎片的所有視圖尋呼機在佈局方面將完全相同,唯一不同的是TextView中的文本)。也許甚至有另一個線程完全解釋了我完全錯過的同一個問題。

回答

1

解決這個問題很簡單。我使用this項目中的代碼和v4支持庫。我有這個問題,爲什麼它不工作,因爲我也有項目中的v13支持庫,干擾getChildFragmentManager()。由於v13在那裏功能被識別,即使我從未真正使用過v13。