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} 

Я получаю NullPointer для 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

Почему бы вам не сделать ссылку на статический объект для конкретного фрагмента? и с этим объектом вы можете вызвать любой метод в фрагменте. нет необходимости определять статический метод. – 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

Отбрасывание нулевой ссылки не будет генерировать исключение, для примитива это будет.

Используйте findFragmentById() или findFragmentByTag(), чтобы получить ссылку и проверить, если ее нулевой, если нет, проверьте ссылку isAdded() или isVisible().

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

Я не понимаю ваше объяснение ссылки с тем, что метод следует называть static ?? – Aristide13

+1

не нужен метод static.you нужно вызвать метод фрагмента, поэтому вам нужно проверить, что фрагмент не равен null, а фрагмент добавлен и активен после этого вы должны вызвать метод фрагмента. Таким образом, в приведенном выше коде мне нужно проверить все это условие –

+0

Это точно то, что я не понимаю: Исполнение NullPointer нацелено на метод в случае, если он не является статичным, рассматривается как null! Так почему у меня нет nullpointer для: Fragment1 fragment = (Fragment1) getSupportFragmentManager() findFragmentById (R.id.fragment1). Когда метод статичен и наоборот, когда метод не является статическим! Также в вашем коде, где находится функция: onNotificationListener? Большое спасибо за помощь ... – Aristide13

1

поэтому в случае ViewPager, найти экземпляр фрагмента по его идентификатору или тег, это не правильный подход.

Лучше сделать следующее:

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.

Смежные вопросы