从无关类调用片段中的方法
Posted
技术标签:
【中文标题】从无关类调用片段中的方法【英文标题】:Call Method in Fragment from Unrelated Class 【发布时间】:2014-01-07 12:16:49 【问题描述】:这里有一个棘手的问题,但我会尽量弄清楚。
A 类:extends FragmentActivity
并拥有FragmentManager
B 类:extends Fragment
并具有片段的 UI
C 类:无关类
public class A extends FragmentActivity
Fragment fragment = new FragmentActivity();
public class B extends Fragment
public void methodToBeCalled()
//do something
public class C
//call B's methodToBeCalled() from here
//note it is not static
我想做的是从 C 类调用位于 B 类中的方法。有什么想法可以做到这一点吗?
一种解决方案是从 C 类运行此代码:
B fragment = (B) getFragmentManager().findFragmentById(R.id.b);
这不起作用(它可以编译,但 if 语句总是错误的):
if (A.getCurrentFragment() instanceof B)
B fragment = (B) A.getCurrentFragment();
fragment.methodToBeCalled();
【问题讨论】:
你能发一个SSCCE来清楚地说明你的问题吗? 当然让我为你把它放在一起 调用方法应该不是问题。您是否想知道如何获取当前显示的 Fragment 实例? 是的。我相信这可能是我的问题。 (对不起,我是片段的新手。)如果我可以从不相关的类中访问当前显示的片段,那将解决我的问题。我更新了代码。这就是你的意思戴夫? 【参考方案1】:将 FragmentActivity 的上下文传递给 C 类,使用此上下文可以获取片段管理器,然后您可以使用片段 id 或标记找到片段。
FragmentManager fm = context.getSupportFragmentManager();
//tag should same as what you gave while adding the fragment
FragmentB fb=(FragmentB)fm.findFragmentByTag("tag");
// call public methods of FragmentB
fb.CallFromClassC();
【讨论】:
谢谢。有没有机会添加更多的 cmets?我是碎片的新手。我在调用什么 getSupportFragmentManager() ? Fragment 的标签是什么? 以后可以通过FragmentManager使用标签调用fragment。 @Evorlor【参考方案2】:使用FragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
或FragmentTransaction.replace (int containerViewId, Fragment fragment, String tag)
为片段设置标签
然后通过标签检查片段实例:
A.getCurrentFragment().getTag().equals("btag")
【讨论】:
【参考方案3】:Step 1 : if class using AsyncTask:
Create a constructor into non-fragment class and parse Fragment Manager:
Step 2:
FragmentManager mFragmentManager;
// create a constructor
public NetworkMaster(Activity mMasterActivity)
this.mFragmentManager = mMasterActivity.getFragmentManager();
// end constructor NetworkMaster
Step 3:
protected void onPostExecute(String result)
try
//ID should same as what you gave while adding the fragment
SummaryFragment oSummaryFragment = (SummaryFragment)mFragmentManager.findFragmentById(R.id.content_frame);
// call public methods of SummaryFragment
oSummaryFragment.responseFromSummaryUser(result);
catch (Exception e)
e.printStackTrace();
// end onPostExecute
Step 4: Class the non-fragment class from Fragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
NetworkMaster mNetworkMaster = new NetworkMaster(getActivity());
mNetworkMaster.runUserSummaryAsync();
【讨论】:
以上是关于从无关类调用片段中的方法的主要内容,如果未能解决你的问题,请参考以下文章