Java 在这种情况下,如何避免使用instanceof?
在检查片段的子类时,我不得不多次使用instanceofs,我觉得我在某个地方出错了:Java 在这种情况下,如何避免使用instanceof?,java,android,fragment,instanceof,Java,Android,Fragment,Instanceof,在检查片段的子类时,我不得不多次使用instanceofs,我觉得我在某个地方出错了: @Override public void onBackPressed() { Fragment frag = mManager.findFragmentByTag("Fragment"); if(frag instanceof CustFragmentOne || frag instanceof CustFragmentTwo || frag instan
@Override
public void onBackPressed() {
Fragment frag = mManager.findFragmentByTag("Fragment");
if(frag instanceof CustFragmentOne ||
frag instanceof CustFragmentTwo ||
frag instanceof CustFragmentThree ||
frag instanceof CustFragmentFour) {
//This method displays an instance of "CustFragmentFive"
displayView(0);
}
else if(frag instanceof CustFragmentFive)
super.onBackPressed();
else if(mManager.getBackStackEntryCount() > 0)
getFragmentManager().popBackStack();
else
super.onBackPressed();
}
有没有办法在这里使用它?还有什么方法可以识别片段的类型并相应地调用正确的方法呢?iffrag.getClass==CustFragmentOne.class不确定哪种方法更好,实现一个公共接口。这样,您只需要对该接口执行单个instanceof检查,而不需要单独检查每个具体类
另一种方法类似于这样:最简单的方法是让CustFragmentOne、CustFragmentTwo等实现一个公共接口。这样,您只需要对该接口执行单个instanceof检查,而不需要单独检查每个具体类
另一种方法是这样的:为什么不将片段对象保留在活动中
CustFragmentOne fragment1 = (FragmentOne)getFragmentManager().findFragmentById(R.id.fragment1);
CustFragmentTwo fragment2 = (FragmentOne)getFragmentManager().findFragmentById(R.id.fragment2);
在布局xml文件中,smth如下所示:
<FrameLayout
...>
<fragment
android:id="@+id/fragment1"
android:name="com.smartmirror.FragmentOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<fragment
android:id="@+id/fragment2"
android:name="com.smartmirror.FragmentTwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout>
为什么不将片段对象保留在活动中
CustFragmentOne fragment1 = (FragmentOne)getFragmentManager().findFragmentById(R.id.fragment1);
CustFragmentTwo fragment2 = (FragmentOne)getFragmentManager().findFragmentById(R.id.fragment2);
在布局xml文件中,smth如下所示:
<FrameLayout
...>
<fragment
android:id="@+id/fragment1"
android:name="com.smartmirror.FragmentOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<fragment
android:id="@+id/fragment2"
android:name="com.smartmirror.FragmentTwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout>
使用接口。例如:
public interface ICustomFragment {
public boolean shouldNavigateBack();
然后你可以这样做:
@Override
public void onBackPressed() {
CustomFragment frag = (CustomFragment)mManager.findFragmentByTag("Fragment");
if(frag.shouldNavigateBack()) {
//This method displays an instance of "CustFragmentFive"
displayView(0);
}
else {
super.onBackPressed();
}
使用接口。例如:
public interface ICustomFragment {
public boolean shouldNavigateBack();
然后你可以这样做:
@Override
public void onBackPressed() {
CustomFragment frag = (CustomFragment)mManager.findFragmentByTag("Fragment");
if(frag.shouldNavigateBack()) {
//This method displays an instance of "CustFragmentFive"
displayView(0);
}
else {
super.onBackPressed();
}
我建议您使用类似这样的方式来控制片段上的后退按钮: 创建基本片段抽象类:
public abstract class BaseFragment extends Fragment {
public void onBackPressed() {
}
}
从BaseFragment扩展所有片段
公共类CustFragmentOne扩展了BaseFragment{
...
}
改变你的活动
@Override
public void onBackPressed() {
Fragment frag = mManager.findFragmentByTag("Fragment");
if(frag instanceof BaseFragment)
frag.onBackPressed();
else if(mManager.getBackStackEntryCount() > 0)
getFragmentManager().popBackStack();
else
super.onBackPressed();
}
在片段中用所需的逻辑重写onBackPressed方法
我建议您使用类似这样的方式来控制片段上的后退按钮: 创建基本片段抽象类:
public abstract class BaseFragment extends Fragment {
public void onBackPressed() {
}
}
从BaseFragment扩展所有片段
公共类CustFragmentOne扩展了BaseFragment{
...
}
改变你的活动
@Override
public void onBackPressed() {
Fragment frag = mManager.findFragmentByTag("Fragment");
if(frag instanceof BaseFragment)
frag.onBackPressed();
else if(mManager.getBackStackEntryCount() > 0)
getFragmentManager().popBackStack();
else
super.onBackPressed();
}
在片段中用所需的逻辑重写onBackPressed方法
您始终可以创建一个BaseFragment,它扩展要由所有片段扩展的片段。然后,您可以根据需要让每个片段处理它,使其更干净。e、 g 公共类BaseFragment扩展了片段{ 反压公共空间{ //根据需要在片段类中重写此函数 } }
或者您可以做一些类似的事情,您可以始终创建一个BaseFragment,它扩展要由所有片段扩展的片段。然后,您可以根据需要让每个片段处理它,使其更干净。e、 g 公共类BaseFragment扩展了片段{ 反压公共空间{ //根据需要在片段类中重写此函数 } }
或者你可以做一些类似的事情绕过instanceof操作符的典型方法是访问者模式在我看来就像CustFragmentOne,CustFragmentTwo,CustFragmentThree和CustFragmentFour都应该扩展一个接口,该接口有一些方法来确定对象是否需要显示值。绕过instanceof运算符需要的典型方法是访问者模式,在我看来,它类似于CustFragmentOne、CustFragmentThree、,CustFragmentThree和CustFragmentThree都应该扩展一个接口,该接口有一些方法来识别对象是否需要显示值。。。我以前也看过这个链接,但我觉得它很混乱,你知道有什么更简单的解释吗?明白了。。。我以前也看过这个链接,但我觉得它很混乱,你知道有什么更简单的解释吗?