2017-09-02 2 views
1

Ich habe 2 Fragmente in viewpager und ich möchte Callback-Methoden mit interface in beiden hinzufügen. Ich füge den Interface-Listener hinzu und initiiere Fragmente in viewpager adapter, aber nur das letzte Fragment wird aufgerufen. Wenn ich auf die Menüoption MainActivity's klicke, wird nur der Toast in MyFragB aufgerufen, auch wenn MyFragA angezeigt wird.hinzufügen calback listener in jedem viewpager fragment

Beide Fragmente ... Nur Aktivität Aufruf MyFragBToast zeigt, wenn Widerrist Fragment

geöffnet
public class MyFragA extends Fragment implements FragmentCaller { 

    private TextView myTxt; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.myfraga, container, false); 
    } 

    @Override 
    public void CallFragment() { 
     if(getActivity()!=null) 
      Toast.makeText(getActivity(), "Activity calling MyFragA", Toast.LENGTH_SHORT).show(); 
    } 
} 

public class MyFragB extends Fragment implements FragmentCaller{ 

    private TextView myTxt; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.myfragb, container, false); 
    } 

    @Override 
    public void CallFragment() { 
     if(getActivity()!=null) 
      Toast.makeText(getActivity(), "Activity calling MyFragB", Toast.LENGTH_SHORT).show(); 
    } 
} 

Hauptaktivität

public class MainActivity extends AppCompatActivity { 

    TabLayout tabs; 
    ViewPager viewpager; 

    FragmentCaller fragListerner = null; 
    public interface FragmentCaller { 
     void CallFragment(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     tabs = (TabLayout)findViewById(R.id.tabs); 
     viewpager = (ViewPager)findViewById(R.id.viewpager); 
     SimpleFragmentPagerAdapter adapter = new SimpleFragmentPagerAdapter(this, getSupportFragmentManager()); 
     viewpager.setAdapter(adapter); 
     tabs.setupWithViewPager(viewpager); 

    } // onCreate ends 



    public class SimpleFragmentPagerAdapter extends FragmentStatePagerAdapter { 

     private Context mContext; 

     public SimpleFragmentPagerAdapter(Context context, FragmentManager fm) { 
      super(fm); 
      mContext = context; 
     } 

     // This determines the fragment for each tab 
     @Override 
     public Fragment getItem(int position) { 
      Fragment fragment = null; 
      if (position == 0) { 
       fragment = new MyFragA(); 
       fragListerner = (FragmentCaller) fragment; 
       return fragment; 
      } else if (position == 1){ 
       fragment = new MyFragB(); 
       fragListerner = (FragmentCaller)fragment; 
       return fragment; 
      } 
      return null; 
     } 

     // This determines the number of tabs 
     @Override 
     public int getCount() { 
      return 2; 
     } 

     // This determines the title for each tab 
     @Override 
     public CharSequence getPageTitle(int position) { 
      // Generate title based on item position 
      switch (position) { 
       case 0: 
        return mContext.getString(R.string.fraga); 
       case 1: 
        return mContext.getString(R.string.fragb); 
       default: 
        return null; 
      } 
     } 

    } 

    public boolean onCreateOptionsMenu(Menu menu) { 

     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.callback, menu); 
     return true; 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 
     super.onOptionsItemSelected(item); 
     switch (item.getItemId()){ 
      case R.id.call: 
       if(fragListerner!=null){ 
        if(fragListerner instanceof MyFragA){ 
         fragListerner.CallFragment(); 
        }else if(fragListerner instanceof MyFragB){ 
         fragListerner.CallFragment(); 
        } 
       } 
       break; 
     } 

     return true; 
    } 


} 

Antwort

0

aber nur das letzte Fragment

genannt wird

natürlich ist! denn bei pos == 0 Sie setzen fragListerner = (FragmentCaller) fragment dann wieder auf pos == 1 Sie setzenfragListerner = (FragmentCaller)fragment;. Also diese Bedingung, fragListerner instanceof MyFragB wird immer wahr sein!

 @Override 
     public Fragment getItem(int position) { 
      Fragment fragment = null; 
      if (position == 0) { 
       fragment = new MyFragA(); 
       fragListerner = (FragmentCaller) fragment; 
       return fragment; 
      } else if (position == 1){ 
       fragment = new MyFragB(); 
       fragListerner = (FragmentCaller)fragment; 
       return fragment; 
      } 
      return null; 
     } 

Also, Sie versuchen activity-fragment

in Ordnung zu kommunizieren, wenn Sie noch Schnittstellen verwenden möchten, können Sie es so tun:

erstellen eine Instanz Ihre Schnittstelle für jedes Fragment! und in getItem zuweisen sie beide,

@Override 
     public Fragment getItem(int position) { 
      Fragment fragment = null; 
      if (position == 0) { 
       fragment = new MyFragA(); 
       fragAListerner = (FragmentCaller) fragment; 
       return fragment; 
      } else if (position == 1){ 
       fragment = new MyFragB(); 
       fragBListerner = (FragmentCaller)fragment; 
       return fragment; 
      } 
      return null; 
     } 

Aber gibt es einen einfacheren Weg Fragment Methoden nennen von ihm übergeordnete Aktivität ist, die ist wie folgt, für die Ex:

Fragment fragment = adapter.getItem(0); // MyFragA is at pos 0 
fragment.<specific_function_name>(); 

Oder, mit der ID!

MyFragA fragment = (MyFragA) getFragmentManager().findFragmentById(R.id.MyFragAId); 
fragment.<specific_function_name>(); 

Oder, unter Verwendung es ist Tag!

MyFragA fragment = (MyFragA) getFragmentManager().findFragmentByTag("MyFragATag"); 
fragment.<specific_function_name>(); 
+0

ich das nicht verstehen. Warum sollte ich die Schnittstellenmethode in Aktivität überschreiben? Ich möchte etwas im Fragment von der Aktivität tun. Als würde man eine Methode in Fragment von Aktivität aufrufen. – CodeAssasins

+0

Okay, ich dachte das Gegenteil !, werde ich die Antwort aktualisieren! –

+0

Antwort bearbeitet! Viel Glück –

1

habe ich die Antwort von rick von here.

public class MainActivity erweitert AppCompatActivity {

TabLayout tabs; 
ViewPager viewpager; 
public static int currentFrag=0; 
SimpleFragmentPagerAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    tabs = (TabLayout)findViewById(R.id.tabs); 
    viewpager = (ViewPager)findViewById(R.id.viewpager); 
    adapter = new SimpleFragmentPagerAdapter(this, getSupportFragmentManager()); 
    viewpager.setAdapter(adapter); 
    tabs.setupWithViewPager(viewpager); 
    viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      System.out.println("sammy_current_position: "+position); 
      currentFrag = position; 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 

} // onCreate ends 



public class SimpleFragmentPagerAdapter extends FragmentStatePagerAdapter { 

    private Context mContext; 

    public SimpleFragmentPagerAdapter(Context context, FragmentManager fm) { 
     super(fm); 
     mContext = context; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     if (position == 0) { 
      return new MyFragA(); 
     } else if (position == 1){ 
      return new MyFragB(); 
     } 
     return null; 
    } 

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

    // This determines the title for each tab 
    @Override 
    public CharSequence getPageTitle(int position) { 
     // Generate title based on item position 
     switch (position) { 
      case 0: 
       return mContext.getString(R.string.fraga); 
      case 1: 
       return mContext.getString(R.string.fragb); 
      default: 
       return null; 
     } 
    } 

} 

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.callback, menu); 
    return true; 
} 

public boolean onOptionsItemSelected(MenuItem item) { 
    super.onOptionsItemSelected(item); 
    switch (item.getItemId()){ 
     case R.id.call: 
      if(currentFrag == 0) { 
       MyFragA frag1 = (MyFragA)viewpager.getAdapter().instantiateItem(viewpager, viewpager.getCurrentItem()); 
       frag1.specialCase(); 
      } 

      break; 
    } 

    return true; 
} 

}