Исправить изменение заголовка навигационного ящика при изменении ориентации?

Когда ориентация изменяется в моем приложении, заголовок на панели действий меняется с заголовка фрагмента, выбранного в навигационном ящике, на заголовок приложения.

Пример панели навигации сохраняет название при изменении ориентации, поскольку фрагмент является подклассом основного действия и имеет эту строку кода

getActivity().setTitle(planet);

Теперь я немного новичок, поэтому я не знаю, как сохранить название и реализовать код, вы, ребята, можете помочь?

На всякий случай, если кто-то из вас захочет посмотреть, вот подкласс для PlanetFragment.

public static class PlanetFragment extends Fragment {
    public static final String ARG_PLANET_NUMBER = "planet_number";

    public PlanetFragment() {
        // Empty constructor required for fragment subclasses
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_planet, container, false);
        int i = getArguments().getInt(ARG_PLANET_NUMBER);
        String planet = getResources().getStringArray(R.array.planets_array)[i];

        int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()),
                        "drawable", getActivity().getPackageName());
        ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId);
        getActivity().setTitle(planet);
        return rootView;
    }
}

person Alex    schedule 22.07.2013    source источник


Ответы (4)


Вот что я сделал из примера панели навигации:

  • onSaveInstanceState() вашей активности:

    @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); CharSequence title = mDrawerLayout.isDrawerOpen(mLeftDrawer) ? mDrawerTitle:mTitle; outState.putCharSequence(KEY_STATE_TITLE, title); }

  • onCreate() вашей активности:

    if (saveInstanceState!=null) { setTitle(savedInstanceState.getCharSequence(KEY_STATE_TITLE)); }

Надеюсь, это поможет.

person maohieng    schedule 18.03.2014
comment
Должно быть getActivity().setTitle() - person gegobyte; 03.07.2016

Ответ @maohieng помог мне, но он устанавливал неправильный заголовок, если ящик открыт при изменении ориентации (это было имя экрана, а не название приложения, как должно быть). Поэтому я реализовал этот код, который отлично решает проблему.

На onSaveInstanceState() я использую логическое значение, чтобы проверить, открыт ли ящик. Кажется странным, но isDrawerOpen(mDrawer) возвращает false после изменения ориентации, когда я вызываю его в onCreate():

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putCharSequence("title", mTitle);
    outState.putBoolean("isDrawerOpen",
            mDrawerLayout.isDrawerOpen(mDrawerLinear));
}

На onCreate() активности:

if (savedInstanceState == null) {
    selectItem(YOUR_FRAGMENT);
} else {
    if (savedInstanceState.getBoolean("isDrawerOpen")) {
        mTitle = savedInstanceState.getCharSequence("title");
    } else {
        setTitle(savedInstanceState.getCharSequence("title"));
    }
}
person Filutkie    schedule 18.04.2014

Нашел способ сохранить заголовки фрагов на панели действий при изменении ориентации, не уверен, что это лучший способ, но мне кажется довольно чистым.

public class Example extends Fragment{

private String[] titleList;

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

    titleList = getResources().getStringArray(R.array.sell_array);
    getActivity().setTitle(titleList[0]);

    return inflater.inflate(R.layout.fish, container, false);
}


}

Каждый фрагмент имеет соответствующий номер позиции массива. Также из класса Main Activity я убрал ненужные

setTitle(titleList[position]);

при выборе любого элемента ящика навигации, поскольку теперь он обрабатывается из соответствующих классов фрагментов

person Alex    schedule 22.07.2013

вам нужно добавить setTitle(menuItem.getTitle()); как показано ниже,

@Override public boolean onNavigationItemSelected(MenuItem menuItem) {

            //Checking if the item is in checked state or not, if not make it in checked state
            if (menuItem.isChecked()) menuItem.setChecked(false);
            else menuItem.setChecked(true);


            **setTitle(menuItem.getTitle());**
            //Closing drawer on item click
            drawerLayout.closeDrawers();

Надеюсь, это поможет.

person Brinda Jagani    schedule 18.09.2015