从无关类调用片段中的方法

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();


【讨论】:

以上是关于从无关类调用片段中的方法的主要内容,如果未能解决你的问题,请参考以下文章

从Asynctask ONPostExecute调用片段方法

如何从主要活动中调用片段方法

从片段调用活动方法

从活动中调用片段中的非静态方法?

从片段内部调用活动方法[重复]

从活动中调用片段方法