0

我有一個活動,通過ViewPagerAdapter管理四個片段。 從我的活動,我想調用一個方法:從活動中調用片段中的非靜態方法?

public void openButtons(){ 
//mPosition is a position of pager 

    if (mPosition==0){ 
     Fragment1 fragment = (Fragment1) getSupportFragmentManager().findFragmentById(R.id.fragment1); 
     fragment.openButtons(); 


    } 
    if (mPosition==1){ 
     Fragment2 fragment = (Fragment2) getSupportFragmentManager().findFragmentById(R.id.fragment2); 
     fragment.openButtons(); 
    } 
    if (mPosition==2){ 
     .... 
    } 
    if (mPosition==3){ 
     ... 
    } 

} 

如果我的片段的方法定義爲非靜態:

public void openButtons(){//some stuff} 

我得到一個fragment.openButtons空指針()行無論這個位置和片段如何。

如果該方法聲明爲靜態,那沒關係。

public static void openButtons(){//some stuff} 

該方法的內容沒有問題,因爲問題與空方法相同。

所以我的問題是爲什麼我們必須在片段中定義靜態方法?

「因爲在這樣的條件:

public void openButtons(){ 
//mPosition is a position of pager 

    if (mPosition==0){ 
     Fragment1.openButtons() 


    } 
    if (mPosition==1){ 
     Fragment2.openButtons() 
    } 
    if (mPosition==2){ 
     .... 
    } 
    if (mPosition==3){ 
     ... 
    } 

} 

同樣的功能!

謝謝。

+0

你爲什麼不做一個特定片段的靜態對象引用?並與該obj你設法調用片段中的任何方法。不需要定義靜態方法。 – user3819810

+0

請參閱[此鏈接](http://stackoverflow.com/questions/10903077/calling-a-fragment-method-from-a-parent-activity)可能會幫助你。 – Pankaj

+0

'getSupportFragmentManager()。findFragmentById(R.id.fragment1);'return null? – Altoyyr

回答

2

將null強制轉換爲引用不會將異常拋出到原始對象。

使用findFragmentById()或findFragmentByTag()來獲取引用,並檢查它是否爲null,如果不是,則檢查引用的isAdded()或isVisible()。

PlayerFragment p = (PlayerFragment) mManager.findFragmentById(R.id.bottom_container); 
if(p != null){ 
    if(p.isAdded()){ 
    p.onNotificationListener.updateUI(); 
    } 
} 
+0

我不明白你對鏈接的解釋,該方法應該被稱爲靜態? – Aristide13

+1

它不是必需的方法是靜態的。你必須調用片段方法,所以你必須檢查片段不是空的,片段被添加和激活之後,你必須調用片段的方法。因此在上面的代碼中,我必須檢查所有這些條件 –

+0

這正是我不明白的: NullPointer execption定位到該方法的情況下它不是靜態的被視爲null!所以爲什麼我沒有空指針: Fragment1 fragment =(Fragment1)getSupportFragmentManager()findFragmentById(R.id.fragment1)。 當方法是靜態的,反之亦然,當方法不是靜態的! 另外在你的代碼中的函數:onNotificationListener? 非常感謝您的幫助... – Aristide13

1

因此,在viewPager的情況下 ,找到其ID或代碼片段的情況下,是不正確的方法。

這是更好地做到以下幾點:

public void openButtons() { 
    // mPosition is a position of pager 

    ViewPagerAdapter adapter = ((ViewPagerAdapter) mViewPager.getAdapter()); 

    if (mPosition == 0) { 
     Fragment fragment = adapter.getItem(0); 
     ((Fragment1)fragment).openButtons(); 
    } 

    if (mPosition == 1){ 
     Fragment fragment = adapter.getItem(1); 
     ((Fragment2)fragment).openButtons(); 
    } 

    if (mPosition == 2){ 
     .... 
    } 

    if (mPosition == 3){ 
     ... 
    } 
} 

留言Merci。

相關問題