从ViewPager活动访问Fragment的方法

我有一个带有方法setName()的Fragment,它通过setText函数更改EditText文本。

从通过ViewPager托管该片段的活动调用该方法的最佳方法是什么?

换句话说,如何通过ViewPager从托管该片段的Activity访问Fragment的方法(例如,更改该片段的布局)?

我问这个是因为我尝试了几种方法,但总是有错误。

我知道这有点晚了,但我遇到了同样的问题,如果你已经解决了,也许会帮助别人。

我在ViewPager中发现的第一个问题是几乎不可能获得对片段的引用。 片段是在getItem()中动态创建的,因此您无法设置ID并且它们会被swicher自动重新调整,因此您也无法通过标记find它。 有一些方法可以做到这一点,但它们都是变通方法。 ( 作为ViewPager的一部分更新ListFragment中的数据 )

我解决它的方式基本上是使用双回调。 片段A具有由主活动实现的接口,主活动具有由片段B实现的接口。例如片段A中的按钮克隆调用主活动中的回调函数,其反过来调用片段B中的回调。看下面的代码。 我希望我发布了一切,这将有所帮助。 顺便说一句,我只用ViewPager尝试过这个,但我认为它适用于任何types的Fragment通信。

主要Avtivity java:

 import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; public class MainActivity extends FragmentActivity implements FragmentA.Caller { SectionsPagerAdapter mSectionsPagerAdapter; ViewPager mViewPager; PassCallToB passOnToB = null; FragmentManager myManager = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); } public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); MyManager = fm; } @Override public Fragment getItem(int position) { Fragment fragment = null; if(position == 0) { fragment = new FragmentA(); } else if (position == 1) { fragment = new FragmentB(); passOnToB = (PassCallToB)fragment; } return fragment; } @Override public int getCount() { return 2; } @Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return "Frag A"; case 1: return "Frag B"; } return null; } public void setCallback() { List frags = myManager.getFragments(); for(Fragment fragment : frags) { if(fragment instanceof FragmentB){ passOnToB = (PassCallToB)fragment; } } } } public interface PassCallToB { public void passItOn(); } @Override public void CallB() { if(passOnToB instanceof Fragment) passOnToB.passItOn(); else { mSectionsPagerAdapter.setCallback(); passOnToB.passItOn(); } } } 

主要活动xml:

    

片段一个java:

 import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; public class FragmentA extends Fragment { Button btnCallB = null; Caller listener = null; public FragmentA() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle inState) { View rootView = inflater.inflate(R.layout.fragment_a, container, false); btnCallB = (Button)rootView.findViewById(R.id.btnCallB); btnCallB.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { listener.CallB(); } }); return rootView; } public interface Caller { public void CallB(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof FragmentActivity) { listener = (Caller) activity; } else { throw new ClassCastException(activity.toString() + " must implemenet listener"); } } @Override public void onDetach() { super.onDetach(); listener = null; } } 

片段A xml:

     

片段B Java:

 import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; public class FragmentB extends Fragment implements MainActivity.PassCallToB { public FragmentB() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle inState) { View rootView = inflater.inflate(R.layout.fragment_b, container, false); return rootView; } @Override public void passItOn() { Toast.makeText(getActivity(), "Hello from B", Toast.LENGTH_SHORT).show(); } } 

片段B xml:

    

您可以访问ViewPager的片段中的公共方法。 您需要(1)在创建Fragment时存储对Fragment的引用,并将其添加到将支持寻呼机适配器的列表中,或者(2)您需要从寻呼机适配器本身获取对片段的引用。 例如:

 Fragment fragmentA = null; //instance variable fragmenA = new Fragment(); //whereever you instantiate your fragment 

如果你的方法是

 public void setName(String args){ //do something } 

你要做的只是从对ViewPager持有的片段的引用中调用该方法

 fragmentA.setName(args); 

你传递所需的任何参数,就像调用常规方法一样。 请注意,仅当您从包含ViewPagerFragmentActivity的片段中调用方法时,此方法ViewPager 。 如果你想反过来,片段化为活动,你需要使用一个inerface。

分段

 private static FragmentName instance; public static synchronized FragmentName getInstance() { return instance; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); instance=this; .... } public void methodName() {...} 

活动

 FragmentName.getInstance().methodName(); 

最好的方法是,只需调用CallingFragmentName fragment =(CallingFragmentName)viewPager .getAdapter()。instantiateItem(viewPager,viewPager.getCurrentItem()); 它将重新实例化您的调用Fragment,以便它不会抛出空指针exception。