2014-07-03 158 views
2

我不得不在這裏使用instanceof幾次,同時檢查什麼子類Fragment是,我覺得我走錯了地方:如何避免在這種情況下使用instanceof?

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

} 

有沒有在這裏使用它什麼辦法?我還能如何識別片段的類型,並據此調用正確的方法?

+0

繞過了'instanceof'運營商需要的是'遊客pattern' – EpicPandaForce

+2

的典型方式在我看來就像'CustFragmentOne',' CustFragmentTwo','CustFragmentThree'和'CustFragmentFour'都應該擴展一個接口,該接口有一些方法來確定對象是否需要顯示值。 –

回答

2

最簡單的方法更好是有CustFragmentOne,CustFragmentTwo等實現共同的接口。這樣,您只需要對該接口執行單一實例檢查,而不需要單獨檢查每個具體類。

另一種方式是像沿着這些路線:How to implement onBackPressed() in Fragments?

+0

知道了......我也看過那個鏈接,但我覺得它很混亂,有沒有更簡單的解釋你知道? – ujvl

0

if(frag.getClass() == CustFragmentOne.class)不知道哪種方法壽

0

你爲什麼不保持你的片段對象到您的活動?

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> 
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(); 
} 
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()方法用你想要的邏輯。

0

你總是可以創建一個擴展片段的BaseFragment來擴展所有片段。然後,您可以讓每個片段在必要時處理,使其更清潔。例如

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

,或者你可以不喜歡(Android Fragment handle back button press

相關問題