繁体   English   中英

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

[英]Call a non static method in fragment from activity?

我有一个活动,该活动通过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){
        ...
    }

}

同样功能!

谢谢。

将null强制转换为引用不会引发异常,而将其引发为原始。

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

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

因此,对于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){
        ...
    }
}

谢谢

//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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM