0

Ich habe eine Aktivität, PagerAdapter (um ein Fragment zurückzugeben) und ViewPager innerhalb der Aktivität.So rufen Sie eine Methode in einem Fragment von einer Aktivität

Andere schlagen vor, den folgenden Code

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

jedoch mit, ich nicht einen Weg finden kann R.id.example_fragment eine Referenz des Fragments zu erhalten.

Hier ist meine Tätigkeit

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); 
    } 
} 

das Layout

<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> 

der Code für den 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

Wenn Sie fragen wollen, wie Sie die 'id' finden, um auf ein bestimmtes Fragment zu verweisen, dann müssen Sie es programmgesteuert einstellen: http://StackOverflow.com/a/13244471 –

Antwort

0

versuchen, wie unten:

// 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; 
     } 
    } 

Sie können getInstance von Fragment wie unten:

viewpager.getcurrentItem().yourmethod(); 

In Ihrem Fragment Klasse Make-Methode wie unten:

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

Aber Sie haben eine bessere Option auch . Überprüfen Sie, ob das aktuelle Fragment hinzugefügt wurde oder nicht. –

+0

Ich erhalte einen Fehler "kann Methode nicht auflösen" für newInstance. – Julia

+0

@Julia Ich habe Update-Code versuchen Sie es. make method innerhalb der Fragment-Klasse –

0

Stellen sind sicher, dass Fragmente nur einmal initialisiert:

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; 
    } 
} 

Dann Rufen Sie die Methode für das Fragment auf:

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

Ich erhalte einen Fehler beim Aufruf von "testFragment.specific_function_name();" java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.content.ContentResolver android.support.v4.app.FragmentActivity.getContentResolver()' für eine Nullobjekt-Referenz aufzurufen – Julia

+0

Können Sie den Code posten, wo er Null-Zeiger-Ausnahme auslöst? –

+0

Hallo, ich habe gerade Ihren Code geändert und in meine Klasse aufgenommen. Der Code, der den Fehler verursacht, ist, wenn ich testFragment.specific_function_name() aufgerufen habe; – Julia