【问题标题】: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 实例?
  • 是的。我相信这可能是我的问题。 (对不起,我是片段的新手。)如果我可以从不相关的类中访问当前显示的片段,那将解决我的问题。我更新了代码。这就是你的意思戴夫?

标签: java android-fragments fragment android-fragmentactivity fragmentmanager


【解决方案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();
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多