我已經設法在片段之間切換,但是在輸入新片段時不會應用當前片段的更改。我有 2 個片段,HomeFragment并且Subreddit. 當我第一次運行該應用程式時,它會顯示HomeFragment哪個正在顯示r/aww內容。如果我單擊操作欄,它將變為 Subreddit 片段。在Subreddit片段中,我可以單擊一個 subreddit 類別(例如r/sports,r/news等)。在我單擊一個 subreddit 類別后,片段再次更改為HomeFragment它應該顯示我剛剛選擇的 subreddit 類別的內容,但它沒有。我r/news在Subreddit片段中選擇,但當我運行我的應用程式時,它仍然顯示第一個 subreddit 類別,即r/aww.
這是我的MainActivity.kt
class MainActivity : AppCompatActivity() {
companion object {
var globalDebug = false
lateinit var jsonAww100: String
lateinit var subreddit1: String
private const val mainFragTag = "mainFragTag"
private const val favoritesFragTag = "favoritesFragTag"
private const val subredditsFragTag = "subredditsFragTag"
}
private var actionBarBinding: ActionBarBinding? = null
private val viewModel: MainViewModel by viewModels()
fun hideKeyboard() {
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(window.decorView.rootView.windowToken, 0)
}
private fun initActionBar(actionBar: ActionBar) {
actionBar.setDisplayShowTitleEnabled(false)
actionBar.setDisplayShowCustomEnabled(true)
actionBarBinding = ActionBarBinding.inflate(layoutInflater)
actionBar.customView = actionBarBinding?.root
}
private fun actionBarTitleLaunchSubreddit() {
actionBarBinding?.actionTitle?.setOnClickListener {
actionBarBinding?.actionTitle?.text = "Pick"
supportFragmentManager.commit {
add(R.id.main_frame, Subreddits.newInstance(), subredditsFragTag)
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
}
}
}
private fun addHomeFragment() {
supportFragmentManager.commit {
add(R.id.main_frame, HomeFragment.newInstance(), mainFragTag)
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
}
}
private fun initDebug() {
if(globalDebug) {
assets.list("")?.forEach {
Log.d(javaClass.simpleName, "Asset file: $it" )
}
jsonAww100 = assets.open("aww.hot.1.100.json.transformed.txt").bufferedReader().use {
it.readText()
}
subreddit1 = assets.open("subreddits.1.json.txt").bufferedReader().use {
it.readText()
}
}
}
private fun initTitleObservers() {
viewModel.observeTitle().observe(this){
actionBarBinding?.actionTitle?.text = it
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
setSupportActionBar(activityMainBinding.toolbar)
supportActionBar?.let{
initActionBar(it)
}
addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_main, menu)
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
return when (menuItem.itemId) {
android.R.id.home -> false
else -> true
}
}
})
addHomeFragment()
initDebug()
initTitleObservers()
actionBarTitleLaunchSubreddit()
actionBarLaunchFavorites()
actionBarSearch()
viewModel.setTitleToSubreddit()
}
}
這是我的MainViewModel.kt
class MainViewModel : ViewModel() {
private var title = MutableLiveData<String>()
private var api = RedditApi.create()
private var repository = RedditPostRepository(api)
private val data = MutableLiveData<List<RedditPost>>()
private val subred = MutableLiveData<List<RedditPost>>()
private var subreddit = "aww"
fun netFetchData() = viewModelScope.launch(
context = viewModelScope.coroutineContext
Dispatchers.IO) {
data.postValue(repository.getPosts(subreddit.value.toString()))
}
fun observeData(): LiveData<List<RedditPost>> {
return data
}
fun updateNewCategory(updateTitle: String){
subreddit = updateTitle
}
fun observeNewCategory(): String {
return subreddit
}
fun netFetchSubreddit() = viewModelScope.launch(
context = viewModelScope.coroutineContext
Dispatchers.IO) {
subred.postValue(repository.getSubreddits())
}
fun observeSubreddit(): LiveData<List<RedditPost>> {
return subred
}
fun setTitleToSubreddit() {
title.value = "r/${subreddit.value}"
}
fun observeTitle(): LiveData<String> {
return title
}
fun setTitle(newTitle: String) {
title.value = newTitle
}
}
這是我的SubredditListAdapter.kt
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {
val binding = RowSubredditBinding.inflate(LayoutInflater.from(parent.context),
parent, false)
val holder = VH(binding)
holder.rowSubredditBinding.root.setOnClickListener {
viewModel.setTitle(getItem(holder.adapterPosition).displayName.toString())
viewModel.updateNewCategory(getItem(holder.adapterPosition).displayName.toString())
fragmentActivity.supportFragmentManager.commit{
add(R.id.main_frame, HomeFragment.newInstance(), "mainFragTag")
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
}
}
return holder
}
這是我的HomeFragment.kt:
class HomeFragment: Fragment() {
private val viewModel: MainViewModel by viewModels()
private var _binding: FragmentRvBinding? = null
private val binding get() = _binding!!
companion object {
fun newInstance(): HomeFragment {
return HomeFragment()
}
}
private fun initAdapter(binding: FragmentRvBinding) : PostRowAdapter {
val rv = binding.recyclerView
val adapter = PostRowAdapter(viewModel)
rv.adapter = adapter
rv.layoutManager = LinearLayoutManager(binding.root.context)
viewModel.netFetchData(viewModel.observeNewCategory())
viewModel.observeData().observe(viewLifecycleOwner) {
adapter.submitList(it)
}
return adapter
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentRvBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Log.d(javaClass.simpleName, "onViewCreated")
initAdapter(binding)
}
}
我想通過使用updateNewCategory并observeNewCategory更改 subreddit 類別,但事實證明并沒有。如何更新類別并應用更改?
uj5u.com熱心網友回復:
我對您的代碼片段的理解是您正在嘗試使用通用 MainViewModel 在您的片段和活動之間進行通信。
您的問題是您正在通過使用private val viewModel: MainViewModel by viewModels()而不是使用在片段中創建 MainViewModel 的新實體activityViewModel
使用以下行在您的片段中獲取您的活動的 viewModel 參考
private val viewModel: MainViewModel by activityViewModels()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/517715.html
