片段:按下返回按钮并自定义它时调用哪个回调
Posted
技术标签:
【中文标题】片段:按下返回按钮并自定义它时调用哪个回调【英文标题】:Fragment: which callback invoked when press back button & customize it 【发布时间】:2012-03-31 00:04:08 【问题描述】:我有一个片段:
public class MyFragment extends Fragment
...
@Override
public View onCreateView(...)...
...
我实例化它:
MyFragment myFragment = new MyFragment();
我用上面的片段来替换当前的片段:
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// replace fragment
fragmentTransaction.replace(R.id.fragment_placeholder, myFragment, "myTag");
// NOTE: I did not add to back stack
现在,myFragment
正在屏幕上显示。注意:我没有将myFragment
添加到back stack。
我的两个问题:
1. 如果现在我按下手机返回按钮,会调用哪个fragment的生命周期回调??
2.如何自定义MyFragment
类中的后退按钮点击监听? (请不要建议我做myFragment.getView().setOnclickListener
,而是在MyFragment
课堂上做)
【问题讨论】:
【参考方案1】:问题一:见http://developer.android.com/reference/android/app/Fragment.html#Lifecycle:
“当一个片段不再被使用时,它会经历一系列反向的回调:
onPause() - 片段不再与用户交互,因为它的活动被暂停或片段操作被暂停 在活动中修改它。
onStop() - 片段不再对用户可见,因为它的活动正在停止或片段操作正在修改它 在活动中。
onDestroyView() - 允许片段清理与其视图关联的资源。
onDestroy() - 调用以对片段的状态进行最终清理。
onDetach() - 在片段不再与其活动关联之前立即调用。"
问题 2:如果您必须知道触发回调的是后退按钮具体,您可以在 Fragment 的 Activity 中捕获后退按钮按下并使用你自己的处理方法:
public class MyActivity extends Activity
//...
//Defined in Activity class, so override
@Override
public void onBackPressed()
super.onBackPressed();
myFragment.onBackPressed();
public class MyFragment extends Fragment
//Your created method
public void onBackPressed()
//Handle any cleanup you don't always want done in the normal lifecycle
【讨论】:
这只能用于清理。如果使用按后退按钮,我认为 Mar 是为了防止交换片段从 backstack 中返回。 就我而言,onBackPressed()
没有被调用。我通过 getView().setFocusableInTouchMode(true); 将焦点放在片段视图上来修复它; getView().requestFocus();在 onResume() 中。【参考方案2】:
androidx.activity 1.0.0-alpha01 发布并引入ComponentActivity
,这是现有FragmentActivity
和AppCompatActivity
的新基类。
您现在可以通过addOnBackPressedCallback
注册OnBackPressedCallback
以接收onBackPressed
() 回调,而无需在您的活动中覆盖该方法。
【讨论】:
您能否为 addOnBackPressedCallback 显示一些特定代码(以及它的去向)?以上是关于片段:按下返回按钮并自定义它时调用哪个回调的主要内容,如果未能解决你的问题,请参考以下文章
如果在 WebView 片段中按下后退按钮,如何返回上一页?
通过调用 popBackStackImmediate 返回到 tablayout 中的替换片段时调用哪个方法