FAB при нажатии запускает новую активность на основе фрагмента, показанного в данный момент - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь придумать хороший способ начать действие, щелкнув плавающую кнопку действия. Моя FAB находится в mainactivity. xml. Моя MainActivity состоит из нижней навигации с фрагментами. Мне нужно реализовать другое действие по щелчку, определяемое показанным фрагментом.

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab_add);
fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    fabClicked();
    }
});

fabClicked Метод

public void fabClicked() {
    Object id = getSupportFragmentManager().findFragmentById(R.id.container);


    if ((getSupportFragmentManager().findFragmentById(R.id.fragment_1)).equals(id)) {
        Intent intent1 = new Intent(MainActivity.this, Add1.class);
        startActivity(intent1);
    }

    else if ((getSupportFragmentManager().findFragmentById(R.id.fragment_2)).equals(id)) {
        Intent intent2 = new Intent(MainActivity.this, Add2.class);
        startActivity(intent2);
    }

    else if ((getSupportFragmentManager().findFragmentById(R.id.fragment_3)).equals(id)) {
        Intent intent3 = new Intent(MainActivity.this, Add3.class);
        startActivity(intent3);
    }
    else if ((getSupportFragmentManager().findFragmentById(R.id.fragment_home)).equals(id)) {
        //plan to add to code to hide fab on homescreen
    }

}

Ответы [ 2 ]

0 голосов
/ 06 июля 2020

Ваш подход хорош, но он выполняет множество ненужных дорогостоящих поисков фрагментов.

Вы можете получить идентификатор навигации текущего фрагмента с помощью:

navController.getCurrentDestination().getId()

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

fun fabClicked() {
    val id = navController.getCurrentDestination().getId()
    val class = when(id) {
        R.id.fragment_1 -> Add1::class
        R.id.fragment_2 -> Add2::class
        // etc
    }
    startActivity(Intent(this, class.javaClass))
}

Таким образом, вам не нужно выполнять поиск фрагментов для каждого условия просто сравните идентификаторы. Вы также можете извлечь общий startActivity logi c (как показано здесь), чтобы сделать его более кратким.

0 голосов
/ 30 мая 2020

Одно простое решение для этого:

Всякий раз, когда используется нижняя навигация, просто сохраняйте идентификатор выбранного фрагмента в переменной stati c, а когда пользователь нажимает FAB, просто открывайте действие на основе фрагмент, хранящийся в переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...