有没有一种类似于我们在Android Activity中实现的方式可以在Android Fragment中实现onBackPressed()
?
由于片段生命周期没有onBackPressed()
。 在Android 3.0片段中还有其他替代方法可以替代onBackPressed()
吗?
#1楼
根据@HaMMeRed的回答,这里是伪代码,它应该如何工作。 可以说您的主要活动称为BaseActivity
,它具有子片段(如SlidingMenu lib示例中的片段)。 步骤如下:
首先,我们需要创建接口和实现其接口的类以具有通用方法
创建类接口
OnBackPressedListener
public interface OnBackPressedListener { public void doBack(); }
创建实现
OnBackPressedListener
技能的OnBackPressedListener
public class BaseBackPressedListener implements OnBackPressedListener { private final FragmentActivity activity; public BaseBackPressedListener(FragmentActivity activity) { this.activity = activity; } @Override public void doBack() { activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } }
从现在开始,我们将处理代码
BaseActivity
及其片段在类
BaseActivity
上创建私有侦听BaseActivity
protected OnBackPressedListener onBackPressedListener;
创建方法以在
BaseActivity
设置侦听BaseActivity
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) { this.onBackPressedListener = onBackPressedListener; }
在重写
onBackPressed
实现类似的东西@Override public void onBackPressed() { if (onBackPressedListener != null) onBackPressedListener.doBack(); else super.onBackPressed();
在
onCreateView
的片段中,您应该添加我们的监听器@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { activity = getActivity(); ((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity)); View view = ... ; //stuff with view return view; }
瞧,现在当您在片段中单击返回时,您应该捕获自定义的返回方法。
#2楼
在片段之间进行过渡时,只需添加addToBackStack
,如下所示:
fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();
如果编写addToBackStack(null)
,它将自行处理,但是如果提供标记,则应手动处理。
#3楼
不要实现ft.addToBackStack()方法,这样当您按下“后退”按钮时,您的活动将完成。
proAddAccount = new ProfileAddAccount();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, proAddAccount);
//fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
#4楼
这些都不容易实现,也不会以最佳方式发挥作用。
片段有一个可以调用onDetach的方法来完成这项工作。
@Override
public void onDetach() {
super.onDetach();
PUT YOUR CODE HERE
}
这将完成工作。
#5楼
解决方案很简单:
1)如果您具有所有片段都扩展的基本片段类,则将此代码添加到其类中,否则创建此类基本片段类
/*
* called when on back pressed to the current fragment that is returned
*/
public void onBackPressed()
{
// add code in super class when override
}
2)在您的Activity类中,如下重写onBackPressed:
private BaseFragment _currentFragment;
@Override
public void onBackPressed()
{
super.onBackPressed();
_currentFragment.onBackPressed();
}
3)在您的Fragment类中,添加所需的代码:
@Override
public void onBackPressed()
{
setUpTitle();
}
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3162327