0

我在 FragmentActivity 中使用 ViewPager。现在,每当我的 Activity 启动时,我都会将position值传递给newinstance我的片段的方法。从那里我的片段现在将选择可绘制的资源 id 并将其设置为背景。

我的片段活动

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位置以将其固定image_1在该0位置上。来回滑动只会显示在每个片段中01image_2

任何想法我做错了什么?

4

2 回答 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。

于 2013-10-08T07:25:45.597 回答
1

原因是适配器不仅会创建可见的片段,还会预加载左右片段。不要使位置字段静态。将其用作数据成员并在返回片段之前设置该 pos 值。

于 2013-10-08T07:44:46.043 回答