我有几个片段在布局中被替换。有时我需要在布局中找出当前片段的对象。以下是我的表现:
Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragmentContainer);
if (currentFragment instanceof Fragment1) {
//...
} else if (currentFragment instanceof Fragment2) {
//...
} else if (currentFragment instanceof Fragment3) {
//...
} else if (currentFragment instanceof Fragment4) {
//...
}
在这种情况下是否可以使用switch statemet?
答案 0 :(得分:0)
不幸的是,没有。
正如他们在交换机文档中所说,
开关适用于 byte,short,char和int原始数据类型。它也适用 枚举类型(在枚举类型中讨论),String类和a 包含某些原始类型的特殊类:Character, 字节,短整数和整数(在数字和字符串中讨论)。
这是因为交换机需要一个“switch (month) {
case 1: break;
...
”值,这个值是静态的,永远不会改变。
例如,您可以执行以下操作:
switch (month) {
case object.intvalue: break;
...
但是你将无法做到这样的事情:
istanceof
因为intvalue的值不是静态的。
同样的概念是{{1}}。
答案 1 :(得分:0)
请勿使用开关。使用访客模式。或至少类似的东西:
在Fragment中,为Activity调用
实现一个方法Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragmentContainer);
// Maybe check if the Fragment actually implements the interface before casting or enclose in try/catch
((IFragmentSpecificStuffHandler)currentFragment).visit(this);
你的片段会用特定的东西来实现这个界面。
在活动中,您将替换if / else by:
interface IVisitor{
void visit( Fragment1 f ); // <- These correspond to your "if instanceof" - branches
void visit( Fragment2 f );
void visit( Fragment3 f );
}
interface IVisitable{
void accept( IVisitor visitor );
}
但是你应该考虑更好的命名。
所以基本上你要把责任推到每个Fragment-Variation到Fragment-Variation上。这有一些优点:
如果您想要或必须在活动中保留该代码,您可以进行双重调度:
IVisitor
在您的活动中,实施public void visit(Fragment1 f){
//code for Fragment1
// what you would have written inside the if-body
}
public void visit(Fragment2 f){
//code for Fragment2
}
public void visit(Fragment3 f){
//code for Fragment3
}
:
Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragmentContainer);
((IVisitable)currentFragment).accept(this); // Dispatch #1
在if / elsif / else的位置:
IVisitable
在您的片段中,您将实施//... we are in Fragment1
public void accept( IVisitor visitor ){
visitor.visit(this); /* Dispatch #2 just callback into visitor,
* will automatically call the correct
* visit( x ) impl. in Activity.*/
}
:
{{1}}
后一种方法是“访客模式”的精确实现,并且在活动字段的可见性方面具有一些优势。如果稍后添加片段,除了创建之外,您将不得不更改界面并触摸活动。就个人而言,我经常发现答案开头的“快捷方式”版本已经足够,但这取决于你想做什么。
答案 2 :(得分:0)
在这种情况下不可能使用switch case,因为switch case适用于可以赋予多个值的单个表达式。你试图解决的问题是不同的,你想要不同的表达式与值集(真/假)。在这种情况下,您需要每次评估不同的表达式,可以是真或假。