2013-04-18 36 views
1

我按照示例FragmentTabsPager下的示例ActionBarSherlock更新SherlockFragmentActivity中FragmentPagerAdapter中的片段视图

在我的情况下,我用TabsPager和FragmentPagerAdapter的示例创建了一个简单的SherlockActivity。

我创建了两个片段(不同的类)。第一个包含四个按钮。取决于点击哪一个,主Activity获取代码(例如1,2,3,4)。我得到正确的按下按钮的代码。

现在,在第二个片段中,我想根据代码绘制一些东西,或者相同的东西,动态更新其视图。

我已经搜索了一个解决方案,但我没有得到任何东西。在这种情况下,我有这样的:

[MainActivity.java]

 public static class TabsAdapter extends FragmentPagerAdapter 
      implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener { 

private final Context mContext; 
     private final TabHost mTabHost; 
     private final ViewPager mViewPager; 
     private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();  
[...] 
    @Override 
     public Fragment getItem(int position) { 
      TabInfo info = mTabs.get(position); 
      return Fragment.instantiate(mContext, info.clss.getName(), info.args); 

    } 

我设法更新包新值info.args,但我不知道如何把它传递给片段正确并命令它更新其动态视图。

这可能吗?

在此先感谢。

UPDATE

最后,我用什么阳光好心地解释。我保持一个SparseArray我的片段,我肯定可以访问它们,因为我知道它的位置里面MainActivity:

[MainActivity.java]

//Once the user presses the button on the first fragment, the callback calls 
// this function 
    public void onImageSelected(int iNumber){ 

    MySecondFragment msf = (MySecondFragment)mTabsAdapter.getFragment(POS_1); 

     if(msf != null){ 

       msf.setNumImage(iNumber);    
       msf.updateView();         
      }     
     } 

最后在MySecondFragment.java我可以访问我的布局组件(例如一个GridView),因为它们在onCreateView期间被初始化,所以我把我需要的所有代码放入我的updateView()方法中。

例如,我更新一个GridView的内容:

[MySecondFragment.java]

myGridView.setBackground(getResources().getDrawable(iCode)); 

HTH

UPDATE 2

我已经包含以下代码以便将片段保存到主要活动的状态包中。当从纵向到横向或反之亦然(这是重建)功能的getItem应用变化不会被调用,所以SparseArray地图不再必要的片段补充:

@Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putString(CURRENT_TAB, mTabHost.getCurrentTabTag()); 

     getSupportFragmentManager().putFragment(outState, MyFirstFragment.class.getName(), mTabsAdapter.getFragment(POS_1)); 

     getSupportFragmentManager().putFragment(outState, MySecondFragment.class.getName(), 
       mTabsAdapter.getFragment(POS_2)); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 

     if (savedInstanceState != null) { 

      MyFirstFragment mff = (MyFirstFragment) getSupportFragmentManager().getFragment(savedInstanceState, MyFirstFragment.class.getName());       

      if(mff != null) 
       mTabsAdapter.setFragment(POS_1, mff); 

      MySecondFragment msf = (MySecondFragment) getSupportFragmentManager().getFragment(
        savedInstanceState, MySecondFragment.class.getName());       

      if(msf != null) 
       mTabsAdapter.setFragment(POS_2, msf); 

      mTabHost.setCurrentTabByTag(savedInstanceState 
        .getString(CURRENT_TAB));   
     } 
    } 

而且,内在TabsAdapter类:

public Fragment getFragment(int pos) { 
    return map.get(pos); 
} 

public void setFragment (int position, Fragment fragment) { 
    map.put(position, fragment); 
} 

HTH

回答

1

anhanniballake答案可能有效。但这可能会在未来打破。

要真正让你可以在你的TabAdapter类

private SparseArray<Fragment> map; 

定义sparesArray的片段,这阵

@Override 
public Fragment getItem(int position) { 
    TabInfo info = mTabs.get(position); 
    Fragment fragment = Fragment.instantiate(mContext, info.clss.getName(), info.args); 
    map.put(position, fragment); 
    return fragment; 
} 

您还需要从图的时候片段删除片段添加片段破坏

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

现在在TabAdapter类中定义一个公共方法w HICH可以得到碎片

public Fragment getFragment(int pos) { 
    return map.get(pos); 
} 

现在,在你的主SherlockFragementActivity您可以得到任何片段

MyFragment f = (MyFragment) mTabsAdapter.getFragment(1); // 1 means second fragment from left 

实例现在用你上面有

f.doAnyThingInMySecondFragment(); 
片段实例调用您的片段的任何方法

doAnyThingInMySecondFragment必须公开:)

+1

当我改变东方设备既不destroyItem也不getItem被调用,所以当重新创建Activity时,Fragment SparseArray不会再被重新填充。我也试过用FragmentStatePagerAdapter没有运气。我能做什么? – aloplop85

+0

当您的设备旋转时,您的'MainSherlockActvity's'onCreate'方法被调用,在'onCreate'方法中,您的tabAdapter会再次初始化。所以你的sparesArray不应该是null。你应该使用'FragmentStatePagerAdapter'。 – Sunny

+0

tabAdapter正确初始化并且SparseArray不为空。但是,由于getItem不会再次被调用,碎片不包含在该数组中(即SparseArray大小为0)。 – aloplop85

2

source for FragmentPagerAdapter显示,碎片给出了以下标签:

"android:switcher:" + viewId + ":" + id; 

哪里viewId是您ViewPagerid的R.id是页码。

因此,您可以通过检索第二页的片段:

activity.getSupportFragmentManager().findFragmentByTag(
    "android:switcher:" + pager.getId() + ":2") 

哪里pager是你ViewPager。然后,您会想要将返回的片段转换为您拥有的任何特定的类,然后调用一个方法来传递所需的信息。