2012-03-28 58 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

相關問題