Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android kotlin在某些片段中显示导航抽屉图标而不是后退按钮_Android_Android Fragments_Kotlin - Fatal编程技术网

Android kotlin在某些片段中显示导航抽屉图标而不是后退按钮

Android kotlin在某些片段中显示导航抽屉图标而不是后退按钮,android,android-fragments,kotlin,Android,Android Fragments,Kotlin,我想在某个片段上显示导航抽屉图标,而不是后退按钮。我用导航图创建了应用程序 假设我有两个片段(LoginFragment和DashboardFragment)和一个活动(MainActivity) MainActivity.kt class MainActivity : AppCompatActivity() { lateinit var drawerLayout: DrawerLayout override fun onCreate(savedInstanceState:

我想在某个片段上显示导航抽屉图标,而不是后退按钮。我用导航图创建了应用程序

假设我有两个片段(
LoginFragment
DashboardFragment
)和一个活动(
MainActivity

MainActivity.kt

class MainActivity : AppCompatActivity() {

    lateinit var drawerLayout: DrawerLayout

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        drawerLayout = binding.drawerLayout

        val navController = this.findNavController(R.id.myNavHostFragment)

        // prevent nav gesture if not on start destination
        navController.addOnDestinationChangedListener { nc: NavController, nd: NavDestination, args: Bundle? ->
            if (nd.id == nc.graph.startDestination) {
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
            } else {
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
            }
        }

        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
        NavigationUI.setupWithNavController(binding.navView, navController)

    }


    // Set up the back button on action bar
    override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.myNavHostFragment)

        return NavigationUI.navigateUp(navController, drawerLayout)
    }
}
class LoginFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding:FragmentLoginBinding = DataBindingUtil.inflate(inflater,
            R.layout.fragment_login, container, false)

        // Hide the Action bar
        (activity as AppCompatActivity).supportActionBar?.hide()

        binding.loginButton.setOnClickListener {
           //Some unimportant validation
        }


        return binding.root
    }

}
class DashboardFragment : Fragment() {

    lateinit var binding : FragmentDashboardBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // Binding object for this fragment and the layout
        binding = DataBindingUtil.inflate(inflater,
            R.layout.fragment_dashboard, container, false)

        //Navigate to Product stock fragment when clicked
        binding.productStockButton.setOnClickListener(Navigation.createNavigateOnClickListener(
            R.id.action_dashboardFragment_to_productStockOutletList
        ))

        //Navigate to Switching History fragment when clicked
        binding.switchingHistoryButton.setOnClickListener(Navigation.createNavigateOnClickListener(
            R.id.action_dashboardFragment_to_switchingHistoryFragment
       ))

        //Navigate to Outlet List fragment for Outstanding Product when clicked
        binding.outstandingOrderButton.setOnClickListener(Navigation.createNavigateOnClickListener(
            R.id.action_dashboardFragment_to_outletListFragment
        ))


        // Set action bar title to "Main Dashboard"
        (activity as AppCompatActivity).supportActionBar?.title = "Main Dashboard"

        // Declare that this fragment has menu
        setHasOptionsMenu(true)

        (activity as AppCompatActivity).supportActionBar?.show()
        (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(false)


        //Return.... i don't know.
        return binding.root
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        super.onCreateOptionsMenu(menu, inflater)
        inflater?.inflate(R.menu.nav_overflow_menu, menu)
    }
}
仪表板片段.kt

class MainActivity : AppCompatActivity() {

    lateinit var drawerLayout: DrawerLayout

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        drawerLayout = binding.drawerLayout

        val navController = this.findNavController(R.id.myNavHostFragment)

        // prevent nav gesture if not on start destination
        navController.addOnDestinationChangedListener { nc: NavController, nd: NavDestination, args: Bundle? ->
            if (nd.id == nc.graph.startDestination) {
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
            } else {
                drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
            }
        }

        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
        NavigationUI.setupWithNavController(binding.navView, navController)

    }


    // Set up the back button on action bar
    override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.myNavHostFragment)

        return NavigationUI.navigateUp(navController, drawerLayout)
    }
}
class LoginFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding:FragmentLoginBinding = DataBindingUtil.inflate(inflater,
            R.layout.fragment_login, container, false)

        // Hide the Action bar
        (activity as AppCompatActivity).supportActionBar?.hide()

        binding.loginButton.setOnClickListener {
           //Some unimportant validation
        }


        return binding.root
    }

}
class DashboardFragment : Fragment() {

    lateinit var binding : FragmentDashboardBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // Binding object for this fragment and the layout
        binding = DataBindingUtil.inflate(inflater,
            R.layout.fragment_dashboard, container, false)

        //Navigate to Product stock fragment when clicked
        binding.productStockButton.setOnClickListener(Navigation.createNavigateOnClickListener(
            R.id.action_dashboardFragment_to_productStockOutletList
        ))

        //Navigate to Switching History fragment when clicked
        binding.switchingHistoryButton.setOnClickListener(Navigation.createNavigateOnClickListener(
            R.id.action_dashboardFragment_to_switchingHistoryFragment
       ))

        //Navigate to Outlet List fragment for Outstanding Product when clicked
        binding.outstandingOrderButton.setOnClickListener(Navigation.createNavigateOnClickListener(
            R.id.action_dashboardFragment_to_outletListFragment
        ))


        // Set action bar title to "Main Dashboard"
        (activity as AppCompatActivity).supportActionBar?.title = "Main Dashboard"

        // Declare that this fragment has menu
        setHasOptionsMenu(true)

        (activity as AppCompatActivity).supportActionBar?.show()
        (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(false)


        //Return.... i don't know.
        return binding.root
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        super.onCreateOptionsMenu(menu, inflater)
        inflater?.inflate(R.menu.nav_overflow_menu, menu)
    }
}
这是我的导航图(我将LoginFragment设置为home)

我想在DashboardFragment中显示导航抽屉,而不是LoginFragment。(LoginFragment仍然是图表的开始)。我已经隐藏了仪表板碎片的向上按钮

是仪表板的当前外观。正如你所看到的,后退按钮已经不见了


我能帮上什么忙吗?如果有不清楚的地方,请告诉我。

试试这个,我希望它能对您有所帮助,它将隐藏
登录片段上的
操作栏
,因为它是
图形
上的起始目标,并以其他方式显示它

class MainActivity : AppCompatActivity() {

private lateinit var appBarConfiguration: AppBarConfiguration

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val toolbar: Toolbar = findViewById(R.id.toolbar)
    setSupportActionBar(toolbar)

    val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
    val navView: NavigationView = findViewById(R.id.nav_view)
    val navController = findNavController(R.id.nav_host_fragment)



    // prevent nav gesture if not on start destination
    navController.addOnDestinationChangedListener { nc: NavController, nd: NavDestination, args: Bundle? ->
        if (nd.id == nc.graph.startDestination) {
         drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
         supportActionBar?.hide()
        } else {
         supportActionBar?.show()
         drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
        }
    }

     // here this ids are form fragment which should show navigation icon
    appBarConfiguration = AppBarConfiguration(setOf(
            R.id.nav_home,R.id.nav_gallery, R.id.nav_slideshow), drawerLayout)
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)
}

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 onSupportNavigateUp(): Boolean {
    val navController = findNavController(R.id.nav_host_fragment)
    return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
 }
}

试试这个,我希望它能帮助你,它会在
loginfracent
上隐藏
actionBar
,因为它是
graph
上的startDestination,否则会显示出来

class MainActivity : AppCompatActivity() {

private lateinit var appBarConfiguration: AppBarConfiguration

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val toolbar: Toolbar = findViewById(R.id.toolbar)
    setSupportActionBar(toolbar)

    val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
    val navView: NavigationView = findViewById(R.id.nav_view)
    val navController = findNavController(R.id.nav_host_fragment)



    // prevent nav gesture if not on start destination
    navController.addOnDestinationChangedListener { nc: NavController, nd: NavDestination, args: Bundle? ->
        if (nd.id == nc.graph.startDestination) {
         drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
         supportActionBar?.hide()
        } else {
         supportActionBar?.show()
         drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
        }
    }

     // here this ids are form fragment which should show navigation icon
    appBarConfiguration = AppBarConfiguration(setOf(
            R.id.nav_home,R.id.nav_gallery, R.id.nav_slideshow), drawerLayout)
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)
}

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 onSupportNavigateUp(): Boolean {
    val navController = findNavController(R.id.nav_host_fragment)
    return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
 }
}

使用
addOnDestinationChangedListener
来显示和隐藏与目标对应的图标sorry,如何执行?您已经在MainActivity上实现了它,因为您可以在仪表板中将工具栏图标设置为hamburger,并在loginSo中将其隐藏或设置为透明。。。我应该在
addOnDestinationChangedListener
上添加什么?使用
addOnDestinationChangedListener
显示和隐藏与DestinationsOrry相对应的图标,如何实现?您已经在MainActivity上实现了它,因为您可以在Dashboard中将工具栏图标设置为hamburger,然后在loginSo中将其隐藏或设置为透明。。。我应该在
addOnDestinationChangedListener
上添加什么?