2017-11-27 21 views
0

ここで私の少しの学習プロジェクトは、メモを保存するためにダイナミックフラグメントを使用する単純なメモ取りアプリです。読み込まれたテキストを ".txt"ファイルからTextViewに表示する際に問題が発生しています。フラグメントロード後のタスクの処理

デバッグすると、NoteEditFragmentが見つかると、nullになります。これは、私のファイルがTextViewに正しく翻訳されていない可能性が高いためです。私のNoteEditFragmentのsetText関数を呼び出すにはどうすればよいのですか?これを行うより良い方法はありますか?フラグメントをUIのみを扱い、プレゼンターの多くとして私のアクティビティを使用するようにしています。

動作しないシーケンス:

//Interfaces 
override fun noteEditSaveClicked(note: String) { 
     saveNote(note) 
     swapFragments() 
     openNote() 
    } 

(断片がロードされるまでは待機しているためおそらく)動作するシーケンスに

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") 
} 

答えて

0

断片は、通過するための独自のプロセスを持っているため、作成された時点ですぐには利用できません。プレゼンター構造を維持したい場合は、アクティビティーを介してフラグメントを制御するのではなく、フラグメントをコンパニオンに調整するためのコンパニオンプレゼンターオブジェクトを作成する必要があります。

関連する問題