使用ViewPager引用片段中的活动

时间:2013-01-16 19:10:12

标签: android android-fragments android-viewpager

这是我第一次尝试实施ViewPager。我的应用程序基本上有一个列表和详细信息页面,我希望用户能够在细节之间滑动。详细信息基于我从列表页面传入的ID。问题是我在详细信息片段中调用getActivity(),该片段返回null。就像我说的那样,我是实施ViewPager的新手,所以这可能是显而易见的:

ListingFragment.class:

public class ListingFragment extends SherlockFragmentActivity
{
    private ViewPager mViewPager;  
    private MyFragmentPagerAdapter mMyFragmentPagerAdapter; 
    private static List<Fragment> fragments;
    public int Id = 0;

    @Override
    public void onCreate(final Bundle icicle)
    {    
        super.onCreate(icicle);

        setContentView(R.layout.main);

        mViewPager = (ViewPager)findViewById(R.id.viewpager);  
        mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());  
        mViewPager.setAdapter(mMyFragmentPagerAdapter);

        DetailsFragment df1 = new DetailsFragment();
        df1.Id = 1;
        df1.DisplayItems();
        fragments.add(lf);

        DetailsFragment df2 = new DetailsFragment();
        df2.Id = 2;
        df2.DisplayItems();
        fragments.add(lf);
    }

    private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {  

        public MyFragmentPagerAdapter(FragmentManager fm) {  
             super(fm);  
        }  

        @Override  
        public Fragment getItem(int index) {  
            return fragments.get(index);
        }  

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

DetailsFragment.class

public class DetailsFragment extends SherlockFragmentActivity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onActivityCreated(final Bundle icicle)
    {    
        super.onActivityCreated(icicle);
    }

    private void DisplayItems()
    {
        PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("value", false);
        ...
    }
}

更新

我已更新我的代码以使用静态newInstance方法和Bundle将ID传递给详细信息片段。

ListingFragment.class:

public class ListingFragment extends SherlockFragmentActivity
{
    private ViewPager mViewPager;  
    private MyFragmentPagerAdapter mMyFragmentPagerAdapter; 
    private static List<Fragment> fragments;
    public int Id = 0;

    @Override
    public void onCreate(final Bundle icicle)
    {    
        super.onCreate(icicle);

        setContentView(R.layout.main);

        mViewPager = (ViewPager)findViewById(R.id.viewpager);  
        mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());  
        mViewPager.setAdapter(mMyFragmentPagerAdapter);

        DetailsFragment df1 =  DetailsFragment.newInstance(1);
        fragments.add(df1);

        DetailsFragment df2 =  DetailsFragment.newInstance(2);
        fragments.add(df2);
    }

    private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {  

        public MyFragmentPagerAdapter(FragmentManager fm) {  
             super(fm);  
        }  

        @Override  
        public Fragment getItem(int index) {  

            return fragments.get(index);
        }  

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

DetailsFragment.class

public class DetailsFragment extends SherlockFragmentActivity
{
    private int detailId;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);         
    }

    @Override
    public void onActivityCreated(final Bundle icicle)
    {    
        super.onActivityCreated(icicle);
    }

    public static DetailsFragment newInstance(int id) {

        DetailsFragment lf = new DetailsFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("id", id);
        lf.setArguments(bundle);
        return lf;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.listing, container, false);
        detailId = getArguments().getInt("id");
        DisplayItems();

        return view;
    }

    private void DisplayItems()
    {
        PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("value", false);
        ...
    }
}

1 个答案:

答案 0 :(得分:0)

您不应该设置变量并调用与活动初始化有关的方法。Id应使用setArguments(...)并使用静态newInstance(...)方法设置实例化你的片段。您应该在片段内的displayItems()中调用onCreateView(...),而不是附加的活动。

有关详细信息,请参阅有关Fragments的官方Android指南。你绝对应该把整个事情都读出来。 http://developer.android.com/guide/components/fragments.html