効果
構造解析ページ
これは、比較的一般的なAPPの住宅建設、家+サイドバーで、サイドバーは、メニューの一番下で、メニューの一部、ホームコントロールコンテンツ領域です、コンテンツ領域がスライド可能サブページです。合理的な全体的に、より快適に、各配列が、一緒にリンクされ、それに加えて、公共のお気に入りであることが可能Material Design
なスタイルなので、APPの家の現在の主流の構造になります。
図は、より効果的にすることができた構造を明確に、シンプルなマインドマップが複雑ではないんです。
ページレイアウト
1.ホーム
全体の大きなコンテナいます。
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
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:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".module.MainActivity"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<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"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
</androidx.drawerlayout.widget.DrawerLayout>
DrawerLayout
包まれたinclude
ホームページとサイドバーコンテンツNavigationView
。app_bar_main
ホームページの内容は、参照を使用すると、混乱を避けるために、明確な構造を含みます。- サイドバーには、
NavigationView
ヘッドのレイアウトに分けheaderLayout
て、メニューmenu
、レイアウトメニューであることに注意してください。 - 、他のノート
NavigationView
位置があるべき主内容app_bar_main
同じレベルで、及びメインコンテンツ後。 - DrawerLayoutの大きい使用は見ることができます。DrawerLayoutの用途は詳しく説明します。
2.ホーム
ホームは、ホームページのサイドバー以外の言うことをここにあります。
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
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=".module.MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_main"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginRight="@dimen/dp_20"
android:layout_marginEnd="@dimen/dp_20"
android:layout_marginBottom="@dimen/dp_70"
app:srcCompat="@android:drawable/ic_dialog_email"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
上記の真ん中がコンテンツ領域で、タイトルで、FloatingActionButtonは無視することができます。
3.ホームページコンテンツエリア
2と同様の効果
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".module.MainActivity"
tools:showIn="@layout/app_bar_main">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toTopOf="@+id/viewPager"
app:menu="@menu/bottom_navigation" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
- 上記で
ViewPager
、摺動可能なコンテンツ領域の充填Fragment
サブページ。 - 以下は、
BottomNavigationView
上記ViewPagerに関連付けられたメニューの下、。
紹介のページレイアウトのこの部分は、以下のコードセクションを開始しました。
コードセクション
1.サイドバー
我々はする必要がありtoolbar
ますが、ポップアップサイドバーの許可をクリックすることができ、サイドバーを関連付けるためのボタンを追加します。
/**
* Drawer关联Toolbar
*/
private fun initActionBarDrawer() {
val toggle = ActionBarDrawerToggle(
this,
drawer_layout,
toolbar,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close
)
drawer_layout.addDrawerListener(toggle)
toggle.syncState()
}
2.コンテンツエリア
サイドバーに関連付けられている、我々はコンテンツ領域を見て、それはコードを見ては、達成するために、サブページフラグメントViewPagerが含まれているコンテンツ領域の上に述べました
/**
* 初始化Fragment
*/
private fun initFragments() {
val viewPagerAdapter = CommonViewPagerAdapter(supportFragmentManager)
viewPagerAdapter.addFragment(HomeFragment())
viewPagerAdapter.addFragment(TreeFragment())
viewPagerAdapter.addFragment(NaviFragment())
viewPagerAdapter.addFragment(ProjectFragment())
view_pager.offscreenPageLimit = 1
view_pager.adapter = viewPagerAdapter
}
イベントの処理
1.サイドバーのクリックイベント
/**
* 侧边栏点击事件
*/
nav_view.setNavigationItemSelectedListener {
// Handle navigation view item clicks here.
when (it.itemId) {
R.id.nav_collect -> {
ToastUtilKt.showToast("收藏")
}
R.id.nav_share -> {
ToastUtilKt.showToast("分享")
}
R.id.nav_about -> {
ToastUtilKt.showToast("关于")
}
R.id.nav_logout -> {
ToastUtilKt.showToast("退出")
}
}
//关闭侧边栏
drawer_layout.closeDrawer(GravityCompat.START)
true
}
するためによるとitemId
トリガイベントを決定し、サイドバーを閉じて、このステップはオプションですが、あなたはサイドバーをオフにすることはできません開いたままになります。
2.view_pagerスライディングモニター
/**
* view_pager 滑动监听
*/
view_pager.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
}
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
bottom_navigation.menu.getItem(position).isChecked = true
//设置checked为true,但是不能触发ItemSelected事件,所以滑动时也要设置一下标题
when (position) {
0 -> {
toolbar.title = resources.getString(R.string.app_name)
}
1 -> {
toolbar.title = resources.getString(R.string.title_tree)
}
2 -> {
toolbar.title = resources.getString(R.string.title_navi)
}
else -> {
toolbar.title = resources.getString(R.string.title_project)
}
}
}
})
view_pager
新しいタイトルを選択して設定するメニューの対応一番下をスライドした後。
メニューをクリックしてイベントの3.bottom_navigation底
/**
* bottom_navigation 点击事件
*/
bottom_navigation.setOnNavigationItemSelectedListener {
when (it.itemId) {
R.id.navigation_home -> {
view_pager.currentItem = 0
return@setOnNavigationItemSelectedListener true
}
R.id.navigation_tree -> {
view_pager.currentItem = 1
return@setOnNavigationItemSelectedListener true
}
R.id.navigation_navi -> {
view_pager.currentItem = 2
return@setOnNavigationItemSelectedListener true
}
R.id.navigation_project -> {
view_pager.currentItem = 3
return@setOnNavigationItemSelectedListener true
}
}
false
}
第二段階が実際に相互されると、彼らはまた、応答view_pagerスライドの位置を許可し、メニューの一番下をクリックしてください。
この全体のセットアップがコントロールを初期化し、その後、イベントを処理するために、ページレイアウトから、完了し、全体的なアイデアは、明確に迅速に構築、小さな機能の詳細、その後、完璧なサウンド[OK]をデバッグする必要があります。
完全なコード
https://github.com/yechaoa/wanandroid_kotlin
書き込みは容易ではない、賞賛の聖歌を指すように便利です^ _ ^