[英]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.