我有一个通过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){
...
}
}
同样有效!
感谢。
答案 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");