Добавление кнопки "Назад" в Action Bar. Android

81
29 марта 2022, 20:20

Есть два фрагмента. Во фрагменте 1 при нажатии кнопки открывается второй фрагмент. Вот код первого фрагмента:

public class NotificationsFragment extends Fragment {
    private NotificationsViewModel notificationsViewModel;
    private Button registrationButton, autorisationButton;
    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        notificationsViewModel =
                ViewModelProviders.of(this).get(NotificationsViewModel.class);
        View root = inflater.inflate(R.layout.fragment_notifications, container, false);
        registrationButton = (Button) root.findViewById(R.id.button);
        registrationButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RegFragment frg4 = new RegFragment();
                FragmentTransaction trans4 = getFragmentManager().beginTransaction();
                trans4.replace(R.id.nav_host_fragment, frg4);
                trans4.addToBackStack(null);
                trans4.commit();
            }
        });
        return root;
    }
}

Код второго фрагмента, который открывается при нажатии на кнопку в первом:

public class RegFragment extends Fragment {
    private RegViewFragment regViewFragment;
    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        regViewFragment =
                ViewModelProviders.of(this).get(RegViewFragment.class);
        View root = inflater.inflate(R.layout.m_registeration, container, false);
        return root;
    }
}

Не могу понять как добавить в Action Bar стрелку, при нажатии на которую, осуществлялся возврат со второго фрагмента на первый. При нажатии на системную кнопку "назад" всё работает.

Внешне это сейчас выглядит вот так:

При нажатии на кнопку Зарегистрироваться открывается следующий фрагмент:

Answer 1

Все довольно просто. Добавляете тулбар в xml вашего фрагмента:

<android.support.design.widget.AppBarLayout
            android:id="@+id/appBarLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>

дальше инициализируете его в фрагменте:

Toolbar toolbar = root.findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_arrow_back_black_24dp);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

и дальше либо используете этот способ:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        // Respond to the toorbar's NavigationIcon as up/home button
        case android.R.id.home:
            //NavigationIcon
            return true;
    }
    return super.onOptionsItemSelected(item);
}

либо такой метод:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

Вот тут есть много полезной информации.

Answer 2

Разобрался.

Это добавляем в метод onCreateView во фрагменте, который открывается при нажатии кнопки:

ActionBar actionBar = ((MainActivity)getActivity()).getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);

Это добавляем не во фрагмент, в котором находится кнопка, вызывающая другой фрагмент, а в MainActivity:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            super.onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}
READ ALSO
Как стороннему потоку сказать главному, что он завершился?

Как стороннему потоку сказать главному, что он завершился?

Вопрос вызван тем, что у меня есть CyclicBarrier, и мне из главного потока нужно узнать, когда CyclicBarrier открылсяДля CyclicBarrier я могу указать Runnable, который...

100
Растяжение изображения

Растяжение изображения

Подскажите, пожалуйста, каким(и) способом можно обработать готовое изображение что бы растянув/сжав придать ему форму разностороннего четырёхугольника...

83
Android поиск в AppBar

Android поиск в AppBar

Я начинающий программистУ меня возникла небольшая проблема

211
Не получается добавить информацию в базу данных с помощью PDO

Не получается добавить информацию в базу данных с помощью PDO

Создал таблицу и пытаюсь занести в неё данные из формыДанные не заносятся

98