Где добавить панель инструментов и панель навигации - PullRequest
0 голосов
/ 23 октября 2018

Я использую контроллер навигации Android.

Мое основное занятие содержит фрагмент навигации, но куда должны идти другие компоненты, такие как панели инструментов и нижняя панель навигации, в основном упражнении или дочерних фрагментах?

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

     <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_collapseMode="pin"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

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

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/bottom_nav_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:menu="@menu/menu_bottom_nav" />

</LinearLayout>

frag_home.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerList"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical" />
</RelativeLayout>

, или ToolBar и BottomNavigationView должны быть в фрагменте_home.xml, например,

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

     <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_collapseMode="pin"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerList"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical" />

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/bottom_nav_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:menu="@menu/menu_bottom_nav" />
</RelativeLayout>

1 Ответ

0 голосов
/ 23 октября 2018

Я приведу вам пример.Имейте в виду, я собираю последнюю версию androidx для SDK 28+, поэтому если вы старше, ваши пространства имен будут немного отличаться.

Я также использую Databinding и Kotlin, поэтому не используйтемакет и теги данных, если вы не используете привязку данных.

TOOLBAR

<layout 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">

<data>
     PUT BINDING VARIABLES HERE
</data>

<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/SSTheme.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?android:attr/actionBarSize"
            android:theme="@style/ToolbarTextAppearance">

        </androidx.appcompat.widget.Toolbar>

    </com.google.android.material.appbar.AppBarLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ

   <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable name="activity" type="com.a35.activities.MainActivity"/>
        <variable name="iBindingRecyclerView" type="com.a35.interfaces.IBindingRecyclerView"/>
    </data>

    <androidx.drawerlayout.widget.DrawerLayout
        android:id="@+id/drawerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="false"
        tools:openDrawer="start">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <!--TOP TOOLBAR-->
            <include
                android:id="@+id/toolbarMain"
                layout="@layout/toolbar_main"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

            <!--TOP BLACK LINE-->
            <View
                android:id="@+id/vRedLine"
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_2"
                android:background="@color/black" />

            <!-- FrameLayout is used to insert fragments to display -->
            <FrameLayout
                android:id="@+id/fragPlaceholder"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />

        </LinearLayout>

        <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"
            android:background="@color/colorPrimary">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <include layout="@layout/nav_drawer_header"
                         android:id="@+id/navHeader"/>

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/lstMenuItems"
                    android:layout_below="@+id/navHeader"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:bindRcvInterface="@{iBindingRecyclerView}"
                    app:bindRcvList="@{activity.getDrawerItemList}"/>

                <ImageView
                    android:id="@+id/imgBottomLogo"
                    android:layout_width="@dimen/dp_160"
                    android:layout_height="@dimen/dp_35"
                    android:layout_alignParentBottom="true"
                    android:layout_centerHorizontal="true"
                    android:layout_marginBottom="@dimen/dp_35"
                    android:src="@drawable/scott_logo" />

            </RelativeLayout>

        </com.google.android.material.navigation.NavigationView>

    </androidx.drawerlayout.widget.DrawerLayout>

</layout>

Обратите внимание, что основное действие удерживаетсяНавигационное представление, которое находится внутри макета ящика, которое содержит представление Recycler для создания содержимого вашего ящика.

Помимо этого вы увидите заполнитель содержимого для фрагментов с именем fragPlaceHolder.

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

Следующие ваши стилиВам нужно будет использовать стиль, который не зависит от панели действий, если вы планируете использовать панель инструментов в качестве панели действий.(для записи, вы должны использовать панель инструментов)

STYLE

   <!--Full Screen-->
<style name="A35.FullScreen">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
</style>

MANIFEST

  <application
    android:name=".application.A35Application"
    android:allowBackup="true"
    android:icon="@mipmap/a35_logo"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/A35.FullScreen">

Вы также можете поставить его на отдельные виды деятельности, если это соответствует вашемунужно лучше.

Теперь у вас осталось два шага.

Вам нужно вызвать setActionToolbar и передать найденный пользовательский интерфейс или использовать синтетические представления, если вы используете kotlin и привязку данных, которые просто сделать.Поэтому добавьте в свой onCreate ПОСЛЕ раздувания вид.

setSupportActionBar(toolbar)

Вы не спрашивали об этом, но я также предоставлю его.Когда вам нужно изменить свой фрагмент, у меня обычно есть BaseActivity с вспомогательным методом, который делает это так.

 protected fun swapFragment(fragment: BaseFragment, @Nullable bundle: Bundle?, hideCurrentFrag: Boolean = false) {
    if (fragment.isVisible) {
        A35Log.e(mClassTag, "swapFragment called on already visible fragment")
        return
    }

    A35Log.v(mClassTag, "swapFragment( ${fragment.javaClass.simpleName} )")
    val currentFragBundle = fragment.arguments
    if (currentFragBundle == null && bundle != null) {
        fragment.arguments = bundle
        A35Log.v(mClassTag, "current bundle is null, so setting new bundle passed in")
    } else if (bundle != null) {
        fragment.arguments?.putAll(bundle)
        A35Log.v(mClassTag, "current fragment bundle was not null, so add new bundle to it")
    }

    val fragmentManager = supportFragmentManager
    fragmentManager.executePendingTransactions()
    val fragmentTransaction = fragmentManager.beginTransaction()

    //Make sure the requested fragment isn't already on the screen before adding it
    if (fragment.isAdded) {
        A35Log.v(mClassTag, "Fragment is already added")
        if (fragment.isHidden) {
            A35Log.v(mClassTag, "Fragment is hidden, so show it")
            fragmentTransaction.show(fragment)
            if(hideCurrentFrag) {
                A35Log.v(mClassTag, "hideCurrentFlag = true, hiding current fragment $mSelectedFragment")
                fragmentTransaction.hide(mSelectedFragment!!)
            }else{
                A35Log.v(mClassTag, "hideCurrentFlag = false, removing current fragment $mSelectedFragment")
                fragmentTransaction.remove(mSelectedFragment!!)
            }
        }else{
            A35Log.v(mClassTag, "Fragment is already visible")
        }
    }else if(mSelectedFragment == null){
        A35Log.v(mClassTag,"mSelectedFragment = null, so replacing active fragment with new one ${fragment.javaClass.simpleName}")
        fragmentTransaction.replace(R.id.fragPlaceholder, fragment)
    }else{
        A35Log.v(mClassTag, "Fragment is not added, so adding to the screen ${fragment.javaClass.simpleName}")
        fragmentTransaction.add(R.id.fragPlaceholder, fragment)
        if(hideCurrentFrag) {
            A35Log.v(mClassTag, "hideCurrentFlag = true, hiding current fragment $mSelectedFragment")
            fragmentTransaction.hide(mSelectedFragment!!)
        }else{
            A35Log.v(mClassTag, "hideCurrentFlag = false, removing current fragment $mSelectedFragment")
            fragmentTransaction.remove(mSelectedFragment!!)
        }
    }

    A35Log.v(mClassTag, "committing swap fragment transaction")
    fragmentTransaction.commit()
    A35Log.v(mClassTag, "mSelectedFragment = ${fragment.javaClass.simpleName}")
    mSelectedFragment = fragment
}

ПРИМЕЧАНИЕ * Хотя обмен фрагментами довольно универсален, вам нужно убедиться, что вы обрабатываетеваши потребности правильно.Должно ли это быть скрытие или удаление.Должен ли он обрабатывать пачки или игнорировать их.Метод, который я вам предоставил, в основном показывает, существует ли несуществующий и скрывающий фрагмент вместо удаления, если сказано скрыть его.

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

Счастливое кодирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...