Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:在不同的片段中调用相同的方法_Android_Android Fragments - Fatal编程技术网

Android:在不同的片段中调用相同的方法

Android:在不同的片段中调用相同的方法,android,android-fragments,Android,Android Fragments,我有1个主要活动和4个片段。每个片段都有相同的方法名,每个片段执行不同的操作(初始化数据是相同的,每个片段对数据执行的操作是不同的) 此时,我检查哪个片段处于活动状态,并调用该方法: if (getSupportFragmentManager().findFragmentByTag("f1") != null) Objects.requireNonNull((FragmentF1) getSupportFragmentManager().findFragmentByTag("f1")).s

我有1个主要活动和4个片段。每个片段都有相同的方法名,每个片段执行不同的操作(初始化数据是相同的,每个片段对数据执行的操作是不同的)

此时,我检查哪个片段处于活动状态,并调用该方法:

if (getSupportFragmentManager().findFragmentByTag("f1") != null)
   Objects.requireNonNull((FragmentF1) getSupportFragmentManager().findFragmentByTag("f1")).setupData(true);
else if (getSupportFragmentManager().findFragmentByTag("f2") != null)
   Objects.requireNonNull((FragmentF2) getSupportFragmentManager().findFragmentByTag("f2")).setupData(true);
我想调用这个方法,不管我现在有多少片段。可能吗


此外,requireNonNull用于避免lint警告,尽管我在上面一行执行了空检查,但有没有办法使代码更干净?

您可以在活动中声明此方法,其中以片段为参数,并在每次调用此方法时检查传递的片段,并基于此执行逻辑

public static void initData(Fragment fragment){
    if (fragment instanceof FirstFragment){
        // Do your logic here
    }else if(fragment instanceof SecondFragment){
        // Do your logic here
    }
}//initData()

您应该何时调用该方法

我认为在你的事业中你应该使用事件总线, 因此,使用eventbus,当发生某些事情时,您应该将事件发布到活动片段

EventBus.getDefault().post(“此处的事件”)

并在片段中注册事件,以便在当前启动片段并发布事件时,片段将接收事件


您可以为片段创建基类或抽象类

public abstract class BaseFragment extends AppCompatActivity {

    abstract void setupData(boolean b);
}
然后,每个片段继承自BaseFragment类并重写
setupData(布尔b)
。 找到片段后,检查他是否安装BaseFragment并调用该方法

Fragment fragment = getSupportFragmentManager().findFragmentByTag("tag")

    if (fragment instanceof BaseFragment){
         fragment.setupData(true);
       }

谢谢,这就把我带到了同一个地方,在那里我需要检查我需要“使用”的片段。我想知道是否有更通用的东西,比如getSupportFragmentManager().activeFragment.setupData();假设所有片段都继承自BaseFragment,是否有办法避免“搜索”该片段,只需执行(BaseFragment)getSupportFragmentManager.ActiveFragment.setupData()之类的操作?这是另一个问题,您需要跟踪当前片段,检查这个答案,这是我的问题:-)因此如果我理解正确,我不是在搜索片段,而是使用容器,并使用BaseFragment调用“相同”的方法,不管当前处于活动状态的片段是什么。听起来很有希望,我会尝试一下,谢谢。我想有几种方法可以跟踪当前片段,这取决于具体情况,但如果您在同一容器中有4个片段可以解决您的问题,您能否详细说明您的意思:“我想调用该方法,无论我现在有什么片段”。你想要一个能做所有事情的单一方法吗?或者,您是否已将每个方法的功能整合到单个片段中?我在每个片段中都有setupData()方法,用于初始化数据并对其进行“操作”。每个片段的“做点什么”是不同的。我想知道我是否可以在不“搜索”活动片段的情况下调用该方法(名称)。您想在哪里调用该方法?在片段本身中?从MainActivity到它持有的片段您写了“将事件发布到活动片段”问题是我是否需要“搜索”活动片段,如果需要,它将与我现在的情况几乎相同。您只需发布事件,活动片段将接收它,而不确定哪一个是活动片段