2017-03-18 26 views
0

這是片段之間正確的通信方式嗎?片段之間正確的通信方式

public class MainActivity extends AppCompatActivity implements IFragmentsHandler { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     //... 
    } 

    @Override 
    protected void startFragment1() { 
     Fragment1 f1 = new Fragment1(); 
     f1.setFragmentsHandler(this); 
     getSupportFragmentManager().beginTransaction() 
      .replace(R.id.fragment_container, f1) 
       .commit(); 
    } 

    @Override 
    protected void startFramgment2() { 
     Fragment1 f2 = new Fragment1(); 
     f2.setFragmentsHandler(this); 
     getSupportFragmentManager().beginTransaction() 
      .replace(R.id.fragment_container, f2) 
       .commit();    
    } 
} 

public class Fragment1 { 
    private IFragmentsHadnler fragmentsHandler; 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState) { 

     final View view = inflater.inflate(R.layout.fragment1, container, false); 
     //...Code... 
     fragmentsHandler.startFragment1(); 
    } 

    public void setFragmentsHandler(IFragmentsHandler fragmentsHandler) { 
     this.fragmentsHandler = fragmentsHandler; 
    } 
} 

public class Fragment2 { 
    private IFragmentsHadnler fragmentsHandler; 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState) { 

     final View view = inflater.inflate(R.layout.fragment2, container, false); 
     //...Code... 
     fragmentsHandler.startFragment2(); 
    } 

    public void setFragmentsHandler(IFragmentsHandler fragmentsHandler) { 
     this.fragmentsHandler = fragmentsHandler; 
    } 
} 

[EDIT1]:發佈接口(雖然很明顯)

public interface IFragmentsHandler { 
    public void startFragment1(); 
    public void startFragment2(); 
} 

從我的Java角度來看,這將引發OutOfMemoryE rror,但我不是,如果它是相同的Android。無論如何,片段之間的首選溝通方式是什麼?

+0

正是你的通信是什麼意思? 而且,你如何重寫AppCompatActivity中的'protected void startFragment1()'方法? –

+0

@ArunElectra好吧,我也將添加接口。通過溝通我的意思是從Fragment1開始Fragment2。 – JAAAY

+0

你想用fragment2替換fragment1並從fragment1啓動替換? –

回答

0

視圖邏輯根據android developer guide,片段之間的通信是通過關聯的Activity完成的。

片段使用他的接口與活動通信。並且Activity通過使用findFragmentById()捕獲Fragment實例或者根據需要創建一個實例來傳遞消息,然後直接調用其他片段的公共方法。

  • Fragment1想傳遞一些數據:使用他的由Activity實現的接口方法。
  • 活動執行接收數據的方法,創建&替換或查找(取決於您的佈局)Fragment2並傳遞此數據或在fragment2類上執行一些公共方法(取決於您的佈局)。從包或執行
  • Fragment2提取數據(根據您的佈局),他的公開方法來接收數據。

我覺得你的代碼中的問題是你誤解了接口的用途。您正在使用開始調用該方法的相同片段。 Fragment1在他的onCreateView()中調用startFragment1(),但它已經啓動。

如果你需要的話,在here有一個很好的教程。

0

爲了通信部件之間考慮的應用程序的體系結構MVP,VIPER等。在碼側,它可以使用事件總線進行通信或只是簡單的回調。

  • 待辦事項導航在一個地方
  • 在另一個地方執行的業務邏輯
  • 不要在演示本視點邏輯
  • 做在視圖中,片段,適配器
+0

我明白這是做到這一點的正確方式,但我只有2個片段,我真的不想混淆建築。你能提供一個例子嗎? – JAAAY

0

當你開始,你可以使用接口片段之間的通信通過Google的建議。

但片段之間進行通信的簡單的方法是通過使用事件總線(實現發佈/訂閱圖案)像EventBus庫。

您還可以使用RxJava創建自己的事件總線,因此您的應用程序的組件之間的通信使(看看這個問題#1:RxJava as event bus?