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

时间:2014-07-03 12:36:47

标签: java android fragment instanceof

我必须在这里多次使用instanceof,同时检查Fragment的子类是什么,我觉得我在某个地方出错:

@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();

}

有没有办法在这里使用它?我怎样才能识别片段的类型并相应地调用正确的方法?

6 个答案:

答案 0 :(得分:2)

最简单的方法是让CustFragmentOne,CustFragmentTwo等实现一个通用接口。这样,您只需要针对该接口执行单个instanceof检查,而不需要单独检查每个具体类。

另一种方式就是沿着这些方向:How to implement onBackPressed() in Fragments?

答案 1 :(得分:2)

使用界面。例如:

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();
}

答案 2 :(得分:0)

if(frag.getClass() == CustFragmentOne.class)不确定哪种方法更好

答案 3 :(得分:0)

为什么不将Fragment对象保留在Activity中?

CustFragmentOne fragment1 = (FragmentOne)getFragmentManager().findFragmentById(R.id.fragment1);  
 CustFragmentTwo fragment2 = (FragmentOne)getFragmentManager().findFragmentById(R.id.fragment2);

在你的布局xml文件中,你会像这样:

<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>

答案 4 :(得分:0)

我建议你使用这样的东西来控制碎片上的后退按钮:

  1. 创建基础片段抽象类:

    public abstract class BaseFragment extends Fragment {
    
        public void onBackPressed() {
    
        }
    
    }
    
  2. 从BaseFragment扩展所有片段

    公共类CustFragmentOne扩展了BaseFragment {     ... }

  3. 更改您的活动

    @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();
    
    }
    
  4. 使用您想要的逻辑在片段中覆盖onBackPressed()方法。

答案 5 :(得分:0)

您总是可以创建一个BaseFragment,它将Fragment扩展为所有片段。然后你可以让每个片段根据需要处理它,使它更清洁。 e.g。

public class BaseFragment extends Fragment { public void onBackPressed() { // Override this function in your fragment classes as needed } }

或者您可以执行类似(Android Fragment handle back button press

的操作