我可以通过Fragment中的函数参数传递AppCompatActivity。但是我不知道如何检查哪个片段在该函数中传递。如何进行instanceof检查。

假设我有两个片段。


选项片段
家庭碎片


两者都可以这样通过AppCompatActivity。

StaticAccess.checkSignal((AppCompatActivity) OptionsFragment.this.getActivity())


要么

StaticAccess.checkSignal((AppCompatActivity) HomeFragment.this.getActivity())


内部StaticAccess类...

public class StaticAccess{

    public static void checkSignal(final AppCompatActivity context){
        //how to check context is instanceof which fragment when
        //if(context instanceof OptionFragment) not comparable
    }

}

最佳答案

您不能将ActivityFragment(出于明显的原因)进行比较,它们完全是分开的。 Fragment没有绑定到任何特定的Activity,它可以从任何Activity触发。
传递OptionsFragment.this.getActivity()时,没有传递Fragment,而是传递Activity当前所在的Fragment。因此,context函数中的checkSignal()属于Activity
有两种解决方法,这完全取决于您在应用中使用的实现。
例如,如果您有一个模式,总是总是从单独的活动中调用OptionsFragmentHomeFragment,则例如,如果OptionsFragment函数中的Activity1是从HomeFragment触发的,而Activity2是从checkSignal中触发的您可能会做类似if (context instanceof Activity1) { // Do stuff }之类的事情。但是,在我看来,这将是一种糟糕且不可扩展的方法。
现在,如果您的模式是仅从checkSignal调用Fragments函数,则可以将构造函数更改为static void checkSignal(final Fragment context),从类似StaticAccess.checkSignal(this)的片段中调用该函数,并检查像这样的类型if (context instanceof HomeFragment) { // Do stuff }。但是,这也是一种不好的且不可扩展的方法。
如果您是我,我将创建一个具有不同可能信号类型的enum,并将其作为参数传递。这将消除是否从ActivityFragment或在任何需要的地方调用它的依赖关系(特别是因为它是static,因此可以在任何地方调用它)。像这样:

public enum SignalSource {
    HOME,
    OPTIONS
}

public class StaticAccess{

    public static void checkSignal(SignalSource source){
        if (source == SignalSource.HOME) {
            // Do something...
        } else if (source == SignalSource.OPTIONS) {
            // Do something...
        }
    }

}

// Call it like this from anywhere
StaticAccess.checkSignal(SignalSource.HOME)

08-28 22:05