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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从活动中调用片段中的非静态方法?相关的知识,希望对你有一定的参考价值。

我有一个活动,通过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.open Buttons()的空指针,无论位置和片段如何。

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

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,如果不是,则检查引用的isAdded()或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");

以上是关于从活动中调用片段中的非静态方法?的主要内容,如果未能解决你的问题,请参考以下文章

从意图活动访问片段方法

从活动中调用片段事件

从片段内部调用活动方法[重复]

从活动中设置片段的参数

从活动中设置片段的参数

从活动中调用片段方法