如何让活动通知片段后退按钮已被按下
我一直在研究这几天,但尚未找到工作解决方案。有很多可用的信息,但由于我对Android的经验不足,我无法得到任何工作建议。如何让活动通知片段后退按钮已被按下
我有一个活动,其上有3个碎片堆栈,所有这些都是使用FragmentManager事务呈现并添加到堆栈。在第三个片段处于活动状态时,我需要拦截onBackPressed()方法并在碎片被销毁之前执行一些额外的东西。
我已经尝试过使用回调函数和接口来捕获Activity上的onBackPressed()并将它发送到第三片段,但没有运气。
在Activity的onBackPressed()方法的堆栈监视中深入片段的正确方法是什么?
让我知道如果这不明确。
感谢您的帮助。
这是回答我的问题的文章。对于Android新手来说,这告诉我所有需要去的地方。
https://*.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();
}
}
看起来不错,恭喜!您的答案与其他发布的答案类似。您可以通过增加其他帖子来显示您的赞赏,以便获得帮助。 –
是的,我upvoted那个帮助。 – Sevren
不编译和测试,但这种勾画出了基本的方法:
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);
}
}
要清楚,我们正在处理一个活动和一个片段,都是活动中的接口,还是一个在Activity中,另一个在Fragment中? – Sevren
我建议将接口声明在顶层。不属于活动。如果您只想在一个活动中使用您的片段,您可以将Fragment.getActivity()的值转换为您的*类,并且根本不使用接口。 –
...可能正确的模式是声明片段中的接口。在这种情况下,BackButtonWatchable应该重命名为MyFragment.MyFragmentListener。 (片段的优秀模式),然后包含片段的任何活动都必须实现MyFragment.MyFragmentListener。您只需将MyFragment.getActivity()强制转换为*类,但如果您想要将该片段重新放置到另一个活动中,则会变得很困难。 MyFragmentListener接口是有用的,因为它迫使你保持片段和活动精益和平均之间的联系。 –
克里特接口
public interface OnBackPressedListener {
void onBackPressed();
}
,并在活动创建领域
private OnBackPressedListener mListener;
和你onBackPressed()应该看起来像
if (mListener != null) {
mListener.onBackPressed();
} else { /* do your acitivty usual stuff */ }
当创建片段时,您在活动中将此片段注册为mListener,并且不要在onDestroy中将其设置为null。
is onBackPressed()是否必需?或者你只是试图做一些事情,因为片段被毁坏? –
也许最好重写'onPause'? –
堆栈中的最后2个碎片需要同时弹出,或者一个紧跟在另一个之后,我用两次调用popBackStack()建立的取消按钮来完成此操作(可能不是最佳方式这样做...),所以我需要做同样的onBackPressed(),否则只有1片段被破坏。 – Sevren