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

7

我可能会错过一些非常简单的东西,但我确实需要一些帮助。

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

我已经查看了示例,以找到类似的内容,但它们所有都使用新的活动来填充其内容,或者仅隐藏/显示不适用于我的情况的工具栏内容,因为我对于每个片段都有自定义工具栏视图,因此我无法找出布局视图的顺序。我浏览过的一些解决方案如下:

  1. 导航视图中仅为一个片段提供可折叠工具栏

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

  3. 可折叠的工具栏和抽屉布局

TL;DR

对于一个片段,我想要以下工具栏:

enter image description here

而对于其他片段

enter image description here


如果您想要单个活动并替换其中的整个内容,包括工具栏,在每个片段中,您可以在片段内设置自己的工具栏(而不是在活动中)。当您在每个片段中点击菜单图标(左上角)时,只需调用活动的显示导航菜单即可。 - RoShan Shan
我想要一个抽屉的实例,通过单个活动访问,在MainActivity中没有工具栏,我们将无法显示抽屉图标。 - Dipali Shah
是的,在你的MainActivity中设置了菜单抽屉。为每个片段设置工具栏(每个片段仍带有抽屉图标),当单击抽屉图标时,只需从MainActivity调用show navigation drawer即可。 - RoShan Shan
你能给我展示任何样例或解决方案的链接吗?我完全不明白你在说什么。 - Dipali Shah
1个回答

1

编辑:

这不是一份干净的代码,但它是可工作的。我只是想向您展示。您可以使用类似BaseFragment的东西来构建更好的代码结构。在MainFragment中,您可以使用导航抽屉,在DetailFragment中,您可以在工具栏上使用返回箭头。如果您想要,您还可以在DetailFragment中使用导航视图。此外,您可以在任何您喜欢的片段中使用可折叠工具栏。

MainActivity

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)
        }

    }


}

MainFragment

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)
    }


}

DetailFragment(详细信息片段)
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)

    }

}

主活动布局

<?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>

主碎片布局

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

细节片段布局
<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>

上一个答案:
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
    }

你可以查看这段代码。我在每个片段中将工具栏设置为操作栏,并让它们自己填充菜单并与活动的抽屉状态同步。如果有帮助,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接