片段:按下返回按钮并自定义它时调用哪个回调

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,这是现有FragmentActivityAppCompatActivity 的新基类。

您现在可以通过addOnBackPressedCallback 注册OnBackPressedCallback 以接收onBackPressed() 回调,而无需在您的活动中覆盖该方法。

【讨论】:

您能否为 addOnBackPressedCallback 显示一些特定代码(以及它的去向)?

以上是关于片段:按下返回按钮并自定义它时调用哪个回调的主要内容,如果未能解决你的问题,请参考以下文章

当我按手机上的返回键时调用哪种方法?

如果在 WebView 片段中按下后退按钮,如何返回上一页?

通过调用 popBackStackImmediate 返回到 tablayout 中的替换片段时调用哪个方法

在 Android 片段中使用 onBackPressed()

如何在按下单个片段的手动后退按钮时返回上一个片段?

在诺基亚触摸设备中按下菜单按钮时调用的事件