从活动中调用片段中的非静态方法?

时间:2015-07-06 08:19:48

标签: java android android-fragments android-viewpager static-methods

我有一个通过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()行的nullpointer,无论位置和片段如何。

如果该方法被声明为静态,那就没问题。

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){
        ...
    }

}

同样有效!

感谢。

3 个答案:

答案 0 :(得分:1)

将null转换为引用不会向基元抛出异常,它会。

使用findFragmentById()或findFragmentByTag()获取引用并检查其是否为null,如果不是,则检查引用的isAdded()或isVisible()。

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

答案 1 :(得分: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。

答案 2 :(得分:1)

//From fragment to activty:
((YourActivityClassName)getActivity()).yourPublicMethod();



//From activity to fragment:
FragmentManager fm = getSupportFragmentManager();

//if you added fragment via layout xml
YourFragmentClass fragment = 
(YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();

//If you added fragment via code and used a **tag** string when you added your 
fragment, use **findFragmentByTag** instead:

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");