【问题标题】: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课堂上做)

【问题讨论】:

    标签: android android-layout android-intent android-emulator android-fragments


    【解决方案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 显示一些特定代码(以及它的去向)?
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多