2013-10-08 40 views
0

我在我的FragmentActivity中使用ViewPager。現在,只要我的Activity啓動,我將position值傳入我的片段的newinstance方法中。從那裏我的片段現在將選擇drawable的資源ID並將其設置爲其背景。爲什麼我的ViewPager總是顯示第二張圖片而不是第一張?

我的片段活動

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v4.view.ViewPager.LayoutParams; 
import android.view.ViewGroup; 
import android.view.Window; 

public class HowToActivity extends FragmentActivity { 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     overridePendingTransition(R.anim.slide_out_bottom, R.anim.slide_in_top); 

    } 


    private ViewPager mViewPager; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); // remove title 

     mViewPager = new ViewPager(this); 
     mViewPager.setId(R.id.viewPager_howto); 

     setContentView(mViewPager); 

     getWindow().setLayout(LayoutParams.MATCH_PARENT /* width */ , LayoutParams.MATCH_PARENT /* height */); 

     FragmentManager fm = this.getSupportFragmentManager(); 
     mViewPager.setAdapter(new FragmentStatePagerAdapter(fm){ 

      @Override 
      public void setPrimaryItem(ViewGroup container, int position, 
        Object object) { 
       super.setPrimaryItem(container, position, object); 
      } 

      @Override 
      public int getCount() { 
       return 3; 

      } 
      @Override 
      public Fragment getItem(int position) { 
       return HowToFragment.newInstance(position); 
      } 

     }); 
    } 

} 

我的片段

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

public class HowToFragment extends Fragment { 

    private static int image_pos; 
    private int[] image_id = {R.drawable.image_1, R.drawable.image_2, R.drawable.image_3}; 

    public static Fragment newInstance(int pos){ 
     image_pos = pos; 
     return new HowToFragment(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_how_to_image, container, false); 
     v.setBackgroundResource(image_id[image_pos]); 
     return v; 
    } 

} 

它總是顯示image_2.png而不是image_1上啓動。然後,您需要一直滑動到image_32的位置,以便在0位置修復image_1。從01來回滑動只會在每個片段中顯示image_2

任何想法我做錯了什麼?

回答

2

你不能使該變量靜態

private static int image_pos; 

所有的片段都使用相同的,所以你總能看到第二個,當你創建它。

FG[0] newInstance -> image_pos=0; 
FG[1] newInstance -> image_pos=1; 

當片段要創建視圖:

FG[0] onCreateView -> value of image_pos=1; 
FG[1] onCreateView -> value of image_pos=1; 

使此相反:

private int image_pos; 
private int[] image_id = {R.drawable.image_1, R.drawable.image_2, R.drawable.image_3}; 

public static Fragment newInstance(int pos){ 
    HowToFragment fg = new HowToFragment(); 
    fg.image_pos = pos; 
    return fg; 
} 

您也可以在適配器定義與圖像陣列,只是通過片段上的Id創建方法。

+0

謝謝!爲什麼會發生這種情況? –

+0

我編輯了我的答案來解釋原因,但我不確定是否足夠清楚。 – Juangcg

+0

你真棒,感謝分享文章 –

1

原因是,適配器不僅會創建可見的片段,還會預加載右側和左側片段。不要使位置字段靜態。將其用作數據成員並在返回片段之前設置該pos值。

+0

Khawar說的是真實的。您可以設置最小值 viewPager.setOffscreenPageLimit(1); 這意味着總是在左側和右側頁面加載(邊界情況除外)。 – Malachiasz

相關問題