如何仅在最顶部的片段上触发 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()
在 MainFragment
和 DetailFragment
上触发。在 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;
}
});
}
我有 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()
在 MainFragment
和 DetailFragment
上触发。在 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;
}
});
}