2015-07-03 34 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。

相关问题