Android 支持Fragment on pop backstack调用什么方法?
Android Support Fragment on pop backstack what method is called?
我最近将我的应用程序从本机片段切换到 v4 支持片段库,但是现在当我将片段从返回堆栈中弹出时,不会在前一个片段上调用 onCreateView()。替换片段时,我需要能够更改 header 中的按钮。我尝试同时使用 onHiddenChanged() 和 setUserVisibleHint() 但当片段重新进入视图时似乎都没有被调用。
阅读另一个话题,我看到有人说要使用 onBackStateChanged 侦听器,但我遇到了一些问题。当我的应用程序启动时,它会用文章列表视图(部分)替换片段容器。当用户选择一篇文章时,它会将部分片段替换为文章片段。记录返回堆栈的计数现在为 1。当用户点击返回按钮时,将再次显示剖面视图。我希望能够为我的部分片段调用 onResume 但计数为 0 并说:
09-28 00:45:17.443 21592-21592/com.reportermag.reporter E/Backstack
size﹕ 0 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.Fragment.onResume()' on a null object reference
如何获取对文章列表片段的引用以便调用 onResume()?
我试过的代码:
public void onBackStackChanged() {
android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
if (manager != null)
{
int backStackEntryCount = manager.getBackStackEntryCount();
Log.e("Backstack size", Integer.toString(backStackEntryCount));
android.support.v4.app.Fragment fragment = manager.getFragments().get(backStackEntryCount > 0 ? backStackEntryCount-1:backStackEntryCount);
fragment.onResume();
}
}
public void setUserVisibleHint(boolean visible)
{
super.setUserVisibleHint(visible);
if (visible && isResumed())
{
// Set the titlebar
Titlebar.setColor(getResources().getColor(R.color.graydark));
Titlebar.setVisible(Titlebar.VIEWS.MENU, Titlebar.VIEWS.LOGO, Titlebar.VIEWS.SEARCH);
// Clear Search
SearchFragment.clearSearch();
}
}
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(hidden == false) {
// Set the titlebar
Titlebar.setColor(getResources().getColor(R.color.graydark));
Titlebar.setVisible(Titlebar.VIEWS.MENU, Titlebar.VIEWS.LOGO, Titlebar.VIEWS.SEARCH);
// Clear Search
SearchFragment.clearSearch();
}
}
更新:
这是我的片段加载器:
public void loadSectionFragment(Integer sectionID) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Set the arguments
Bundle bundle = new Bundle();
bundle.putInt("section", sectionID);
// Add the section fragment
Fragment sectionFrag = sections.get(sectionID);
if (sectionFrag == null) {
sectionFrag = new SectionFragment();
sectionFrag.setArguments(bundle);
sections.put(sectionID, sectionFrag);
}
transaction.setCustomAnimations(R.animator.enter_anim, R.animator.exit_anim);
transaction.replace(R.id.fragment_container, sectionFrag);
transaction.addToBackStack(null);
// Commit the new fragment
transaction.commit();
}
public void loadArticleFragment() {
FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
// Set the arguments
Bundle bundle = new Bundle();
bundle.putInt("id", id);
bundle.putInt("color", color);
// Add the article fragment
Fragment articleFrag = new ArticleFragment();
articleFrag.setArguments(bundle);
transaction.replace(R.id.fragment_container, articleFrag);
transaction.addToBackStack(null);
// Commit the new fragment
transaction.commit();
}
如果您希望在从后台返回时更新您的片段,请使用此模式:
backStackListener = new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Fragment f = getSupportFragmentManager().findFragmentById(R.id.yourFragmentContainerId);
if(f!=null){
if(f instanceof YourSectionFragment ){
((YourSectionFragment )f).update();
}else{
}
}
}
};
getSupportFragmentManager().addOnBackStackChangedListener(backStackListener);
然后将方法添加到您的片段
public void update(){
//update your ui
}
我最近将我的应用程序从本机片段切换到 v4 支持片段库,但是现在当我将片段从返回堆栈中弹出时,不会在前一个片段上调用 onCreateView()。替换片段时,我需要能够更改 header 中的按钮。我尝试同时使用 onHiddenChanged() 和 setUserVisibleHint() 但当片段重新进入视图时似乎都没有被调用。
阅读另一个话题,我看到有人说要使用 onBackStateChanged 侦听器,但我遇到了一些问题。当我的应用程序启动时,它会用文章列表视图(部分)替换片段容器。当用户选择一篇文章时,它会将部分片段替换为文章片段。记录返回堆栈的计数现在为 1。当用户点击返回按钮时,将再次显示剖面视图。我希望能够为我的部分片段调用 onResume 但计数为 0 并说:
09-28 00:45:17.443 21592-21592/com.reportermag.reporter E/Backstack size﹕ 0 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.Fragment.onResume()' on a null object reference
如何获取对文章列表片段的引用以便调用 onResume()?
我试过的代码:
public void onBackStackChanged() {
android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
if (manager != null)
{
int backStackEntryCount = manager.getBackStackEntryCount();
Log.e("Backstack size", Integer.toString(backStackEntryCount));
android.support.v4.app.Fragment fragment = manager.getFragments().get(backStackEntryCount > 0 ? backStackEntryCount-1:backStackEntryCount);
fragment.onResume();
}
}
public void setUserVisibleHint(boolean visible)
{
super.setUserVisibleHint(visible);
if (visible && isResumed())
{
// Set the titlebar
Titlebar.setColor(getResources().getColor(R.color.graydark));
Titlebar.setVisible(Titlebar.VIEWS.MENU, Titlebar.VIEWS.LOGO, Titlebar.VIEWS.SEARCH);
// Clear Search
SearchFragment.clearSearch();
}
}
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(hidden == false) {
// Set the titlebar
Titlebar.setColor(getResources().getColor(R.color.graydark));
Titlebar.setVisible(Titlebar.VIEWS.MENU, Titlebar.VIEWS.LOGO, Titlebar.VIEWS.SEARCH);
// Clear Search
SearchFragment.clearSearch();
}
}
更新:
这是我的片段加载器:
public void loadSectionFragment(Integer sectionID) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Set the arguments
Bundle bundle = new Bundle();
bundle.putInt("section", sectionID);
// Add the section fragment
Fragment sectionFrag = sections.get(sectionID);
if (sectionFrag == null) {
sectionFrag = new SectionFragment();
sectionFrag.setArguments(bundle);
sections.put(sectionID, sectionFrag);
}
transaction.setCustomAnimations(R.animator.enter_anim, R.animator.exit_anim);
transaction.replace(R.id.fragment_container, sectionFrag);
transaction.addToBackStack(null);
// Commit the new fragment
transaction.commit();
}
public void loadArticleFragment() {
FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
// Set the arguments
Bundle bundle = new Bundle();
bundle.putInt("id", id);
bundle.putInt("color", color);
// Add the article fragment
Fragment articleFrag = new ArticleFragment();
articleFrag.setArguments(bundle);
transaction.replace(R.id.fragment_container, articleFrag);
transaction.addToBackStack(null);
// Commit the new fragment
transaction.commit();
}
如果您希望在从后台返回时更新您的片段,请使用此模式:
backStackListener = new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Fragment f = getSupportFragmentManager().findFragmentById(R.id.yourFragmentContainerId);
if(f!=null){
if(f instanceof YourSectionFragment ){
((YourSectionFragment )f).update();
}else{
}
}
}
};
getSupportFragmentManager().addOnBackStackChangedListener(backStackListener);
然后将方法添加到您的片段
public void update(){
//update your ui
}