从活动中调用片段中的非静态方法?
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");
以上是关于从活动中调用片段中的非静态方法?的主要内容,如果未能解决你的问题,请参考以下文章