0

我試圖做一個片段,以顯示用戶的提示。該片段的createView方法返回一個ViewPager並通過AsyncTask設置PagerAdapter。當用戶按下一個按鈕時,這個片段將在FragmentActivity中被添加。如果用戶再次到達最後一個按下相同按鈕的項目,則從FragmentActivity中刪除此片段。請注意,我將這個片段添加到由android.R.id.content標識的FrameLayout中。ViewPager沒有加載項目後刪除並重新添加到FrameLayout

好吧,我第一次按下按鈕,它按預期工作。但第二次按下按鈕時,ViewPager不會出現。當我使用View Hierarchy來查看發生了什麼時,我在正確的位置看到ViewPager,但沒有任何項目。我調試並注意到PagerAdapter的getCount()被調用,但getItem從不被調用。

這是我的片段CreateView的方法:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View tipsView = inflater.inflate(R.layout.tip_manager_layout, container, false); 
    this.tipPagerAdapter = new TipPagerAdapter(getFragmentManager(), getArguments().getIntArray(TIP_LAYOUT_IDS_KEY)); 
    this.viewPager = (ViewPager) tipsView.findViewById(R.id.tip_pager); 
    this.viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
    @Override 
    public void onPageSelected(int position) { 
     if(position == (tipPagerAdapter.getCount()-1)){ 
     stop(); 
     } 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 

    } 
    }); 
    // Workaround to set the PagerAdapter within a fragment transaction 
    new SetViewPagerAdapterTask().execute(); 
    return tipsView; 
} 

我添加片段是這樣的:

FragmentTransaction fragmentTransaction = fragmentActivity.getSupportFragmentManager().beginTransaction(); 
fragmentTransaction.add(android.R.id.content, this, TAG); 
fragmentTransaction.commit(); 

和刪除的片段是這樣的:

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
fragmentTransaction.remove(tipManagerFragment); 
fragmentTransaction.commit(); 

這是由片段膨脹的版面:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/tip_pager" 
    android:layout_width="fill_parent" 
    android:layout_height="175dp" 
    android:layout_gravity="center_horizontal|bottom" 
    android:paddingBottom="2dp" /> 

有人可以幫我解決這個問題嗎?

編輯:

有一段時間,我用它添加到活動之後的片段的顯示和隱藏方法。但這不是正確的做法。我不明白爲什麼我不能再添加一個ViewPager片段。 ViewPager被正確添加和刪除,但第二次,它根本不顯示任何東西。

回答

2

經過了很長時間的思考我的問題,我有以下想法:也許問題是與我刪除具有ViewPager的片段,但我沒有刪除由ViewPager。然後,這些碎片在FragmentManager中繼續,當新的ViewPager嘗試使用它們時會發生奇怪的事情。

所以,我開始嘗試刪除所有的片段。要做到這一點,我在FragmentPagerAdapter創建的方法是這樣的:

public void destroy(FragmentTransaction fragmentTransaction){ 
    for(Fragment tipFragment : tipFragments){ 
     fragmentTransaction.remove(tipFragment); 
    } 
} 

適配器使用tipFragments創建的內容。所以,我得到一個fragmentTransaction作爲參數,我刪除所有這些片段。當我想刪除我的片段,我用這個代碼:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
tipPagerAdapter.destroy(fragmentTransaction); 
fragmentTransaction.remove(TipManagerFragment.this); 
fragmentTransaction.commit(); 

這樣,我刪除所有的片段,當我加入這又具有ViewPager片段,一切正常。

相關問題