从片段中调用一个活动方法
试图从一个片段调用我的活动中的一个方法。 我想要片段给方法数据,并获取方法返回时的数据。 我想实现类似于调用静态方法,但没有使用静态,因为它在活动中创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();
如果您通过代码添加片段,并在添加片段时使用了tag
string,请改为使用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框架,它将无法识别它。 也可以看看 :
虽然我完全喜欢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); }