0

我在活動中有活動,PagerAdapter(返回片段)和ViewPager。如何從活動中調用片段中的方法

其他建議使用下面的代碼

ExampleFragment fragment = (ExampleFragment)getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

不過,我不能找到一個辦法讓該片段R.id.example_fragment的參考。

這裏是我的活動

public class TestActivity extends AppCompatActivity { 

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

     setContentView(R.layout.activity_main); 


     TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
     tabLayout.addTab(tabLayout.newTab().setText("Test1")); 
     tabLayout.addTab(tabLayout.newTab().setText("Test2")); 
     tabLayout.addTab(tabLayout.newTab().setText("Test3")); 
     tabLayout.addTab(tabLayout.newTab().setText("Test4")); 
     tabLayout.addTab(tabLayout.newTab().setText("Test5")); 
     tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

     viewPager = (ViewPager) findViewById(R.id.pager); 
     adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount()); 
     viewPager.setAdapter(adapter); 
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 

      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 

      } 
     }); 

     tabLayout.setScrollPosition(pageIndex,0f,true); 
     viewPager.setCurrentItem(pageIndex); 
    } 
} 

佈局

<include 
    android:id="@+id/toolbar" 
    layout="@layout/toolbar" /> 

<android.support.v4.widget.DrawerLayout 
    android:layout_below="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/main_layout" > 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tab_layout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:minHeight="?attr/actionBarSize" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
      app:tabTextAppearance="@style/menuTheme" 
      app:tabIndicatorHeight="4dp" 
      app:tabMode="scrollable" 
      /> 
     <android.support.v4.view.ViewPager 
      android:id="@+id/pager" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" 
      /> 

    </LinearLayout> 
    <fragment 
     android:id="@+id/fragment_navigation_drawer" 
     android:name="com.musicplayer.mp3player.activities.FragmentDrawer" 
     android:layout_width="@dimen/nav_drawer_width" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:layout="@layout/fragment_navigation_drawer" 
     tools:layout="@layout/fragment_navigation_drawer" /> 
</android.support.v4.widget.DrawerLayout> 
</RelativeLayout> 

爲PageAdapter

public class PagerAdapter extends FragmentPagerAdapter { 
    int mNumOfTabs; 

    public PagerAdapter(FragmentManager fm, int NumOfTabs) { 
    super(fm); 
    this.mNumOfTabs = NumOfTabs; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 
       TestFragment testFragment = new TestFragment(); 
       return testFragment; 
      case 1: 
       TestFragment testFragment2 = new TestFragment2(); 
       return testFragment2; 
      case 2: 
       TestFragment testFragment3 = new TestFragment3(); 
       return testFragment3; 
      case 3: 
       TestFragment testFragment4 = new TestFragment4(); 
       return testFragment4; 
      case 4: 
       TestFragment testFragment5 = new TestFragment5(); 
       return testFragment5; 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return mNumOfTabs; 
    } 
} 
+0

如果你想問如何找到'id'來引用任何特定的片段,那麼你必須以編程方式設置它:http://stackoverflow.com/a/13244471 –

回答

0

代碼試圖象下面這樣:

// Returns the fragment to display for that page 
    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
     case 0: // Fragment # 0 - This will show FirstFragment 
      return TestFragment.newInstance(0, "Page # 1"); 
     case 1: // Fragment # 0 - This will show FirstFragment different title 
      return TestFragment2.newInstance(1, "Page # 2"); 
     case 2: // Fragment # 1 - This will show SecondFragment 
      return TestFragment3.newInstance(2, "Page # 3"); 
     default: 
      return null; 
     } 
    } 

可以的getInstance片段的象下面這樣:

viewpager.getcurrentItem().yourmethod(); 

在您的片段類製作方法如下像:

public static DemoFragment newInstance() { 
    return new DemoFragment(); 
} 
+0

但你也有更好的選擇。檢查當前片段是否被添加。 –

+0

對於newInstance,我得到「無法解析方法」錯誤。 – Julia

+0

@Julia我有更新代碼嘗試它。在片段類 –

0

確保片段被初始化一次:

public class PagerAdapter extends FragmentPagerAdapter { 
    int mNumOfTabs; 
    TestFragment testFragment, testFragment2, testFragment3, testFragment4, testFragment5; 
    public PagerAdapter(FragmentManager fm, int NumOfTabs) { 
    super(fm); 
    this.mNumOfTabs = NumOfTabs; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 
       if(testFragment == null) testFragment = new TestFragment(); 
       return testFragment; 
      case 1: 
       if(testFragment2 == null) testFragment2 = new TestFragment2(); 
       return testFragment2; 
      case 2: 
       if(testFragment3 == null) testFragment3 = new TestFragment3(); 
       return testFragment3; 
      case 3: 
       if(testFragment4 == null) testFragment4 = new TestFragment4(); 
       return testFragment4; 
      case 4: 
       if(testFragment5 == null) testFragment5 = new TestFragment5(); 
       return testFragment5; 
      default: 
       return null; 
     } 
    } 

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

然後調用片段上的方法:

TestFragment testFragment = (TestFragment) viewpager.getcurrentItem(); 
// in case you are not sure, check using instanceOf to determine the Fragment type 
    testFragment.specific_function_name(); 
+0

調用「testFragment.specific_function_name();」時出錯; java.lang.NullPointerException:試圖調用空對象引用虛擬方法'android.content.ContentResolver android.support.v4.app.FragmentActivity.getContentResolver()' – Julia

+0

你可以發佈代碼拋出空指針異常嗎? –

+0

嗨,我只是修改你的代碼,並把它放在我的課堂上。導致錯誤的代碼是當我調用testFragment.specific_function_name(); – Julia