يتضمن مكوِّن التنقل NavigationUI
الصف. تحتوي هذه الفئة على طرق ثابتة تدير التنقل باستخدام الجزء العلوي
شريط التطبيقات ودرج التنقل والتنقل السفلي.
شريط التطبيق العلوي
شريط التطبيق العلوي مكانًا ثابتًا في أعلى التطبيق لعرض المعلومات والإجراءات من الشاشة الحالية.
![شاشة تعرض شريط التطبيق العلوي](https://developer.android.com/static/topic/libraries/architecture/images/top-app-bar.png?authuser=19&hl=ar)
يحتوي NavigationUI
على طرق يتم من خلالها تعديل المحتوى في أول ظهور تلقائيًا.
شريط التطبيق أثناء تنقل المستخدمين في تطبيقك. على سبيل المثال، يستخدم NavigationUI
تصنيفات الوجهات من الرسم البياني للتنقل لإبقاء عنوان أهم تطبيق
تحديث الشريط.
<navigation> <fragment ... android:label="Page title"> ... </fragment> </navigation>
عند استخدام NavigationUI
مع عمليات تنفيذ شريط التطبيق العلوي التي تمت مناقشتها أدناه،
يمكن تعبئة التصنيف الذي تُرفِقه بالوجهات تلقائيًا من
يتم توفير الوسيطات إلى الوجهة باستخدام تنسيق {argName}
في
التصنيف.
يتيح NavigationUI
استخدام أهم أنواع أشرطة التطبيقات التالية:
لمزيد من المعلومات حول أشرطة التطبيقات، اطّلِع على مقالة إعداد شريط التطبيقات.
إعدادات AppBar
يستخدم NavigationUI
AppBarConfiguration
.
لإدارة سلوك زر التنقل في الزاوية العلوية اليمنى
من مساحة عرض التطبيق يتغير سلوك زر التنقل بناءً على
بشأن ما إذا كان المستخدم في وجهة ذات مستوى أعلى.
وجهة المستوى الأعلى هي الجذر أو الوجهة ذات المستوى الأعلى في مجموعة من الوجهات ذات الصلة بالتسلسل الهرمي. لا تعرض وجهات المستوى الأعلى زرّ للأعلى في شريط التطبيق العلوي بسبب عدم توفّر وجهة بمستوى أعلى. من تكون وجهة البدء لتطبيقك هي وجهة المستوى الأعلى الوحيدة.
عندما يكون المستخدم في وجهة المستوى الأعلى، يصبح زر التنقل
رمز الدرج
في حال كانت الوجهة تستخدم
DrawerLayout
. إذا كانت الوجهة لا تستخدم
DrawerLayout
، زر التنقّل مخفيّ عندما يكون المستخدم في أي وجهة أخرى، يظهر زر التنقل كزر لأعلى
لتهيئة زر التنقل باستخدام وجهة البدء فقط مثل
وجهة من المستوى الأعلى، وإنشاء عنصر
AppBarConfiguration
، والتمرير في الرسم البياني للتنقل المناسب، كما هو موضح أدناه:
Kotlin
val appBarConfiguration = AppBarConfiguration(navController.graph)
Java
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
وفي بعض الحالات، قد يكون عليك تحديد عدّة وجهات ذات مستوى أعلى بدلاً من ذلك
من استخدام وجهة البدء الافتراضية. إنّ استخدام BottomNavigationView
هو
في حالات الاستخدام الشائعة لهذا النوع من الأجهزة، حيث قد تكون لديك شاشات تابعة غير
وترتبط ببعضها البعض بشكل هرمي وقد يكون لكل منها مجموعة خاصة بها من
المقصودة. في مثل هذه الحالات، يمكنك بدلاً من ذلك تمرير مجموعة من الوجهات
معرفات الدالة الإنشائية، كما هو موضح أدناه:
Kotlin
val appBarConfiguration = AppBarConfiguration(setOf(R.id.main, R.id.profile))
Java
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(R.id.main, R.id.profile).build();
إنشاء شريط أدوات
لإنشاء شريط أدوات باستخدام NavigationUI
، حدد أولاً الشريط في
النشاط، كما هو موضح:
<LinearLayout> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" /> <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" ... /> ... </LinearLayout>
بعد ذلك، يمكنك الاتصال بالرقم setupWithNavController()
.
من طريقة onCreate()
لنشاطك الرئيسي، كما هو موضّح في ما يلي
مثال:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main) ... val navController = findNavController(R.id.nav_host_fragment) val appBarConfiguration = AppBarConfiguration(navController.graph) findViewById<Toolbar>(R.id.toolbar) .setupWithNavController(navController, appBarConfiguration) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); ... NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); Toolbar toolbar = findViewById(R.id.toolbar); NavigationUI.setupWithNavController( toolbar, navController, appBarConfiguration); }
لتهيئة زر التنقل ليظهر كزر لأعلى للجميع
الوجهة، أدخِل مجموعة فارغة من معرّفات الوجهات للمستوى الأعلى.
الوجهة عند إنشاء AppBarConfiguration
. يمكن أن يكون هذا مفيدًا
على سبيل المثال، إذا كان لديك نشاط ثانٍ يجب أن يعرض الزر "أعلى"
في Toolbar
في جميع الوجهات يتيح هذا للمستخدم الرجوع إلى الصفحة السابقة
إلى النشاط الرئيسي عندما لا تكون هناك وجهات أخرى في الجهة الخلفية
حزمة. يمكنك استخدام
setFallbackOnNavigateUpListener()
للتحكم في السلوك الاحتياطي للوقت الذي قد يتم فيه استخدام navigateUp()
عدم اتخاذ أي إجراء، كما هو موضح في المثال التالي:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController val appBarConfiguration = AppBarConfiguration( topLevelDestinationIds = setOf(), fallbackOnNavigateUpListener = ::onSupportNavigateUp ) findViewById<Toolbar>(R.id.toolbar) .setupWithNavController(navController, appBarConfiguration) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { ... NavHostFragment navHostFragment = (NavHostFragment) supportFragmentManager.findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder() .setFallbackOnNavigateUpListener(::onSupportNavigateUp) .build(); Toolbar toolbar = findViewById(R.id.toolbar); NavigationUI.setupWithNavController( toolbar, navController, appBarConfiguration); }
تضمين شريط الأدوات القابل للطي
لتضمين CollapsingToolbarLayout
مع شريط الأدوات، حدد أولاً
شريط الأدوات والتنسيق المحيط في نشاطك، كما هو موضح أدناه:
<LinearLayout> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="@dimen/tall_toolbar_height"> <com.google.android.material.appbar.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar_layout" android:layout_width="match_parent" android:layout_height="match_parent" app:contentScrim="?attr/colorPrimary" app:expandedTitleGravity="top" app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin"/> </com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.AppBarLayout> <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" ... /> ... </LinearLayout>
بعد ذلك، يمكنك الاتصال بالرقم setupWithNavController()
.
من طريقة onCreate
الخاصة بنشاطك الرئيسي، كما هو موضّح أدناه:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main) ... val layout = findViewById<CollapsingToolbarLayout>(R.id.collapsing_toolbar_layout) val toolbar = findViewById<Toolbar>(R.id.toolbar) val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController val appBarConfiguration = AppBarConfiguration(navController.graph) layout.setupWithNavController(toolbar, navController, appBarConfiguration) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); ... CollapsingToolbarLayout layout = findViewById(R.id.collapsing_toolbar_layout); Toolbar toolbar = findViewById(R.id.toolbar); NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); NavigationUI.setupWithNavController(layout, toolbar, navController, appBarConfiguration); }
شريط الإجراءات
لإضافة دعم التنقل إلى شريط الإجراءات التلقائي، اتصل
setupActionBarWithNavController()
من طريقة onCreate()
الخاصة بنشاطك الرئيسي، كما هو موضّح أدناه. لاحظ أنه
تحتاج إلى الإفصاح عن AppBarConfiguration
خارج onCreate()
، لأنك
ويمكن استخدامها أيضًا عند تجاوز onSupportNavigateUp()
:
Kotlin
private lateinit var appBarConfiguration: AppBarConfiguration ... override fun onCreate(savedInstanceState: Bundle?) { ... val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController appBarConfiguration = AppBarConfiguration(navController.graph) setupActionBarWithNavController(navController, appBarConfiguration) }
Java
AppBarConfiguration appBarConfiguration; ... @Override protected void onCreate(Bundle savedInstanceState) { ... NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration); }
بعد ذلك، يمكنك إلغاء onSupportNavigateUp()
للتعامل مع التنقل لأعلى:
Kotlin
override fun onSupportNavigateUp(): Boolean { val navController = findNavController(R.id.nav_host_fragment) return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp() }
Java
@Override public boolean onSupportNavigateUp() { NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); return NavigationUI.navigateUp(navController, appBarConfiguration) || super.onSupportNavigateUp(); }
دعم تباينات شريط التطبيق
تعمل إضافة شريط التطبيق العلوي إلى نشاطك بشكل جيد عندما يكون تنسيق شريط التطبيق متشابهة لكل وجهة في تطبيقك. مع ذلك، إذا تغيّر شريط التطبيق العلوي عبر الوجهات، يمكنك إزالة شريط التطبيق العلوي من نشاطك وتحديده في كل جزء وجهة، بدلاً من ذلك.
على سبيل المثال، قد تستخدم إحدى وجهاتك علامة Toolbar
عادية، بينما
والأخرى تستخدم AppBarLayout
لإنشاء شريط تطبيق أكثر تعقيدًا يتضمن علامات تبويب،
كما هو موضح في الشكل 2.
![اثنين من أهم تباينات شريط التطبيق؛ شريط أدوات قياسي على اليسار
appbarlayout مع شريط الأدوات وعلامات التبويب على اليمين](https://developer.android.com/static/images/guide/navigation/app-bar-variations.png?authuser=19&hl=ar)
Toolbar
على اليمين، يوجد AppBarLayout
مع
Toolbar
وعلامات التبويبلتنفيذ هذا المثال ضمن أجزاء الوجهة باستخدام
NavigationUI
، عليك أولاً تحديد شريط التطبيق في كل تنسيق من تنسيقات الأجزاء،
بدءًا بجزء الوجهة الذي يستخدم شريط الأدوات القياسي:
<LinearLayout>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
... />
...
</LinearLayout>
بعد ذلك، حدِّد الجزء الوجهة الذي يستخدم شريط التطبيق الذي يتضمّن علامات تبويب:
<LinearLayout>
<com.google.android.material.appbar.AppBarLayout
... />
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
... />
<com.google.android.material.tabs.TabLayout
... />
</com.google.android.material.appbar.AppBarLayout>
...
</LinearLayout>
فإن منطق تهيئة التنقل هو ذاته لكلا الجزأين،
باستثناء أنه يجب عليك استدعاء
setupWithNavController()
من داخل طريقة onViewCreated()
لكل جزء، بدلاً من التهيئة
من النشاط:
Kotlin
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val navController = findNavController() val appBarConfiguration = AppBarConfiguration(navController.graph) view.findViewById<Toolbar>(R.id.toolbar) .setupWithNavController(navController, appBarConfiguration) }
Java
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { NavController navController = Navigation.findNavController(view); AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); Toolbar toolbar = view.findViewById(R.id.toolbar); NavigationUI.setupWithNavController( toolbar, navController, appBarConfiguration); }
ربط الوجهات بأصناف القائمة
توفّر NavigationUI
أيضًا أدوات مساعدة لربط الوجهات بواجهة المستخدم المستندة إلى القائمة.
والمكونات. يحتوي NavigationUI
على طريقة مساعدة،
onNavDestinationSelected()
,
الذي يأخذ MenuItem
مع
NavController
التي تستضيف
المرتبطة بها. إذا تطابق id
من MenuItem
مع id
الوجهة، يمكن لـ NavController
بعد ذلك الانتقال إلى تلك الوجهة.
على سبيل المثال، تحدِّد مقتطفات XML أدناه عنصرًا في قائمة ووجهة باستخدام
قيمة id
شائعة، details_page_fragment
:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" ... > ... <fragment android:id="@+id/details_page_fragment" android:label="@string/details" android:name="com.example.android.myapp.DetailsFragment" /> </navigation>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> ... <item android:id="@+id/details_page_fragment" android:icon="@drawable/ic_details" android:title="@string/details" /> </menu>
إذا تمت إضافة قائمتك عبر onCreateOptionsMenu()
في النشاط، على سبيل المثال،
يمكنك ربط عناصر القائمة بالوجهات من خلال إلغاء خيارات
onOptionsItemSelected()
للاتصال بـ onNavDestinationSelected()
، كما هو موضح في
في المثال التالي:
Kotlin
override fun onOptionsItemSelected(item: MenuItem): Boolean { val navController = findNavController(R.id.nav_host_fragment) return item.onNavDestinationSelected(navController) || super.onOptionsItemSelected(item) }
Java
@Override public boolean onOptionsItemSelected(MenuItem item) { NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); return NavigationUI.onNavDestinationSelected(item, navController) || super.onOptionsItemSelected(item); }
والآن، عندما ينقر أحد المستخدمين على عنصر القائمة details_page_fragment
، يبرز التطبيق
الانتقال تلقائيًا إلى الوجهة المقابلة باستخدام id
نفسه.
إضافة لائحة تنقُّل
لائحة التنقّل هي لوحة واجهة مستخدم تعرض قائمة التنقّل الرئيسية لتطبيقك.
يظهر الدرج عندما يلمس المستخدم رمز الدرج
في شريط التطبيقات أو عندما يمرر المستخدم إصبعًا من الحافة اليمنى
الشاشة.
![درج مفتوح يعرض قائمة تنقُّل](https://developer.android.com/static/images/topic/libraries/architecture/navigation-drawer.png?authuser=19&hl=ar)
يظهر رمز الدرج على جميع
وجهات المستوى الأعلى التي تستخدم DrawerLayout
.
لإضافة لائحة تنقُّل، عليك أولاً الإفصاح عن
DrawerLayout
كجذر
مشاهدة. داخل DrawerLayout
، أضِف تنسيقًا لمحتوى واجهة المستخدم الرئيسية
طريقة عرض أخرى تحتوي على محتوى لائحة التنقل.
على سبيل المثال، يستخدم التنسيق التالي DrawerLayout
مع طريقتَي عرض فرعيتَين:
NavHostFragment
إلى
تحتوي على المحتوى الرئيسي
NavigationView
حول محتويات لائحة التنقل.
<?xml version="1.0" encoding="utf-8"?>
<!-- Use DrawerLayout as root container for activity -->
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<!-- Layout to contain contents of main body of screen (drawer will slide over this) -->
<androidx.fragment.app.FragmentContainerView
android:name="androidx.navigation.fragment.NavHostFragment"
android:id="@+id/nav_host_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
<!-- Container for contents of drawer - use NavigationView to make configuration easier -->
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true" />
</androidx.drawerlayout.widget.DrawerLayout>
بعد ذلك، عليك ربط DrawerLayout
إلى الرسم البياني للتنقل من خلال تمريره إلى AppBarConfiguration
، كما هو موضح في
في المثال التالي:
Kotlin
val appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
Java
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()) .setDrawerLayout(drawerLayout) .build();
بعد ذلك، في صف النشاط الرئيسي، اتصل
setupWithNavController()
من طريقة onCreate()
الخاصة بنشاطك الرئيسي، كما هو موضّح أدناه:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main) ... val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController findViewById<NavigationView>(R.id.nav_view) .setupWithNavController(navController) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); ... NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); NavigationView navView = findViewById(R.id.nav_view); NavigationUI.setupWithNavController(navView, navController); }
ستبدأ بعد
التنقل 2.4.0-alpha01،
كما يتم حفظ حالة كل عنصر من عناصر القائمة واستعادتها عند استخدام
setupWithNavController
شريط التنقّل السفلي
يمكن لـ "NavigationUI
" أيضًا التعامل مع شريط التنقّل السفلي. عندما يختار المستخدم قائمة
العنصر، NavController
onNavDestinationSelected()
وتحدث تلقائيًا العنصر المحدد في شريط التنقل السفلي.
![شريط التنقّل السفلي](https://developer.android.com/static/topic/libraries/architecture/images/bottom-navigation.png?authuser=19&hl=ar)
لإنشاء شريط تنقّل سفلي في تطبيقك، حدِّد أولاً الشريط في تطبيقك النشاط، كما هو موضح أدناه:
<LinearLayout> ... <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" ... /> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottom_nav" app:menu="@menu/menu_bottom_nav" /> </LinearLayout>
بعد ذلك، في صف النشاط الرئيسي، اتصل
setupWithNavController()
من طريقة onCreate()
الخاصة بنشاطك الرئيسي، كما هو موضّح أدناه:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main) ... val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController findViewById<BottomNavigationView>(R.id.bottom_nav) .setupWithNavController(navController) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); ... NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); BottomNavigationView bottomNav = findViewById(R.id.bottom_nav); NavigationUI.setupWithNavController(bottomNav, navController); }
ستبدأ بعد
التنقل 2.4.0-alpha01،
كما يتم حفظ حالة كل عنصر من عناصر القائمة واستعادتها عند استخدام
setupWithNavController
للحصول على مثال شامل يتضمن التنقل السفلي، راجع نموذج التنقّل المتقدّم في مكونات بنية Android على GitHub.
الاستماع إلى أحداث التنقّل
التفاعل مع NavController
هو الوسيلة الأساسية للتنقل بين الوجهات. NavController
مسؤول عن استبدال محتوى NavHost
مع الوجهة الجديدة. في كثير من الحالات، لا يمكن لعناصر واجهة المستخدم — مثل شريط التطبيق العلوي أو
عناصر تحكُّم دائمة أخرى في التنقّل، مثل BottomNavigationBar
، يتم نشرها خارج
من NavHost
ويجب تعديلها أثناء تنقّلك بين الوجهات.
يوفّر NavController
واجهة OnDestinationChangedListener
يتم الاتصال عند الوجهة الحالية لـ NavController
أو تتغير وسيطاتها. يمكن تسجيل مستمع جديد من خلال
addOnDestinationChangedListener()
. عند الاتصال بـ addOnDestinationChangedListener()
، إذا كانت
الوجهة الحالية، فيتم إرسالها على الفور إلى مستمعك.
يستخدم NavigationUI
OnDestinationChangedListener
لإنشاء واجهة المستخدم المشتركة هذه.
والمكونات التنقلية. ومع ذلك، لاحظ أنه يمكنكم أيضًا استخدام
OnDestinationChangedListener
بمفرده لإنشاء أي واجهة مستخدم مخصّصة أو نشاط تجاري
منطقيًا بأحداث التنقل.
على سبيل المثال، قد يكون لديك عناصر شائعة في واجهة المستخدم تنوي عرضها فيها
بعض أقسام التطبيق مع إخفائها في مناطق أخرى استخدام نماذجك الخاصة
OnDestinationChangedListener
، يمكنك إظهار أو إخفاء واجهة المستخدم هذه بشكل انتقائي
العناصر بناءً على الوجهة المستهدفة، كما هو موضح في المثال التالي:
Kotlin
navController.addOnDestinationChangedListener { _, destination, _ -> if(destination.id == R.id.full_screen_destination) { toolbar.visibility = View.GONE bottomNavigationView.visibility = View.GONE } else { toolbar.visibility = View.VISIBLE bottomNavigationView.visibility = View.VISIBLE } }
Java
navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() { @Override public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) { if(destination.getId() == R.id.full_screen_destination) { toolbar.setVisibility(View.GONE); bottomNavigationView.setVisibility(View.GONE); } else { toolbar.setVisibility(View.VISIBLE); bottomNavigationView.setVisibility(View.VISIBLE); } } });
أدوات معالجة الأحداث التي تستند إلى الوسيطات
ويمكنك بدلاً من ذلك استخدام الوسيطات ذات القيم التلقائية داخل
الرسم البياني للتنقل، والذي يمكن استخدامه بواسطة وحدة التحكم المناسبة في واجهة المستخدم
لتحديث حالته. على سبيل المثال، بدلاً من جعل المنطق في
OnDestinationChangedListener
على رقم تعريف الوجهة وفقًا لما سبق
يمكننا إنشاء وسيطة في NavGraph
على سبيل المثال:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation\_graph" app:startDestination="@id/fragmentOne"> <fragment android:id="@+id/fragmentOne" android:name="com.example.android.navigation.FragmentOne" android:label="FragmentOne"> <action android:id="@+id/action\_fragmentOne\_to\_fragmentTwo" app:destination="@id/fragmentTwo" /> </fragment> <fragment android:id="@+id/fragmentTwo" android:name="com.example.android.navigation.FragmentTwo" android:label="FragmentTwo"> <argument android:name="ShowAppBar" android:defaultValue="true" /> </fragment> </navigation>
لا يتم استخدام هذه الوسيطة عندما
الانتقال إلى الوجهة،
كطريقة لإرفاق معلومات إضافية بالوجهة باستخدام
defaultValue
. في هذه الحالة، تشير القيمة إلى ما إذا كان شريط التطبيق
عند التواجد في هذه الوجهة.
يمكننا الآن إضافة OnDestinationChangedListener
في Activity
:
Kotlin
navController.addOnDestinationChangedListener { _, _, arguments -> appBar.isVisible = arguments?.getBoolean("ShowAppBar", false) == true }
Java
navController.addOnDestinationChangedListener( new NavController.OnDestinationChangedListener() { @Override public void onDestinationChanged( @NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments ) { boolean showAppBar = false; if (arguments != null) { showAppBar = arguments.getBoolean("ShowAppBar", false); } if(showAppBar) { appBar.setVisibility(View.VISIBLE); } else { appBar.setVisibility(View.GONE); } } } );
NavController
استدعاء رد الاتصال هذا كلما تغيرت وجهة التنقل. تشير رسالة الأشكال البيانية
يمكن لتطبيق Activity
الآن تعديل حالة مكونات واجهة المستخدم أو إذن الوصول إليها
يمتلكها بناءً على الوسيطات التي تم استلامها في رد الاتصال.
تتمثل إحدى ميزات هذا المنهج في أنّ Activity
لا يرى سوى
الوسيطات في الرسم البياني للتنقل ولا يتعرّف على Fragment
الفردية
الأدوار والمسئوليات. وبالمثل، لا تعرف الأجزاء الفردية
حول عنصر Activity
المتضمن ومكونات واجهة المستخدم التي تمتلكها.
مصادر إضافية
لمعرفة المزيد من المعلومات حول التنقّل، يُرجى الاطّلاع على المراجع الإضافية التالية.
نماذج
الدروس التطبيقية حول الترميز
مشاركات المدونة
الفيديوهات
- أفضل 10 ممارسات للانتقال إلى نشاط واحد
- نشاط واحد: السبب والموعد والطريقة (مؤتمر Android Dev Summit 2018)
- Android Jetpack: إدارة التنقّل في واجهة المستخدم باستخدام وحدة التحكّم في التنقّل (Google I/O '18)