Java 在Android中,如何从父活动调用片段方法

Java 在Android中,如何从父活动调用片段方法,java,android,android-fragments,Java,Android,Android Fragments,在我的应用程序中,片段类中有一个方法。我想使用父级活动调用此方法 片段代码: public class SampleFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(L

在我的应用程序中,
片段
类中有一个方法。我想使用父级
活动
调用此方法

片段代码:

public class SampleFragment extends Fragment {

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_sample, null);

        return v;
    }

    public void getToast(){
        Toast.makeText(getActivity(), "Test", Toast.LENGTH_SHORT).show();
    }
}
private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new SampleFragment (), context.getResources().getString(R.string.info));
    viewPager.setOffscreenPageLimit(1);
    viewPager.setAdapter(adapter);
}

private static class ViewPagerAdapter extends FragmentPagerAdapter {
    private 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 addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}
我想用这些代码初始化活动中的片段:

public class SampleFragment extends Fragment {

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_sample, null);

        return v;
    }

    public void getToast(){
        Toast.makeText(getActivity(), "Test", Toast.LENGTH_SHORT).show();
    }
}
private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new SampleFragment (), context.getResources().getString(R.string.info));
    viewPager.setOffscreenPageLimit(1);
    viewPager.setAdapter(adapter);
}

private static class ViewPagerAdapter extends FragmentPagerAdapter {
    private 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 addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}
private void setupViewPager(ViewPager-ViewPager){
ViewPagerAdapter适配器=新的ViewPagerAdapter(getSupportFragmentManager());
addFrag(newsamplefragment(),context.getResources().getString(R.string.info));
viewPager.setOffscreenPageLimit(1);
viewPager.setAdapter(适配器);
}
私有静态类ViewPagerAdapter扩展了FragmentPagerAdapter{
私有最终列表MFFragmentList=new ArrayList();
私有最终列表MFFragmentTitleList=new ArrayList();
公共视图页面编辑器(碎片管理器){
高级经理;
}
@凌驾
公共片段getItem(int位置){
返回MFFragmentList.get(位置);
}
@凌驾
public int getCount(){
返回MFFragmentList.size();
}
public void addFrag(片段、字符串标题){
添加(片段);
MFFragmentTitleList.add(标题);
}
@凌驾
公共字符序列getPageTitle(int位置){
返回MFFragmentTitleList.get(位置);
}
}
如何在
活动中调用
getToast()
方法


我是业余爱好者,请帮我输入以上代码好吗?请告诉我的朋友们。谢谢

最简单的方法是在活动中本地存储对片段的引用,并在其上调用
getToast

SampleFragment myFragment; // declared in your activity class

// This is small change in your setupViewPager
myFragment = new SampleFragment ();
adapter.addFrag(myFragment, context.getResources().getString(R.string.info));

//later on when you want to call getToast:
myFragment.getToast();

您也可以跳过将SampleFragment存储为活动的数据成员,并在需要时直接从FragmentManager检索其引用。

或者如果您不希望在本地存储实例

您可以在任何需要调用
getToast
方法的地方尝试此方法:

if (viewpagerAdapter.getItem(viewpager.getCurrentItem()) instanceof SampleFragment){
((SampleFragment)viewpagerAdapter.getItem(viewpager.getCurrentItem())).getToast();
}

您可以创建
Fragment
的对象,并调用
getToast()
方法。除此之外,我还有一个建议,使用公共类,该类具有显示
Toast
的方法

public class CommonUtil {
    /**
     * This function will show toast in the application
     * @param message
     */
    public static void showToast(String message) {
        if (!message.isEmpty()) {
            Toast.makeText(MyApplication.getContext(), message, Toast.LENGTH_SHORT).show();
        }
    }
}

使用此方法,您可以在项目的任何位置调用此方法。

要调用方法,您需要该片段的对象

使用以下命令可以获得它

  SampleFragment frag = (SampleFragment ) getSupportFragmentManager()
                              .findFragmentById(R.id.fragment_container);
                          // or  getFragmentManager() based on your imports

   frag.getToast();
您可以使用:

//in place of viewPager.getcurrentItem() you can also pass direct int position of your fragment 
Fragment frag=adapter.getItem(viewPager.getcurrentItem()); //viewpagerAdapter adapter declared globally

if(frag instance of MyFragment)
{
 MyFragment myFragment = (MyFragment) frag;
 frag.mymethod(); //call to your method showToast
}

希望它有助于

获取fragment的引用,然后调用方法只需使用
newsamplefragment().getToast()在你的
活动中
代码。@ShubhamJain,嘿,我的朋友,我真的很业余,需要你的帮助。请发送给我的代码与我的上述代码也看到,我学习它。please@KeLiuyue,谢谢我的朋友。你的代码对我有用。但这是好办法吗?不错的方式?谢谢你,我的肉汤,我的兄弟。我只想使用以下代码:
newsamplefragment().getToast()