2015-01-13 84 views
3

我的碎片有问题。基本上,我有一个应用程序,其中有一个导航抽屉和4个按钮。当每个按钮被按下时,它会显示另一个片段。我遇到的问题是我想在ActionBar上显示正确的标题。我可以在ActionBar上的导航中显示选定的项目。但是当我按下按钮去另一个片段时,我无法在ActionBar上显示标题。有任何想法吗?Android碎片更改标题

这里是我的示例代码: HomeActivity.class

private void displayView(final int position) { 
    // update the main content by replacing fragments 
    Fragment fragment = null; 
    switch (position) { 
     case 0: 
      fragment = new HomeFragment(); 
      break; 
     case 1: 
      fragment = new MyProfileFragment(); 
      break; 
     case 2: 
      fragment = new AboutFragment(); 
      break; 
     default: 
      break; 
    } 

    if (fragment != null) { 
     fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.frame_container, fragment).commit(); 

     // update selected item and title, then close the drawer 
     mDrawerList.setItemChecked(position, true); 
     mDrawerList.setSelection(position); 
     setTitle(navMenuTitles[position]); 
     drawer.closeDrawer(mDrawerList); 
    } else { 
     // error in creating fragment 
     Log.e("MainActivity", "Error in creating fragment"); 
    } 

} 

HomeFragment:

public class HomeFragment extends Fragment { 

public HomeFragment() { 
} 

CardView card_cart, card_scan, card_categories, card_about; 
Intent i; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_home, container, false); 
    initControls(rootView); 
    return rootView; 
} 

private void initControls(View rootView) { 

    card_cart = (CardView) rootView.findViewById(R.id.card_cart); 
    card_scan = (CardView) rootView.findViewById(R.id.card_scan); 
    card_categories = (CardView) rootView.findViewById(R.id.card_categories); 
    card_about = (CardView) rootView.findViewById(R.id.card_about); 

    card_categories.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      i = new Intent(getActivity(), CategoriesActivity.class); 
      startActivity(i); 
     } 
    }); 

    card_cart.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      MyCartFragment nextFrag = new MyCartFragment(); 
      getFragmentManager().beginTransaction() 
        .replace(R.id.frame_container, nextFrag) 
        .addToBackStack(null) 
        .commit(); 
     } 
    }); 

    card_about.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      AboutGrabHutFragment aboutFrag = new AboutGrabHutFragment(); 
      getFragmentManager().beginTransaction() 
        .setBreadCrumbTitle(getResources().getString(R.string.about)) 
        .replace(R.id.frame_container, aboutFrag) 
        .addToBackStack(null) 
        .commit(); 


     } 
    }); 

    card_scan.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      i = new Intent(getActivity(), ScanActivity.class); 
      startActivity(i); 
     } 
    }); 

} 

在HomeFragment将这些4个按钮中找到。点击一个按钮后,会去另一个片段。我可以使用此显示:

card_about.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      AboutGrabHutFragment aboutFrag = new AboutGrabHutFragment(); 
      getFragmentManager().beginTransaction() 
        .setBreadCrumbTitle(getResources().getString(R.string.about)) 
        .replace(R.id.frame_container, aboutFrag) 
        .addToBackStack(null) 
        .commit(); 
      getActivity().setTitle("About"); 

     } 
    }); 

但问题是当我回去时,标题仍然是关于。希望有人知道如何解决这个问题。谢谢。

+0

看看这个链接https://stackoverflow.com/a/46705242/1770868 –

回答

2

我在我的MainActivity中使用了onBackStackChangedListener,并使用它在应用程序中导航时更新各种东西。你已经手动更改标题所以尝试这样的事:

//manager is my FragmentManager 
manager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      //I'm using this check to check if i'm on my MainFragment, you can use this in al kinds of ways. Decide yourself if you use it or not. 
      if (manager.getBackStackEntryCount() == 1) { 
       Class<? extends Fragment> FragClass; 
       //mCurrentFragment is my global Fragment variable to do and check stuff with as below. 
       FragClass = mCurrentFragment.getClass(); 
       if ((FragClass == DesiredFragment.class)) { 
        this.setTitle("desired title"); 
       } else if ((FragClass == OtherDesiredFragment.class)) { 
        //hope this helps. 
       } //etc.. 
      } 
     } 
    }); 
@Override 
public void onBackPressed() { 
// TODO Auto-generated method stub 
    try { 
     Class<? extends Fragment> FragClass; 
     FragClass = mCurrentFragment.getClass(); 
     if ((FragClass == HomeFragment.class)) { 
      System.exit(0); 
     } 
      popFragment(); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } 
} 

public void popFragment() { 
    try { 
     if (manager.getBackStackEntryCount() > 1) { 
      manager.popBackStack(); 
      manager.executePendingTransactions(); 
      ArrayList<Fragment> reversedFragments = new ArrayList<Fragment>(manager.getFragments()); 
      Collections.reverse(reversedFragments); 
      for (Fragment fragment : reversedFragments) { 
       if (fragment != null) { 
        try { 
         mCurrentFragment = (BaseFragment) fragment; 
        } catch (ClassCastException e) { 
         e.printStackTrace(); 
        } 
        break; 
       } 
      } 
     } else { 
      finish(); 
     } 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } 
} 
+0

试过这样做,但我回去时,它不更改标题 –

+1

你有@Override OnBackPressed功能,你处理堆栈中,而压在背上? –

+1

检查更新后的答案,它在按下后退按钮的同时控制后台堆栈。 BaseFragment是我的Fragments的自定义类,所以在你的情况下它可能是Fragment。 –

10

上的所需片段的onCreateView()方法,调用的setTitle(“”)的主要活动的方法。这样你就不需要检查背景新闻事件。

这个工作对我来说

如***

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.id.your_fragment_layout, container, 
       false); 
     getActivity().setTitle("Your actionbar title"); 

     return rootView; 
    } 

更新:

您可以通过重写onResume方法更改标题。而为了安全起见,您也可以覆盖setUserVisibleHint并在片段isVisibleToUser更改标题。

+2

如果向BackStack添加片段,此解决方案不起作用。 – Amir

+1

如果它适合您,请将其标记为已接受。 –