2014-10-10 55 views
0

我已经开始使用Android Studio的预先定义的带片段的布局(SectionsPagerAdapter,ViewPager)编码一个小应用。Android:从MainActivity访问片段实例

我得在MainActivity.class主/ UI线程运行的任务,在一个点显示了的onClick方法

@Override 
     public void onClick(DialogInterface dialog, int which) { 
      category = eventsToDisplay.get(which); 
      averageFragment.category = category; 
      dialog.dismiss(); 
     } 

一个对话框,但我不能让averageFragment.category = category;分配工作。

在MainActivity的onCreate方法中,我调用averageFragment = (AverageFragment) getSupportFragmentManager().findFragmentByTag(AverageFragment.tag);,但是这给了我一个NullPointerException。

我已经尝试以下解决方案(其中大部分是从本网站):

  • getSupportFragmentManager().findFragmentById(R.id.fragment_average)
  • getSupportFragmentManager().findFragmentByTag(AverageFragment.tag) < - 基本上是一个静态变量,实例化时的片段创建。
  • mSectionsPageAdapter.getItem(1)

所有这些都让我无论是NPE或IllegalStateException.FragmentNotAttachedToView。

其他相关代码:

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

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

    @Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     switch (position) { 
      case 0: 
       return InspectionFragment.newInstance(position + 1); 
      case 1: 
       return AverageFragment.newInstance(position + 1); 
      case 2: 
       return RegulationsFragment.newInstance(position + 1); 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     // Show 3 total pages. 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     Locale l = Locale.getDefault(); 
     switch (position) { 
      case 0: 
       return getString(R.string.title_section1).toUpperCase(l); 
      case 1: 
       return getString(R.string.title_section2).toUpperCase(l); 
      case 2: 
       return getString(R.string.title_section3).toUpperCase(l); 
     } 
     return null; 
    } 
} 

如何从主要活动访问片段任何想法?

回答

0

检查将适配器实例分配给寻呼机的位置。你得到的例外是指该片段尚未加载到视图的是,这很可能是因为你调用你的任务:

averageFragment = (AverageFragment) getSupportFragmentManager().findFragmentByTag(AverageFragment.tag); 
从onCreate()方法

。尝试将此作业移至onResume(),它应确保您的片段已加载到视图中并可通过supportFragmentManager进行访问。在将活页夹的适配器设置在活动的生命周期中之后,也要确保此分配发生。

+0

完美的作品!谢谢 :) – suushiemaniac 2014-10-11 01:05:00