Компонент навигации: проблема с панелью инструментов при условной навигации

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

Следуя этому принципу и прочитав сообщение на условная навигация от Марии Ноймайер У меня возникли некоторые проблемы с панелью инструментов и обратной навигацией при прохождении потоков условной навигации.

Я разрабатываю приложение, используя одно действие с ConstraintLayout, панелью инструментов и NavHostFragment:

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.activities.NavigationTestActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/nav_graph"
        app:defaultNavHost="true"
        />

</android.support.constraint.ConstraintLayout>

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

Основной график

Я назвал этот вложенный граф welcomeGraph, и он включает экраны для входа в систему или регистрации, вы можете увидеть его здесь:

Добро пожаловать в вложенный график

В homeFragment onResume я проверяю, был ли выполнен вход в систему / регистрация (определяется фиктивным логическим значением, хранящимся в sharedPrefs), и если нет, я запускаю приветственный вложенный граф для регистрации / входа в систему.

В пункте назначения входа у меня есть кнопка «Завершено», которая устанавливает фиктивное логическое значение в sharedPrefs как true и запускает действие popToWelcomeGraph (включительно), которое должно закрыть весь вложенный граф и вернуть меня к homeFragment (это работает).

ПРОБЛЕМА - Проблема с панелью инструментов во вложенном графе:

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

ВОПРОС: Можно ли изменить панель инструментов здесь, чтобы имитировать первый экран во вложенном графике, который является первым экраном в приложении до завершения входа в систему / регистрации? Будет ли это плохой практикой?


person Eduardo    schedule 20.08.2018    source источник


Ответы (2)


Вы должны реализовать интерфейс коммуникатора, как показано ниже

interface ActivityCommunicator {
    void alterToolbar();
}

и реализуйте его в своем классе активности, как показано ниже

class HomeActivity extends AppCompatActivity implements ActivityCommunicator {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Activity code
}

@Override
public void alterToolbar() {
    ActionBar actionBar = getSupportActionBar();
    // False to hide back button and true to show it
    actionBar.setDisplayHomeAsUpEnabled(false);
}

}

и из вашего фрагмента вы можете назвать его, как показано ниже

public class MainFragment extends Fragment {

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    ActivityCommunicator activityCommunicator = (ActivityCommunicator) getActivity();
    activityCommunicator.alterToolbar();
    // Fragment code
    return super.onCreateView(inflater, container, savedInstanceState);
}

}

Вы можете изменить реализацию alterToolbar () в соответствии с вашими потребностями.

person SSB    schedule 20.08.2018
comment
Я не тестировал его, но думаю, что это только «скроет» кнопку вверх на панели инструментов, но если пользователь нажмет на кнопку возврата телефона, он все равно вернет пользователя обратно в homFragment. - person Seven; 04.01.2019

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

private lateinit var appBarConfiguration: AppBarConfiguration
...

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  appBarConfiguration = AppBarConfiguration(setOf(R.id.homeFragment,R.id.welcomeFragment))
  findViewById<Toolbar>(R.id.toolbar).setupWithNavController(navController, appBarConfiguration)
}

Таким образом, кнопка возврата не будет отображаться на фрагментах верхнего уровня.

person iskae    schedule 26.03.2019