Java 在这种情况下,如何避免使用instanceof?

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

在检查片段的子类时,我不得不多次使用instanceofs,我觉得我在某个地方出错了:

@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都应该扩展一个接口,该接口有一些方法来识别对象是否需要显示值。。。我以前也看过这个链接,但我觉得它很混乱,你知道有什么更简单的解释吗?明白了。。。我以前也看过这个链接,但我觉得它很混乱,你知道有什么更简单的解释吗?