【问题标题】:Back arrow is not converting to hamburger icon后退箭头未转换为汉堡图标
【发布时间】:2018-09-05 04:01:14
【问题描述】:

我正在使用带有Kotlin 的Android Studio 3.1.4。我创建了一个选择NavigationDrawer 模板的新项目。我在Mainactivity 中添加了两个片段MainFragmentSecondFragment。当activity 启动时,会显示MainFragment,然后我通过单击NavigationDrawer 中的Camera item 调用SecondFragment。当我按下后退按钮时,它转到 MainFragment 但 ActionBar 仍然显示后退箭头而不是汉堡包。 之前我和android.support.v4.widget.DrawerLayout 合作过一个项目,一切正常。

下面是我的MainActiviy代码:

import android.os.Bundle
import android.support.design.widget.NavigationView
import android.support.v4.view.GravityCompat
import android.support.v7.app.ActionBarDrawerToggle
import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.app_bar_main.*


class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        showMainFragment()

        val toggle = ActionBarDrawerToggle(this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
        drawer_layout.addDrawerListener(toggle)
        toggle.syncState()
        nav_view.setNavigationItemSelectedListener(this)
    }


    override fun onBackPressed() {
        if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
            drawer_layout.closeDrawer(GravityCompat.START)
        } else if (supportFragmentManager.backStackEntryCount > 0) {
            supportFragmentManager.popBackStack()
        } else {
            super.onBackPressed()
        }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {

    val itemId = item.itemId
        if (itemId == android.R.id.home) {
            onBackPressed()
        }

        when (item.itemId) {
            R.id.action_settings -> return true
            else -> return super.onOptionsItemSelected(item)
        }
    }

    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        // Handle navigation view item clicks here.
        when (item.itemId) {
            R.id.nav_camera -> {
                // Handle the camera action
                val fragment = SecondFragment()
                val fragmentTransaction = supportFragmentManager.beginTransaction()
                fragmentTransaction.replace(R.id.fragment_container, fragment, "OK")
                fragmentTransaction.addToBackStack(null)
                fragmentTransaction.commit()
            }
            R.id.nav_gallery -> {

            }
            R.id.nav_slideshow -> {

            }
            R.id.nav_manage -> {

            }
            R.id.nav_share -> {

            }
            R.id.nav_send -> {

            }
        }

        drawer_layout.closeDrawer(GravityCompat.START)
        return true
    }


    private fun showMainFragment(){
        val fragment = MainFragment()
        val fragmentTransaction = supportFragmentManager.beginTransaction()
        fragmentTransaction.replace(R.id.fragment_container, fragment)        
        fragmentTransaction.commit()
    }
}

MainFragment代码:

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.app_bar_main.*


// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
 * A simple [Fragment] subclass.
 *
 */
class MainFragment : Fragment() {

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


        return view
    }

SecondFragment代码:

import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.app.AppCompatActivity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

class SecondFragment : Fragment() {

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

        (activity as AppCompatActivity).supportActionBar!!.setDisplayHomeAsUpEnabled(true)
        val toolbar = activity!!.findViewById<android.support.v7.widget.Toolbar>(R.id.toolbar)
        (activity as AppCompatActivity).setSupportActionBar(toolbar)
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_material)

        return view
    }

}

【问题讨论】:

    标签: android android-fragments kotlin navigation-drawer


    【解决方案1】:

    因此没有显示汉堡包 -

    val 工具栏 = 活动!!.findViewById(R.id.toolbar) (活动为 AppCompatActivity).setSupportActionBar(toolbar) toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_material)

    要同时处理后退按钮和汉堡包,请在您的活动中添加以下代码。-

    supportFragmentManager.addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener {
    
            if (supportFragmentManager.getBackStackEntryCount() > 0) {
                    supportActionBar?.setDisplayHomeAsUpEnabled(true); // show back button
                    toolbar?.setNavigationOnClickListener(View.OnClickListener { onBackPressed() })
                } else {
                    //show hamburger
                    supportActionBar?.setDisplayHomeAsUpEnabled(false);
                    toogle.syncState();
                    toolbar?.setNavigationOnClickListener(View.OnClickListener {
                        drawer.openDrawer(GravityCompat.START);
                    })
                    setTitle(resources.getString(R.string.app_name))
                }
        })
    

    并从您的第二个片段中删除以下代码-

    (activity as AppCompatActivity).supportActionBar!!.setDisplayHomeAsUpEnabled(true)
        val toolbar = activity!!.findViewById<android.support.v7.widget.Toolbar>(R.id.toolbar)
        (activity as AppCompatActivity).setSupportActionBar(toolbar)
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_material) 
    

    【讨论】:

    • 很高兴为您提供帮助。
    • 但是我们如何处理片段中的后退箭头按钮?因为现在即使我按下工具栏上的后退箭头,它也会打开抽屉,但我希望它像后退按钮一样
    【解决方案2】:

    在 SecondFragment 的 onDestroy 上设置此行

    (activity as AppCompatActivity).supportActionBar!!.setDisplayHomeAsUpEnabled(false)
    

    【讨论】:

    • 后退箭头消失,但主片段上没有显示汉堡包
    【解决方案3】:

    您永远不会将 NavigationIcon 设置回 Hamburger。

    不妨试试:

    toolbar.setNavigationIcon(R.drawable.hamburger)
    

    在你的 MainFragment 中?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多