Индикатор отображения ящика Android Navigation для фрагментов нижнего уровня

У меня есть некоторые проблемы, которые меняют функциональность навигационного ящика, чтобы повысить функциональность на фрагменте более низкого уровня. Я прочитал этот поток, чтобы показать индикатор вверх. Но при нажатии кнопки он откроет навигационный ящик вместо возврата к предыдущему фрагменту. И я не могу установить название панели действий в EditUserFragment в "Редактировать профиль". Я использую шаблон навигационного ящика, доступный в Android Studio.

У меня три уровня:

  • MainActivity с навигационным ящиком, состоящим из элементов Home и Profile
  • UserFragment с названием "Профиль" , в котором есть элемент с параметром EditUserFragment
  • EditUserFragment (фрагмент нижнего уровня) запускается с помощью UserFragment


MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
            R.drawable.ic_launcher, R.string.navigation_drawer_open,
            R.string.navigation_drawer_close);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    // this won't change the drawer indicator back
    drawerToggle.setDrawerIndicatorEnabled(true);
    // this works
    drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}

public void onSectionAttached(int number) {
    // Show the corresponding title on the action bar when clicked and open corresponding
    // fragments.
    Fragment fragment = null;

    switch (number) {
        case 1:
            mTitle = getString(R.string.title_home);
            break;
        case 2:
            mTitle = getString(R.string.title_profile);
            fragment = new UserFragment();
            break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (!mNavigationDrawerFragment.isDrawerOpen()) {
        // Only show items in the action bar relevant to this screen
        // if the drawer is not showing. Otherwise, let the drawer
        // decide what to show in the action bar.
        getMenuInflater().inflate(R.menu.main, menu);
        restoreActionBar();
        return true;
    }
    return super.onCreateOptionsMenu(menu);
}

public void restoreActionBar() {
    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    actionBar.setTitle(mTitle);
}

public void setActionBarTitle(String title){
    getActionBar().setTitle(title);
    Log.d("Title 2", getActionBar().getTitle().toString());
}

onBackPressed работает частично (прокомментировано в коде), когда я нажал кнопку "Назад" на телефоне (не вверх на панели действий).


UserFragment

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

    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_profile, container, false);

    drawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout,
            R.drawable.ic_launcher, R.string.navigation_drawer_open,
            R.string.navigation_drawer_close);

    return view;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_edit:
            drawerToggle.setDrawerIndicatorEnabled(false);
            // Disable sliding from edge to open drawer
            drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            getFragmentManager().beginTransaction()
                    .replace(R.id.container, new EditUserFragment())
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                    .addToBackStack(null)
                    .commit();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

EditUserFragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
    ((MainActivity) getActivity()).setActionBarTitle("Edit Profile");
    Log.d("Title", getActivity().getActionBar().getTitle().toString());
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Get item selected and deal with it
    Log.d("KEY: ", String.valueOf(item.getItemId()));
    switch (item.getItemId()) {
        case android.R.id.home:
            Log.d("EditUserFragment", "I'm here");
            getActivity().onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); работает так, как ожидается, что вместо ящика отображается вверх каретка; хотя при нажатии на него он открывает ящик вместо возврата к предыдущему фрагменту. Кроме того, код под case android.R.id.home никогда не выполняется. И я пытаюсь установить название панели действий для "Изменить профиль" в "Профиль" . Журнал показывает мне "Редактировать профиль", но фактическое запущенное приложение по какой-то причине показывает мне "Профиль" .


То, что я хочу достичь, сможет вернуться к UserFragment с EditUserFragment, нажав на индикатор вверх (прямо сейчас индикатор вверх открывает навигационный ящик). И показать правильный заголовок в EditUserFragment.

Любая помощь очень ценится!

Ответ 1

После нескольких дней анализа я обнаружил, что проблема в том, что я использую встроенную активность ящика навигации при ее создании. Встроенные функции разделяют на два. MainActivity и NavigationDrawerFragment. Таким образом, drawerToggle я в MainActivity не совпадает с реальным в NavigationDrawerFragment.

Oroginal, MainActivty вызывает NavigationDrawerFragment, чтобы настроить все необходимое для навигационного ящика. я SOLVED, выполнив навигацию в моем MainActivity, поэтому у меня будет только один drawerToggle. Хотя, я все еще не могу найти способ заставить его работать, если у меня есть все (переменные ящика навигации) в NavigationDrawerFragment, а не MainActivity. Если кто-то знает ответ на этот вопрос, не стесняйтесь оставлять комментарий!