13

我想從片段屏幕中調用活動中的方法。從片段內部調用活動方法

我有一個稱爲myMethod()的方法,它在一個名爲MyActivity的活動中; 我有一個叫做Screen1Fragment的片段。

我想從Screen1Fragment中調用MyActivity.myMethod(),但我不知道如何做到這一點。

此前Screen1Fragment是一項活動,所以我擴展MyActivity以便我可以直接調用 myMethod()。 但我不得不將活動更改爲滑動標籤使用情況的片段。

在此先感謝。

+5

'((YourActivityClass)getActivity).myMethod();' –

+0

http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity – jpm

+0

嗨,當我嘗試這個時我得到一個錯誤說不能施放從FragmentActivity到MyActivity。 MyActivity是否需要爲我擴展FragmentActivity才能使用此代碼。 –

回答

30

在片段中使用getActivity()

MyActivity activity = (MyActivity) getActivity(); 
activity.myMethod(); 

,如果你不知道你的片段連接到MyActivity然後

Activity activity = getActivity(); 
if(activity instanceof MyActivity){ 
     MyActivity myactivity = (MyActivity) activity; 
     myactivity.myMethod(); 
} 
+0

嗨, 第一種方式給我一個錯誤,無法從FragmentActivity強制轉換爲MyActivity。 第二種方式不會給我一個錯誤,但它不會加載按鈕單擊方法。點擊時,我只是將代碼放入按鈕中。 –

+1

然後你應該從FragmentActivity而不是Activity擴展你的Activity。 (公共類MyActivity擴展FragmentActivity {...) – Sipka

+0

嗨,第一種方式工作很好,但由於某種原因,我的應用程序現在崩潰時,我嘗試使用它。 –

0

如果方法是MainActivity的靜態方法,像:

public static void someMethod(){} 

然後,非常簡單。請致電

MainActivity.someMethod() 

但是,我想你真正想要的是從Activity類訪問某個函數。然後,您可以在碎片視圖中使用以下代碼

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState){ 

     container.getContext().someMethod(); 

    } 
+2

IMO這是不好的做法。 1.容器可能爲空,並且getContext()返回Context,您仍然需要檢查MyActivity實例。 2。您不想通過靜態方法與Activity進行通信,因爲那樣就不可能擁有該Activity的兩個實例。 – Sipka

+1

好點。但我想在這種情況下可以。似乎問題的擁有者想要在活動中使用一些滑動選項卡。我們非常確定活動在那裏。無論如何,我並不建議使用靜態方法。我猜猜什麼是真正的問題。 –

18

您應該使您的碎片完全獨立於您附加的活動。碎片的要點是,您可以在不同的環境中將它們重用於不同的活動。爲了實現這一點,仍然可以從您的Activity中調用official documentation中建議的以下模式。

在您的片段

  • 定義一個公共接口與方法

    public interface MyFragmentCallback{ 
        public void theMethod(); 
    } 
    
  • 定義一個字段,並得到鑄造參考:

    private MyFragmentCallback callback; 
    public void onAttach(Activity activity){ 
        callback = (MyFragmentCallback) activity 
        super.onAttach(activity); 
    } 
    

您的活動

  • 實現類定義MyFragmentCallback
  • 實現theMethod()在您的活動(Eclipse會問你這樣做)

然後,從你的片段,你可以叫callBack.theMethod()

這之間的區別只是要求你對getActivity方法()是你的片段不再與這個特定的活動配對。因此,您可以將其重新用於其他活動,例如手機和平板電腦。

+0

這是正確的方法!每谷歌文檔! – sandalone