【发布时间】:2017-11-27 20:45:58
【问题描述】:
我在这里的小学习项目是一个简单的笔记应用程序,它使用动态片段来保存笔记。将“.txt”文件中的加载文本显示到 TextView 时遇到问题。
调试显示,当我去查找我的 NoteEditFragment 时,它为空。这可能是我的文件没有正确翻译成 TextView 的原因。只有在 Fragment 存在之后,我如何才能调用我的 NoteEditFragment 的 setText 函数?有一个更好的方法吗?我试图让片段只处理 UI,并将我的 Activity 用作更多的演示者。
不起作用的序列:
//Interfaces
override fun noteEditSaveClicked(note: String) {
saveNote(note)
swapFragments()
openNote()
}
有效的序列(可能是因为它一直等到 Fragment 被加载)
override fun onStart() {
super.onStart()
openNote()
}
完整的活动代码:
package com.inviscidlabs.kotlinnotes
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
import kotlinx.android.synthetic.main.activity_note_home.*
import java.io.File
class NoteHome : NoteHomeFragmentEvent, NoteEditAction, AppCompatActivity() {
//Lifecycle
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_note_home)
setSupportActionBar(toolbar)
swapFragments()
}
override fun onStart() {
super.onStart()
openNote()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_note_home, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_settings -> true
else -> super.onOptionsItemSelected(item)
}
}
//Local Functions
private fun openNote(){
var printText = ""
File(this.filesDir, "note.txt").bufferedReader().forEachLine { line ->
printText += line
}
val f: NoteHomeFragment? = supportFragmentManager.findFragmentByTag(FragmentIDs.HOME.fragID) as NoteHomeFragment?
f?.setNote(printText)
}
private fun swapFragments() {
val replaceFragment = { frag: Fragment, fragTag: String ->
supportFragmentManager.beginTransaction().replace(R.id.anh_fragContainer,
frag, fragTag).commit()
}
if (supportFragmentManager.fragments.size > 0) {
if (supportFragmentManager.findFragmentByTag(FragmentIDs.NOTEEDIT.fragID) == null) {
replaceFragment(NoteEditFragment(), FragmentIDs.NOTEEDIT.fragID)
} else {
replaceFragment(NoteHomeFragment(), FragmentIDs.HOME.fragID)
openNote()
}
} else {
replaceFragment(NoteHomeFragment(), FragmentIDs.HOME.fragID)
openNote()
}
}
fun saveNote(noteBody: String){
File(this.filesDir, "note.txt").bufferedWriter().use { out ->
out.write(noteBody)
}
}
//Interfaces
override fun noteEditSaveClicked(note: String) {
saveNote(note)
swapFragments()
openNote()
}
override fun addNoteFabClicked() { swapFragments()}
}
enum class FragmentIDs (val fragID: String){
NOTEEDIT("NoteEditFragment"), HOME("NoteHomeFragment")
}
【问题讨论】:
标签: android android-activity kotlin fragment android-lifecycle