2015-07-19 67 views
1

我目前使用具有「swipey的選項卡」和使用以下PagerAdapter的應用程序的工作:使用viewpager時如何與碎片進行通信?

public class TabsPagerAdapter extends FragmentPagerAdapter { 

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


    @Override 
    public Fragment getItem(int index) { 
     switch (index) { 
      case 0: 
       return new HomeFragment(); 
      case 1: 
       return new ListFragment(); 
      case 2: 
       return new ChartFragment(); 
     } 

     return null; 
    } 

    @Override 
    public int getCount() { 

     return 3; 
    } 

} 

我使用下面的代碼從主活動我的片段之一進行通信:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     super.onActivityResult(requestCode, resultCode, data); 
     if(requestCode == 1) 
     { 
      if (resultCode == Activity.RESULT_OK) 
      { 
       String className = data.getExtras().getString("class_name"); 
       if (className.trim().length() > 0) { 
        HomeFragment homeFrag = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.home_fragment); 
        if(homeFrag != null) { 
         Log.d("MainActivity", "homeFrag is not null"); 
         homeFrag.newClass(className); 
        }else{ 
         Log.d("MainActivity", "homeFrag is null"); 
         HomeFragment newFragment = new HomeFragment(); 

         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
         transaction.replace(R.id.home_fragment, newFragment); 
         transaction.commit(); 
         newFragment.newClass(className); 
        } 
        addSubjectToDataBase(className); 
       } 

      } 
     } 
    } 

我的問題是,當我嘗試與主要活動的片段進行通信時,我似乎同時獲得多個片段。當我改變屏幕的方向或重新開始活動時,我得到了片段的修改版本,但是當我來回滑動查看片段時,我得到舊的未修改版本的片段。片段管理器似乎沒有註冊由適配器創建的片段,因爲儘管我知道這些片段已經創建,片段管理器總是返回一個空歸零片段。

我應該如何避免這個問題,以及與主要活動中的片段進行通信的最佳方式是什麼?

+0

爲什麼使用'OnActivityResult()'? – Jibbo

+0

我正在更新片段的信息來自另一個按下添加按鈕時啓動的活動的用戶輸入。 – Matthias

回答

0

這不是優雅,但我會做這樣的事情(也許有人會發佈一個更好的解決方案):

在一個單身,我就會把片段組成的數組:

public static Fragment[] sShownFragments = new Fragment[3]; 

然後在該方法getItem()

if(SingletonClass.sShownFragments[index]!=null){ 
    return mFragments[index]; 
} 

switch (index) { 
     case 0: 
      SingletonClass.sShownFragments[index] = new HomeFragment(); 
      break; 
     case 1: 
      SingletonClass.sShownFragments[index] = new ListFragment(); 
     case 2: 
      SingletonClass.sShownFragments[index] = new ChartFragment(); 
     default: 
      SingletonClass.sShownFragments[index] = new Fragment(); 
} 
return SingletonClass.sShownFragments[index]; 

然後在getCount(): 返回SingletonClass.sShownFragments.length();

現在,在您onActivityResult()

\\some code ... 
((HomeFragment)SingletonClass.sShownFragments[0]).newClass(className); 
\\ some other code... 
1

通過this post閱讀後,我研究出瞭解決辦法,以我自己的問題。問題是,由於FragmentPagerAdapter管理自己的片段,我試圖訪問的片段與查看傳呼機使用的片段不同。

我制定了訪問與視圖使用尋呼機的修改我修改我PagerAdapter這樣的片段的標籤的方式:

public class TabsPagerAdapter extends FragmentPagerAdapter { 

    protected String homeTag; 
    protected String listTag; 
    protected String chartTag; 

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

    @Override 
    public Fragment getItem(int index) { 
     switch (index) { 
      case 0: 
       Log.d("Adapter", "returning new homeFragment"); 
       return new HomeFragment(); 
      case 1: 
       return new ListFragment(); 
      case 2: 
       return new ChartFragment(); 
     } 

     return null; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Fragment createdFragment = (Fragment) super.instantiateItem(container, position); 

     switch (position){ 
      case 0: 
       homeTag = createdFragment.getTag(); 
       break; 
      case 1: 
       listTag = createdFragment.getTag(); 
       break; 
      case 2: 
       chartTag = createdFragment.getTag(); 
       break; 
     } 

     return createdFragment; 
    } 

    public String getHomeTag(){ 
     return homeTag; 
    } 

    public String getListTag(){ 
     return listTag; 
    } 

    public String getChartTag(){ 
     return chartTag; 
    } 
    @Override 
    public int getCount() { 

     return 3; 
    } 

} 

那麼,這是一個簡單的事情修改我的代碼在我訪問了正確的片段標籤後訪問正確的片段:

HomeFragment homeFrag = (HomeFragment) getSupportFragmentManager().findFragmentByTag(mAdapter.getHomeTag()); 
        if(homeFrag != null) { 
         Log.d("MainActivity", "homeFrag is not null"); 
         homeFrag.newClass(className); 
        }else{ 
         Log.d("MainActivity", "homeFrag is null"); 
         HomeFragment newFragment = new HomeFragment(); 

         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
         transaction.replace(R.id.pager, newFragment, madapter.get); 
         transaction.commit(); 
         newFragment.newClass(className); 
相關問題