2013-05-19 17 views
1

我有4個選項卡,每選中一個片段。
從選項卡#2片段我想要啓動另一個片段在選項卡#2上運行並從中獲取結果。什麼是正確的方法來做到這一點?有沒有例子?什麼是startActivityForResult()的模擬,但使用片段

如果這些是活動,而不是片段,我知道我會用startActivityForResult()。

+0

您需要自行處理,不存在片段的startActivityForResult()機制。 – Luksprog

+0

@Luksprog我想你是對的,看到一個工作解決方案的接受答案。 – ilomambo

回答

5

有一個片段交互的推薦模式。您的每一個片段的聲明它需要與使用接口他人互動的方式:

這裏的第一個片段的代碼:

public class Fragment1 { 
    private Listener listener; 

    @Override 
    public void onCreateView(...) { 
     Bundle args=getArguments();    
     if (args!=null) { 
      Object arg=args.getParcelable("result"); 
      //use the result for something 
     } 

     //... 
     someView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (listener!=null) 
        listener.onFragment2Requested(); 
      } 
     }); 
     //... 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     this.listener=(Listener) activity; 
    } 

    public interface Listener { 
     public void onFragment2Requested(); 
    } 
} 

和第二個片段:

public class Fragment2 { 
    private Listener listener; 

    @Override 
    public void onCreateView(...) { 
     //... 
     someView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Object object=... 

       if (listener!=null) 
        listener.onWorkDone(object); 
      } 
     }); 
     //... 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     //will throw ClassCastException unless your Activity 
     //implements Listener interface of your fragment 
     this.listener=(Listener) activity; 
    } 

    public interface Listener { 
     public void onWorkDone(Object someResult); 
     public void someOtherMethod(); 
    } 
} 

,然後,最後,你的Activity,作爲協調者:

public class YourActivity extends 
           FragmentActivity 
          implements 
           Fragment1.Listener, 
           Fragment2.Listener { 

    public void onFragment2Requested() { 
     Fragment2 frg2=new Fragment2(); 
     //here goes your code to switch fragments the way you want  
    } 

    public void onWorkDone(Object someResult) { 
     //if you don't want to create new instance of fragment each time 
     //you can try to get it from FragmentManager. 
     //But don't try to store reference to it anywhere (activity field etc.) 
     //it could interfere with fragment recycling mechanism 
     Fragment1 frg1=new Fragment1(); 
     Bundle args=new Bundle(); 
     args.putParcelable("result", someResult); 
     //instead of arguments, you could use setter method, but that way 
     //your Object is lost when fragment is recreated upon orientation change, etc. 
     frg1.setArguments(args); 
     //here goes your code to switch fragments the way you want 
    } 

    public void someOtherMethod() { 
     //... 
    } 
} 

我知道,這可能看起來太多代碼,但這是它完成的方式。 此外,此模式涵蓋了in this article

+0

我試過了,它工作正常。我認爲正確的範例是創建一個具有兩個接口的基本片段類。第一個接口具有'startFragmentForResult(tag,requestCode)'方法,第二個接口具有'onFragmentResult(requestCode,resultCode,data)',並從中擴展所有片段。這是我的下一步。 – ilomambo

相關問題