使用不同片段中的折叠工具栏替换工具栏

Dip*_* s. 6 android android-toolbar android-collapsingtoolbarlayout

我可能会在这里遗漏一些非常简单的东西,但我绝对可以使用一些帮助.

我有一个活动,我想在其中加载具有不同内容和不同工具栏样式的不同片段(即具有自定义View和CollapsingToolbarLayout的工具栏(其中也包含自定义布局)).同时,我希望有一个抽屉实例,可通过单个活动(即MainActivity)访问.

我已经通过示例找到类似的东西,但所有这些都使用新的活动来填充他们的内容,或者他们只是隐藏/显示在我的情况下不合适的工具栏内容,因为我为每个片段定制了工具栏视图,因此我无法找出布局视图的顺序.我经历过的一些解决方案是:

  1. 折叠工具栏仅适用于导航视图中的一个片段

  2. 在片段或活动中使用工具栏的协调器布局

  3. 折叠工具栏和DrawerLayout

TL; DR

对于一个片段我想要工具栏如下

在此输入图像描述

而对于其他片段

在此输入图像描述

tof*_*for 1

编辑:

这不是一个干净的代码,但它是一个有效的代码。我只是想给你看。您可以使用 BaseFragment 之类的东西并构建更好的代码。在 MainFragment 中,您可以使用导航抽屉,在 DetailFragment 中,您可以使用工具栏上的后退箭头。如果您愿意,也可以在 DetailFragment 中使用导航视图。您还可以在您喜欢的任何片段中使用折叠工具栏。

主要活动

class MainActivity : AppCompatActivity() {

    private var actionBarToggle : ActionBarDrawerToggle? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setUpNavigationList()
        if (savedInstanceState == null){
            supportFragmentManager
                    .beginTransaction()
                    .replace(R.id.frame_container, MainFragment())
                    .addToBackStack(null)
                    .commit()
        }
    }

    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        when(item!!.itemId){
            android.R.id.home -> onBackPressed()
        }
        return true
    }

    fun setActionBarDrawerToggle(toolbar: Toolbar){
        actionBarToggle = ActionBarDrawerToggle(this, drawer_layout, toolbar, R.string.drawer_open, R.string.drawer_close)
        actionBarToggle?.syncState()
        drawer_layout.closeDrawer(Gravity.START)
    }

    fun lockDrawer(lock: Boolean){
        val lockMode = if (lock) DrawerLayout.LOCK_MODE_LOCKED_CLOSED else DrawerLayout.LOCK_MODE_UNLOCKED
        drawer_layout.setDrawerLockMode(lockMode)
        actionBarToggle?.isDrawerIndicatorEnabled = lock
    }

    private fun setUpNavigationList(){
        val items = arrayListOf("Detail Fragment")
        val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items)
        list_navigation.adapter = adapter
        list_navigation.setOnItemClickListener { parent, view, position, id ->
            when (position){
                0 -> {
                    supportFragmentManager
                            .beginTransaction()
                            .replace(R.id.frame_container, DetailFragment())
                            .addToBackStack(null)
                            .commit()
                }
            }
            drawer_layout.closeDrawer(Gravity.START)
        }

    }


}
Run Code Online (Sandbox Code Playgroud)

主片段

class MainFragment() : Fragment() {


    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater!!.inflate(R.layout.fragment_main, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        (activity as AppCompatActivity).setSupportActionBar(toolbar_detail)
        (activity as MainActivity).lockDrawer(false)
        (activity as MainActivity).setActionBarDrawerToggle(toolbar_main)
    }


}
Run Code Online (Sandbox Code Playgroud)

细节片段

class DetailFragment() : Fragment() {


    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater!!.inflate(R.layout.fragment_detail, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        (activity as MainActivity).setSupportActionBar(toolbar_detail)
        (activity as MainActivity).lockDrawer(true)
        (activity as MainActivity).supportActionBar!!.setDisplayHomeAsUpEnabled(true)

    }

}
Run Code Online (Sandbox Code Playgroud)

主要活动布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.coskun.drawer.MainActivity">

    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ListView
        android:id="@+id/list_navigation"
        android:layout_width="150dp"
        android:layout_height="match_parent"
        android:background="@color/colorPrimary"
        android:layout_gravity="start"/>

</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

主片段布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.coskun.drawer.DetailFragment">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar_main"
        android:layout_width="match_parent"
        android:layout_height="?actionBarSize"
        android:background="@color/colorPrimary"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/main_fragment"/>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

细节片段布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.coskun.drawer.DetailFragment">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar_detail"
        android:layout_width="match_parent"
        android:layout_height="?actionBarSize"
        android:background="@color/colorAccent"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/detail_fragment"/>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

以前的答案:

You can define navigation drawer logic in activity and you can use separate toolbars for each fragment. You just need to sync state navigation drawer state with fragment toolbars. 

    fun setActionBarDrawerToggle(toolbar: Toolbar){
            actionBarToggle = ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close)
            actionBarToggle?.syncState()
            drawerLayout.closeDrawer(Gravity.START)
        }

    fun lockDrawer(lock: Boolean){
        val lockMode = if (lock) DrawerLayout.LOCK_MODE_LOCKED_CLOSED else DrawerLayout.LOCK_MODE_UNLOCKED
        drawerLayout.setDrawerLockMode(lockMode)
        actionBarToggle?.isDrawerIndicatorEnabled = lock
    }
Run Code Online (Sandbox Code Playgroud)

你可以看一下这段代码。我将工具栏设置为每个片段中的操作栏,并让它们扩展自己的菜单并与活动抽屉状态同步。让我知道这是否有帮助。