Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 向上导航可以';不要把碎片带回家_Android_Kotlin_Android Fragments_Android Navigation_Kotlin Android Extensions - Fatal编程技术网

Android 向上导航可以';不要把碎片带回家

Android 向上导航可以';不要把碎片带回家,android,kotlin,android-fragments,android-navigation,kotlin-android-extensions,Android,Kotlin,Android Fragments,Android Navigation,Kotlin Android Extensions,我的应用程序上有3个片段(HomeFragment、NewsFragment、DetailFragment),返回按钮按原样工作。向上导航的工作原理与系统后退按钮类似,但当单击NewsFragment时,向上导航无法将我带回HomeFragment,而后退按钮可以 这是我的密码: MainActivity.kt package com.example.google_like import android.os.Bundle import androidx.appcompat.app.A

我的应用程序上有3个片段(HomeFragment、NewsFragment、DetailFragment),返回按钮按原样工作。向上导航的工作原理与系统后退按钮类似,但当单击NewsFragment时,向上导航无法将我带回HomeFragment,而后退按钮可以

这是我的密码:

MainActivity.kt

    package com.example.google_like

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.navigation.findNavController
import androidx.navigation.ui.NavigationUI
import com.example.google_like.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
        val navController = this.findNavController(R.id.nav_host_fragment)
        NavigationUI.setupActionBarWithNavController(this, navController)

    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.nav_host_fragment)
        return navController.navigateUp()
    }





}
HomeFragment.kt:

    package com.example.google_like.home

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.example.google_like.databinding.FragmentHomeBinding


class HomeFragment : Fragment() {
lateinit var binding: FragmentHomeBinding
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment

        binding= FragmentHomeBinding.inflate(inflater)
        binding.lifecycleOwner = this

        binding.button.setOnClickListener {

            this.findNavController().navigate(HomeFragmentDirections.actionHomeFragmentToNewsFragment())

        }

        return binding.root
    }


}
NewsFragment.kt:

package com.example.google_like.news

import android.os.Bundle
import android.util.Log
import android.view.*
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import com.example.google_like.R
import com.example.google_like.databinding.FragmentNewsBinding
const val LOG_TAG = "NewsFragment"

class NewsFragment : Fragment() {

    private val newsViewModel : NewsViewModel by lazy {
    ViewModelProvider(this).get(NewsViewModel::class.java)
}
    lateinit var binding: FragmentNewsBinding
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        Log.i(LOG_TAG,"onCreateView() called")
        binding = FragmentNewsBinding.inflate(inflater)
        Log.i(LOG_TAG,"binding")

        binding.lifecycleOwner = this

        binding.recycleView.adapter = NewsAdapter(NewsAdapter.OnClickListener{
        this.findNavController().navigate(NewsFragmentDirections.actionNewsFragmentToDetailFragment(it))
        })
        Log.i(LOG_TAG,"recyclerView adapter")


        binding.viewModel = newsViewModel
        Log.i(LOG_TAG,"binding.viewModel = newsViewModel")
        setHasOptionsMenu(true)
        return binding.root
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        super.onCreateOptionsMenu(menu, inflater)
        inflater.inflate(R.menu.overflow_menu,menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        newsViewModel.updateFilter(when(item.itemId){
            R.id.show_buy_menu -> MarsApiFilter.SHOW_BUY
            R.id.show_rent_menu -> MarsApiFilter.SHOW_RENT
            else -> MarsApiFilter.SHOW_ALL
        })
        return true
    }
}
DetailFragment.kt

class DetailFragment : Fragment() {
    lateinit var binding: FragmentDetailBinding
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
       binding = FragmentDetailBinding.inflate(inflater)
        binding.lifecycleOwner = this
        val arguments = DetailFragmentArgs.fromBundle(requireArguments()).property
        val application = requireActivity().application

        val detailViewModelFactory = DetailViewModelFactory(arguments,application)
        val detailViewModel = ViewModelProvider(this,detailViewModelFactory).get(DetailViewModel::class.java)
        binding.viewModel = detailViewModel

        return binding.root
    }
}
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.google_like">
<uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity"
            android:parentActivityName=".MainActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

BindingAdapter.kt(RecyclerView位于NewsFragment上。单击向上导航时也会调用此绑定适配器,但onCreateView()不会调用。通常,当LiveData(作为参数传递)更改时应调用此绑定适配器。idk为什么会发生这种情况?)

@BindingAdapter(“listData”)
fun RecyclerView.bindData(列表:列表?){
Log.i(“BindingAdapter”,“调用bindData()”)
val adapter=此.adapter作为新闻适配器
适配器.提交列表(列表)
}

Try
return navController.navigateUp()| | super.onSupportNavigateUp()
@BindingAdapter("listData")
fun RecyclerView.bindData(list: List<MarsProperty>?){
    Log.i("BindingAdapter","bindData() called")

        val adapter = this.adapter as NewsAdapter
        adapter.submitList(list)


}