为什么我不能从片段中调用父活动的方法?

Cod*_*ate 2 android android-fragments

我有一个片段,我希望从包含这个片段的FragmentActivity中调用一个方法.我在FragmentTabs(扩展FragmentActivity)中定义了一个方法,该方法在片段中的特定事件上设置lastTab片段.由于某种原因,getActivity().SomeUserDefinedActivity()无法解析.

这是解释我的问题的代码:

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

    testButton = (Button)getView().findViewById(R.id.button1);
    testButton.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v) 
        {
            Log.i("FragmentTest", "Button1 Clicked");


            TestFragment2 f2 = new TestFragment2();
            FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.realtabcontent, f2);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            ft.addToBackStack(null);
            ft.commit();
            // This is where I want to call FragmentTabs method SetLastFragment, but I cannot access it.
            getActivity().SetLastFragment(f2);

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

这是我想在FragmentTabs中调用的方法:

    public void SetLastFragment(Fragment f)
{
    mTabManager.SetLastTabFragment(f);
}
Run Code Online (Sandbox Code Playgroud)

小智 16

getActivity()只返回一个Activity实例.这可以是嵌入片段的任何活动.SetLastFragment()是你的一个特定活动的方法,命名FragmentTabs.并非所有活动都有此方法.

这意味着您必须将其强制转换为特定的活动类.如果您在多个活动中使用您的片段,您还应该检查是否使用了正确的活动,例如通过instanceof运营商:

Activity a = getActivity();

if(a instanceof FragmentTabs) {
    ((FragmentTabs) a).SetLastFragment(f2);
}
Run Code Online (Sandbox Code Playgroud)

  • @litemode:更好的是根本不调用活动上的方法.如果您正在使用片段,则片段很可能由多个活动托管(例如,一个用于较小的屏幕,一个用于较大的屏幕).最灵活的方法是使用提供给片段的侦听器接口.第二大灵活性是说活动实现了一个接口并将`getActivity()`转换为该接口. (2认同)
  • 我同意CommonsWare你应该使用接口来处理事件.但是,如果您有嵌套片段,则直接调用活动的方法(如上面的答案)非常有用,其中活动会添加片段,而片段又会添加另一个片段,依此类推.以这种方式访问​​活动的方法更容易,而不是在每个片段中实现接口以便能够访问活动. (2认同)