Android: изменить текущий контент в приложении панели навигации, не показывая элемент в меню панели управления - PullRequest
0 голосов
/ 06 августа 2020

Я новичок в разработке Android и хотел бы создать приложение с навигационным ящиком. Я начал с шаблона по умолчанию из окна Android Studio 'create project'.

Это код из MainActivity, который настраивает навигацию по ящику.

@Override
protected void onCreate(Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState);
    
    setContentView(R.layout.activity_main);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    mAppBarConfiguration = new AppBarConfiguration.Builder(
        R.id.nav_customers, R.id.nav_notes, R.id.nav_stats, R.id.nav_settings)
            .setDrawerLayout(drawer)
            .build();
    navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);
}

I ' У меня есть фрагмент, который является страницей "клиенты". Эта страница содержит кнопку, которую пользователь может нажать, чтобы создать нового клиента. При нажатии этой кнопки должна открываться новая страница, на которой вводятся данные для создания клиента. Эта новая страница не должна быть элементом навигации, к которому пользователь может перейти напрямую. Единственный способ и причина открыть эту страницу должны заключаться в использовании кнопки «создать клиента» в представлении клиентов, о котором я упоминал.

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

Кажется, нужно сделать две наиболее важные вещи:

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

Это кажется простым, и я много пробовал, но не сделал этого. Пока не нашел решения.

1 Ответ

1 голос
/ 06 августа 2020

Вы можете проверить do c:

Определите на своем графике что-то вроде:

<fragment android:id="@+id/a"
          android:name="com.example.myapplication.FragmentA"
          android:label="a"
          tools:layout="@layout/a">
    <action android:id="@+id/action_a_to_b"
            app:destination="@id/b"/>
</fragment>
<fragment android:id="@+id/b"
          android:name="com.example.myapplication.FragmentB"
          android:label="b"
          tools:layout="@layout/b">
</fragment>

, а затем просто используйте для навигации:

findNavController().navigate(R.id.action_a_to_b)

Проверьте также эту страницу :

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

В FragmentB в onCreateView вы можете расширить свой макет

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    val root = inflater.inflate(R.layout.fragment_B container, false)

В этом макете вы можете поместить Toolbar:

<LinearLayout>
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        ... />
    ...
</LinearLayout>

и:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val navController = findNavController()
    val appBarConfiguration = AppBarConfiguration(navController.graph)

    view.findViewById<Toolbar>(R.id.toolbar)
            .setupWithNavController(navController, appBarConfiguration)
}

Альтернативный - настроить навигацию в Activity и использовать OnDestinationChangedListener:

navController.addOnDestinationChangedListener { _, destination, _ ->
   if(destination.id == R.id.b) {
       toolbar.visibility = View.GONE
       //....
   } else {
       toolbar.visibility = View.VISIBLE
       //.....
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...