2015-01-13 8 views
3

У меня проблема с моими фрагментами. В принципе, у меня есть приложение, в котором есть навигационный ящик и 4 кнопки в действии. Когда каждая кнопка нажата, на дисплее появится другой фрагмент. Проблема в том, что я хочу отобразить правильный заголовок в ActionBar. Я могу отобразить выбранный элемент из навигации в ActionBar. Но когда я нажал кнопку, чтобы перейти к другому фрагменту, я не могу отобразить заголовок в ActionBar. Есть идеи?Android Fragment Change Название

Вот мой пример кода: 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

Я использовал onBackStackChangedListener в своем MainActivity и использовал его для обновления всех видов вещей при навигации в приложении. Вы уже вручную изменить название так попробовать что-то вроде этого:

//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 функции и вы справляетесь с backstack время нажатие на спину? –

+1

Проверьте обновленный ответ, он управляет стоп-кадрами при нажатии кнопки «Назад». BaseFragment - это мой собственный класс для моих фрагментов, поэтому в вашем случае это, вероятно, будет 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; 
    } 

Update:

вы можете изменить название путем переопределения метода onResume. И для безопасной стороны вы также можете переопределить setUserVisibleHint и изменить заголовок при фрагменте isVisibleToUser.

+2

В случае добавления фрагмента в BackStack это решение не работает. – Amir

+1

Пожалуйста, отметьте это как принято, если оно сработало для вас. –

Смежные вопросы