2015-07-03 84 views
0

我一直在研究這幾天,但尚未找到工作解決方案。有很多可用的信息,但由於我對Android的經驗不足,我無法得到任何工作建議。如何讓活動通知片段後退按鈕已被按下

我有一個活動,其上有3個碎片堆棧,所有這些都是使用FragmentManager事務呈現並添加到堆棧。在第三個片段處於活動狀態時,我需要攔截onBackPressed()方法並在碎片被銷燬之前執行一些額外的東西。

我已經嘗試過使用回調函數和接口來捕獲Activity上的onBackPressed()並將它發送到第三片段,但沒有運氣。

在Activity的onBackPressed()方法的堆棧監視中深入片段的正確方法是什麼?

讓我知道如果這不明確。

感謝您的幫助。

+0

is onBackPressed()是否必需?或者你只是試圖做一些事情,因爲片段被毀壞? –

+0

也許最好重寫'onPause'? –

+0

堆棧中的最後2個碎片需要同時彈出,或者一個緊跟在另一個之後,我用兩次調用popBackStack()建立的取消按鈕來完成此操作(可能不是最佳方式這樣做...),所以我需要做同樣的onBackPressed(),否則只有1片段被破壞。 – Sevren

回答

0

這是回答我的問題的文章。對於Android新手來說,這告訴我所有需要去的地方。

https://stackoverflow.com/a/30865486/2640458

是需要看到的onBackPress()方法從它的活性片段:

public class RatingFragment extends Fragment implements ContentActivity.OnBackPressedListener { 

@Override 
public void doBack() { 
    getFragmentManager().popBackStack(); 
} 

非常重要的訂閱聽者在上面的片段:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_rating, container, false); 

    ((ContentActivity)getActivity()).setOnBackPressedListener(this); 
} 

需要將onBackPress()方法發送到上述片段的活動:

public class ContentActivity extends Activity { 

protected OnBackPressedListener onBackPressedListener; 

public interface OnBackPressedListener { 
    void doBack(); 
} 

public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) { 
    this.onBackPressedListener = onBackPressedListener; 
} 

@Override 
public void onBackPressed() { 
    if (onBackPressedListener != null) 
     onBackPressedListener.doBack(); 
    else 
     super.onBackPressed(); 
} 

@Override 
protected void onDestroy() { 
    onBackPressedListener = null; 
    super.onDestroy(); 
} 
} 
+0

看起來不錯,恭喜!您的答案與其他發佈的答案類似。您可以通過增加其他帖子來顯示您的讚賞,以便獲得幫助。 –

+0

是的,我upvoted那個幫助。 – Sevren

0

不編譯和測試,但這種勾畫出了基本的方法:

public interface BackButonListener { 
    boolean OnBackButtonPressed(); 
} 

public interface BackButtonWatchable { 
    void addBackButtonListener(BackButtonListener listener); 
    void removeBackButtonListener(BackButtonListener listener); 
} 

public class MyActivity extends Activity implements BackButtonWatchable { 
... 
    private static ArrayList<BackButtonListener> backButtonListeners 
     = new ArrayList<BackButtonListener>(); 
    @Override 
    public void addBackButtonListener(BackButtonListener listener) { 
      backButtonListeners.add(listener); 
    } 
    @Override 
    public void removeBackButtonListener(BackButtonListener listener) { 
      backButtonListeners.remove(listener); 
    } 
... 
    @Override 
    public void onBackButtonPressed() 
    { 
     boolean supressBackButton = false; 
     for (BackButtonListener listener: backButtonListeners) 
     { 
      if (!listener.OnBackButtonPressed()) { 
        suppressBackButton = true; 
      } 
     } 
     if (!suppressBackButton) { 
      super.onBackButtonPressed(); 
     } 
    } 
} 


public class MyFragment extends Fragment implements BackButtonListerer { 
    @Override 
    public void onResume() 
    { 
      ((BackButtonWatchable)getActivity()).addBackButtonListener(this); 
    } 
    @Override 
    public void onPause()  { 
      ((BackButtonWatchable)getActivity()).removeBackButtonListener(this); 
    } 
} 
+0

要清楚,我們正在處理一個活動和一個片段,都是活動中的接口,還是一個在Activity中,另一個在Fragment中? – Sevren

+0

我建議將接口聲明在頂層。不屬於活動。如果您只想在一個活動中使用您的片段,您可以將Fragment.getActivity()的值轉換爲您的頂級類,並且根本不使用接口。 –

+0

...可能正確的模式是聲明片段中的接口。在這種情況下,BackButtonWatchable應該重命名爲MyFragment.MyFragmentListener。 (片段的優秀模式),然後包含片段的任何活動都必須實現MyFragment.MyFragmentListener。您只需將MyFragment.getActivity()強制轉換爲頂級類,但如果您想要將該片段重新放置到另一個活動中,則會變得很困難。 MyFragmentListener接口是有用的,因爲它迫使你保持片段和活動精益和平均之間的聯繫。 –

0

克里特接口

public interface OnBackPressedListener { 
    void onBackPressed(); 
} 

,並在活動創建領域

private OnBackPressedListener mListener; 

和你onBackPressed()應該看起來像

if (mListener != null) { 
    mListener.onBackPressed(); 
} else { /* do your acitivty usual stuff */ } 

當創建片段時,您在活動中將此片段註冊爲mListener,並且不要在onDestroy中將其設置爲null。