Java 从活动中调用片段中的非静态方法?
我有一个活动,通过ViewPagerAdapter管理四个片段。 在我的活动中,我想调用一个方法:Java 从活动中调用片段中的非静态方法?,java,android,android-fragments,android-viewpager,static-methods,Java,Android,Android Fragments,Android Viewpager,Static Methods,我有一个活动,通过ViewPagerAdapter管理四个片段。 在我的活动中,我想调用一个方法: public void openButtons(){ //mPosition is a position of pager if (mPosition==0){ Fragment1 fragment = (Fragment1) getSupportFragmentManager().findFragmentById(R.id.fragment1); fra
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,如果不是,请检查引用的isAdded()或isVisible()
将null强制转换为引用不会引发异常,而将其转换为基元则会引发异常 使用findFragmentById()或findFragmentByTag()获取引用并检查其是否为null,如果不是,请检查引用的isAdded()或isVisible()
将null强制转换为引用不会引发异常,而将其转换为基元则会引发异常 使用findFragmentById()或findFragmentByTag()获取引用并检查其是否为null,如果不是,请检查引用的isAdded()或isVisible()
将null强制转换为引用不会引发异常,而将其转换为基元则会引发异常 使用findFragmentById()或findFragmentByTag()获取引用并检查其是否为null,如果不是,请检查引用的isAdded()或isVisible() 所以,, 在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){
...
}
}
谢谢。因此,
在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){
...
}
}
谢谢。因此,
在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){
...
}
}
谢谢。因此,
在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){
...
}
}
谢谢。为什么不对特定片段进行静态对象引用?使用该obj,您可以调用片段中的任何方法。无需定义静态方法。请参阅可能有帮助。does
getSupportFragmentManager().findFragmentById(R.id.fragment1)代码>返回null?从FragmentManager获取fragment对象,然后调用非静态方法。可能强制转换可以帮助您:((Fragment1)fragment.openButtons();这在我的例子中是有效的,为什么不对特定片段进行静态对象引用呢?使用该obj,您可以调用片段中的任何方法。无需定义静态方法。请参阅可能有帮助。doesgetSupportFragmentManager().findFragmentById(R.id.fragment1)代码>返回null?从FragmentManager获取fragment对象,然后调用非静态方法。可能强制转换可以帮助您:((Fragment1)fragment.openButtons();这在我的例子中是有效的,为什么不对特定片段进行静态对象引用呢?使用该obj,您可以调用片段中的任何方法。无需定义静态方法。请参阅可能有帮助。doesgetSupportFragmentManager().findFragmentById(R.id.fragment1)代码>返回null?从FragmentManager获取fragment对象,然后调用非静态方法。可能强制转换可以帮助您:((Fragment1)fragment.openButtons();这在我的例子中是有效的,为什么不对特定片段进行静态对象引用呢?使用该obj,您可以调用片段中的任何方法。无需定义静态方法。请参阅可能有帮助。doesgetSupportFragmentManager().findFragmentById(R.id.fragment1)代码>返回null?从FragmentManager获取fragment对象,然后调用非静态方法。可能强制转换可以帮助您:((Fragment1)fragment.openButtons();这在我的情况下是有效的。我不理解你对链接的解释,即该方法应该被称为静态的??不一定该方法是静态的。你必须调用fragment方法,因此你必须检查fragment是否为null,并且fragment是否已添加并处于活动状态,然后你必须调用fragment方法。因此,在上面的代码中,我要检查所有这些条件,这正是我所不理解的:如果不是静态的,则NullPointer执行选项针对的是该方法被视为null!那么为什么我没有空指针:Fragment1 fragment=(Fragment1)getSupportFragmentManager()findframentbyid(R.id.Fragment1)。当方法是静态的,反之亦然,当方法不是静态的!在代码中,函数:onNotificationListener在哪里?非常感谢您的帮助…在我的例子中,片段必须是活动的,因为它是由viewPager管理的。当我从父活动调用该方法时,该片段是可见的。我不理解您对链接的解释,即该方法应被称为静态的??不必说该方法是静态的。您必须调用fragment方法,因此必须检查该片段是否为空,以及该片段是否已添加并处于活动状态,然后您必须因此,在上面的代码中,我必须检查所有这些条件,这正是我不理解的:如果不是静态的,则NullPointer执行选项以该方法为目标,并将其视为null!那么为什么我没有空指针:Fragment1 fragment=(Fragment1)getSupportFragmentManager()findframentbyid(R.id.Fragment1)。当方法是静态的,反之亦然,当方法不是静态的!在代码中,函数:onNotificationListener在哪里?非常感谢您的帮助…在我的例子中,片段必须是活动的,因为它是由viewPager管理的。当我从父activityI调用该方法时,该片段是可见的