【问题标题】:Handling a task after a Fragment Loads在片段加载后处理任务
【发布时间】: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


    【解决方案1】:

    片段在创建时不会立即可用,因为它有自己的处理过程。如果你想维护一个presenter结构,你应该为fragment创建一个伴随的presenter对象来协调fragment,而不是通过Activity来控制它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多