2013-10-08 87 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

相关问题