您好,登錄后才能下訂單哦!
這篇文章主要介紹了JetPack怎么使用Activity中的導航菜單的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇JetPack怎么使用Activity中的導航菜單文章都會有所收獲,下面我們一起來看看吧。
提前做好準備,打開文件 res/navigation/
下你的 xml
文件,點擊每一個 Fragment
頁面,給它們設置對應的標題,在 Design
下的右邊的 id
下,有一個屬性是 label
,填寫上對應的名稱就可。
Activity
中的導航菜單默認 Activity
的導航菜單顯示的是標題和返回按鈕,而返回按鈕是返回到上一個 Activity
,而我們的 Navigation
是在一個 Activity
中的,假如當前 Activity
位于棧的最上層,我學習的代碼就是讓所有的 Fragment
都在 MainActivity
中,由于無論我怎樣跳轉都在 MainActivity
中。所以現在有兩個兩個任務:
首先跳轉到下一頁以后會出現返回按鈕;
點擊返回按鈕能夠正常返回上一個 Navigation
頁面。
因為第二個需要在第一個完成的基礎上才能看得出效果,所以我們按上面的步驟進行。
本來的效果:
默認效果
打開承載了 Fragment
的 Activity
的 java
文件,我這里是 MainActivity.java
,在 onCreate
方法下增加如下代碼:
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);}
android 官方獲取 navController
是直接獲取的 Navigation.findNavController(this, R.id.nav_host_fragment);
,假如很不幸你也這樣寫了,那么就會出現的錯誤:
Caused by: java.lang.IllegalStateException: Activity com.example.learnjetpack.MainActivity@b516fb8 does not have a NavController set on 2131230962
只需修改成我上面那樣即可以處理這個問題,至于起因我現在解釋不了,以后會補全。上面的代碼就是托管本來 Activity
的 Bar
。
Navigation托管Activity后的效果
這樣第一個完成了,至于第二個,只要要重寫本來 Activity
的返回的邏輯:
@Overridepublic boolean onSupportNavigateUp() { NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); return NavigationUI.navigateUp(navController, appBarConfiguration) || super.onSupportNavigateUp();}
接下來看看最終的效果。
最終的效果
我還遇到了一個問題,之前我的 MainActivity
的 theme
設置 android:theme="@style/Theme.AppCompat.Light.NoActionBar"
,結果出現了下面的錯誤:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)' on a null object reference
把這個改掉就可,由于設置 NoActionBar
了,結果又讓顯示,誠然手機就會耍小脾氣。這個是在 AndroidManifest.xml
中設置的。
這種方式就是不用默認的,而是自己設置;所以這個很容易想到需要將 MainActivity
的 theme
改為上面會出現錯誤的情況。打開 AndroidManifest.xml
文件,修改對應的 Activity
的 theme
,修改成 @style/Theme.AppCompat.Light.NoActionBar
。
沒有bar的效果
打開對應的 Activity
下的布局文件,我這里是 MainActivity
,布局文件為 activity_layout.xml
,在 androidx.fragment.app.FragmentContainerView
上增加:
<androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="0dp" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:layout_constraintBottom_toTopOf="@+id/nav_host_fragment" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
先看看效果:
自己設置頭部的效果
接下來讓其顯示內容。
同樣在 Activity
中的增加:
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); NavController navController = navHostFragment.getNavController(); AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build(); Toolbar toolbar = findViewById(R.id.toolbar); NavigationUI.setupWithNavController( toolbar, navController, appBarConfiguration);}
這種方式 Navigation
會自動托管 Toolbar
,這樣即可以輕松實現上面的效果,其余的代碼就不需要,看效果:
使用 Toolbar 最終的效果
關于“JetPack怎么使用Activity中的導航菜單”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“JetPack怎么使用Activity中的導航菜單”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。