从片段中调用一个活动方法

试图从一个片段调用我的活动中的一个方法。 我想要片段给方法数据,并获取方法返回时的数据。 我想实现类似于调用静态方法,但没有使用静态,因为它在活动中创build问题。

新的碎片,所以我需要一个简单和教学的解释!

谢谢!

从片段到活动:

((YourActivityClassName)getActivity()).yourPublicMethod(); 

从活动到片段:

 FragmentManager fm = getSupportFragmentManager(); //if you added fragment via layout xml YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id); fragment.yourPublicMethod(); 

如果您通过代码添加片段,并在添加片段时使用了tagstring,请改为使用findFragmentByTag

 YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag"); 

如果你想在其他地方使用它,你应该尝试去除活动中的片段。 你可以通过创build一个你的活动实现的接口来做到这一点。

所以你可以定义如下的接口:

假设你想给这个活动一个String并让它返回一个Integer:

 public interface MyStringListener{ public Integer computeSomething(String myString); } 

这可以在片段或单独的文件中定义。

那么你会有你的活动实施界面。

 public class MyActivity extends FragmentActivity implements MyStringListener{ @Override public Integer computeSomething(String myString){ /** Do something with the string and return your Integer instead of 0 **/ return 0; } } 

然后在你的片段中,你将有一个MyStringListenervariables,你可以在onAttach(Activity activity)方法中设置监听器。

 public class MyFragment { private MyStringListener listener; @Override public void onAttach(Context context) { super.onAttach(context); try { listener = (MyStringListener) context; } catch (ClassCastException castException) { /** The activity does not implement the listener. */ } } } 

编辑(17.12.2015): onAttach(Activity activity) is deprecated, use onAttach(Context context) instead, it works as intended

第一个答案肯定有效,但它将你当前的片段与主机活动结合起来。 最好的做法是保持片段与宿主的活动脱钩,以防你想用另一个活动。

我更了解了更多的碎片是如何工作的。 每个片段都属于父活动。 所以只需使用:

 getActivity().whatever 

从片段内。 这是一个更好的答案,因为你避免了过度的演员。 如果你不能避免这个解决scheme使用下面的解决scheme。

============

你必须做的是投到外面的活动

 ((MainActivity) getActivity()).Method(); 

创build一个新的实例将混淆android框架,它将无法识别它。 也可以看看 :

https://stackoverflow.com/a/12014834/1984636

https://stackoverflow.com/a/2042829/1984636

虽然我完全喜欢Marco的答案,但我认为指出你也可以使用基于发布/订阅的框架来达到相同的结果,例如,如果你使用事件总线,你可以做到以下几点

片段:

 EventBus.getDefault().post(new DoSomeActionEvent()); 

活动:

  @Subscribe onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){ //Do something } 

要通过您的片段访问您的活动中声明的函数,请使用一个界面,如marco的答案所示。

要通过你的活动访问你的Fragment中声明的函数,你可以使用这个,如果你没有标签或ID

 private void setupViewPager(ViewPager viewPager) { //fragmentOne,fragmentTwo and fragmentThree are all global variables fragmentOne= new FragmentOne(); fragmentTwo= new FragmentTwo(); fragmentThree = new FragmentThree(); viewPagerAdapteradapter = new ViewPagerAdapter(getSupportFragmentManager()); viewPagerAdapteradapter.addFragment(fragmentOne, "Frag1"); viewPagerAdapteradapter.addFragment(fragmentTwo, "Frag2"); viewPagerAdapteradapter.addFragment(fragmentThree, "Frag3"); //viewPager has to be instantiated when you create the activity: //ViewPager viewPager = (ViewPager)findViewById(R.id.pager); //setupViewPager(viewPager); //Where R.id.pager is the id of the viewPager defined in your activity's xml page. viewPager.setAdapter(viewPagerAdapteradapter); //frag1 and frag2 are also global variables frag1 = (FragmentOne)viewPagerAdapteradapter.mFragmentList.get(0); frag2 = (FragmentTwo)viewPagerAdapteradapter.mFragmentList.get(1);; //You can use the variable fragmentOne or frag1 to access functions declared in FragmentOne } 

这是ViewpagerAdapterClass

  class ViewPagerAdapter extends FragmentPagerAdapter { public final List<Fragment> mFragmentList = new ArrayList<>(); private final List<String> mFragmentTitleList = new ArrayList<>(); public ViewPagerAdapter(FragmentManager manager) { super(manager); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { return mFragmentList.size(); } public void addFragment(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position); } } 

这个答案是像我这样的noobs。 祝你有美好的一天。

这是从片段类…

 ((KidsStoryDashboard)getActivity()).values(title_txt,bannerImgUrl); 

这个代码从活动类…

  public void values(String title_txts, String bannerImgUrl) { if (!title_txts.isEmpty()) { //Do something to set text } imageLoader.displayImage(bannerImgUrl, htab_header_image, doption); }