2012-03-28 59 views
2

我有一个片段,我希望从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); 

     } 
    }); 
} 

这是我希望在FragmentTabs调用的方法:

public void SetLastFragment(Fragment f) 
{ 
    mTabManager.SetLastTabFragment(f); 
} 

回答

16

getActivity()回报只是一个活动实例。这可以是嵌入你的片段的任何活动。 SetLastFragment()是您的一项具体活动的方法,名为FragmentTabs。并非所有的活动都有这种方法。

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

Activity a = getActivity(); 

if(a instanceof FragmentTabs) { 
    ((FragmentTabs) a).SetLastFragment(f2); 
} 
+1

而且一般:*“不起作用” *是不是一个很具体的问题说明。请发布您获得的错误消息,在这种情况下可能是“方法X对于Y类未定义”或类似的消息。在这里我有一个想法是什么,但事实并非总是如此。没有信息就很难找到一些东西。 – 2012-03-28 10:12:20

+2

@litemode:更好的是不要在活动中调用方法。如果您使用的是片段,您的片段很可能会被多个活动托管(例如,一个用于较小的屏幕,另一个用于较大的屏幕)。最大的灵活性是使用提供给片段的侦听器接口。第二大灵活性是说活动实现了一个接口并将'getActivity()'强制转换为该接口。 – CommonsWare 2012-03-28 11:27:17

+2

我同意CommonsWare您应该使用接口来处理事件。但是,如果您有嵌套的片段,则直接调用上面的答案这样的活动方法非常有用,其中一个活动添加一个片段,然后添加另一个片段,等等。它更容易以这种方式访问​​活动的方法,而不是在每个片段中实现接口以便能够访问活动。 – 2012-11-10 12:15:27

相关问题