如何仅在最顶部的片段上触发 onResume(),在后退时

How to fire onResume() on top most fragment only, on back press

我有 2 个 Activity(s)。在第一个 Activity 中,最初有一个 Fragment

MainActivity.java

public class MainActivity extends Activity {
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myactivity);
        if(savedInstanceState == null) {
            getFragmentManager().beginTransaction().replace(R.id.fragmentContainer, MainFragment.newInstance().commit();
        }
    }
}

然后点击按钮 replaces 它与另一个片段。

@Override
public void onClick(View arg0) {
    DetailFragment detail = (DetailFragment)getFragmentManager().findFragmentById(R.id.detail);
    getFragmentManager().beginTransaction().replace(R.id.detail, detail, "detail").commit();
}

在 2nd Fragment 上有另一个按钮,点击它会打开一个新的 Activity。

Intent popUp = new Intent(MainActivity.this, PopUp.class);                      
popUp.putExtra("CarID", carID);
startActivity(popUp);

从 PopUp Activity,按设备返回将返回 MainActivity。 现在的挑战是应用程序的业务逻辑,我需要在用户返回时更新先前 MainActivity 的 ActionBar 标题。

为此,我正在监听 MainFragment 和 DetailFragment 上的 onResume()。此外,当用户从 DetailFragment 返回到 MainFragment 时,我会用不同的文本更新 ActionBar 标题。

所以我需要知道用户返回的确切时间:

1) PopUp Activity > Detail Fragment

2) Detail Fragment > Main Fragment

目前,当 PopUpActivity 关闭时,onResume()MainFragmentDetailFragment 上触发。在 MainFragment 上,我无法确切地确定是 onResume() 被调用用于第一种情况还是第二种情况。

仅当用户从 PopUpActivity > DetailFragment 返回时才在 DetailFragment 上触发 onResume() 的最佳做法是什么。换句话说,我如何从 DetailFragment 检测到 PopUpActivity 已关闭而不在 MainFragment 上触发 onResume()

我不会为了这样的事情而惹 onResume()

我建议执行以下操作:

  • 为标题创建 Stack<String>
  • 在您的 MainActivity 中实施 FragmentManager.OnBackStackChangedListener
  • 在您的 onBackStackChanged() 实现中,使用 FragmentManager.getBackStackEntryCount() 检查返回堆栈是否被压入或弹出。
    • 如果返回堆栈已被压入,则将 newly-displayed 片段的标题压入您的标题堆栈。
    • 如果后栈已经出栈,则出栈标题,并在新的栈顶设置带有标题的标题栏。
  • 如果您从 添加到返回堆栈的片段中设置标题,则从标题堆栈弹出标题并压入 newly-displayed 片段的标题,即替换堆栈顶部的标题。
  • startActivityForResult() 而不是 startActivity() 调用你的 PopupActivity
  • 覆盖 MainActivity 中的 onActivityResult(),这样当 PopupActivity returns 时,您可以将标题栏设置为堆栈顶部。
  • 不要忘记将 onSaveInstanceState() 中的标题堆栈保留在 MainActivity 中,并在 onCreate() 中恢复它。

这似乎只是为了维护标题而做的很多工作,但如果您尝试使用 onResume 来做这件事,您会把自己逼疯的。

试一试:

@Override
public void onResume() {

super.onResume();

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {

        if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){

            // handle back button

            return true;

        }

        return false;
    }
});

}