我可以通过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
}
}
最佳答案
您不能将Activity
与Fragment
(出于明显的原因)进行比较,它们完全是分开的。 Fragment
没有绑定到任何特定的Activity
,它可以从任何Activity
触发。
传递OptionsFragment.this.getActivity()
时,没有传递Fragment
,而是传递Activity
当前所在的Fragment
。因此,context
函数中的checkSignal()
属于Activity
。
有两种解决方法,这完全取决于您在应用中使用的实现。
例如,如果您有一个模式,总是总是从单独的活动中调用OptionsFragment
和HomeFragment
,则例如,如果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
,并将其作为参数传递。这将消除是否从Activity
,Fragment
或在任何需要的地方调用它的依赖关系(特别是因为它是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)