0

さて、ユーザー アカウント情報を表示するフラグメントができました。

これが機能する方法は、既にキャッシュされている情報に応じて、サーバーにアクセスする場合とアクセスしない場合があるリクエストを発行することです。

情報が利用可能になると、フラグメントがテキストフィールドを更新するコールバックがあります。

ただし、その時点でUIを更新する必要があるため、何らかの形で発行したいと思いinvalidateます...

それが完全に何もしないことを除いて。

this.viewまず、 が返されることに気付きましたnull。そのため、それに頼るのではなく、作成したビューをonCreateView明示的に保存します。

次に、テキストフィールドを更新した後、fragmentView.postInvalidate()... を呼び出しますが、何もしません。

私も試しdoAsync { uiThread { fragmentView.invalidate() } }ました...これも何もしません。

それから私はこの答えを見つけて試しました

    val fragment = this
    doAsync { uiThread {
        activity!!.supportFragmentManager.beginTransaction().detach(fragment).commit()
        activity!!.supportFragmentManager.beginTransaction().attach(fragment).commit()
    }}

...これは、何もしないよりもさらに悪いことです。他の 2 つの方法では、別のフラグメントに切り替えて元に戻すと、少なくともビューが更新されますが、これは有用な情報の表示を永久に拒否します。

super::setUserVisibleHintしたがって、値を更新するまで呼び出しを遅らせることで「ごまかす」ことができるかもしれません...いいえ、できません。

ただし、何かを乾杯することで、UI を強制的に再描画することができます。それが私が現在していることです。しかし、それでも解決にはなりません。

適切な UI リフレッシュを取得するにはどうすればよいですか?

ああ、これはです。問題があれば、フラグメントを切り替えるためにandroid.support.v4.app.Fragmentを使用しています。android.support.v4.app.FragmentStatePagerAdapter

完全なフラグメント コード:

class AccountFragment : Fragment() {
    lateinit var fragmentView: View

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        super.onCreateView(inflater, container, savedInstanceState)
        val view = inflater.inflate(R.layout.fragment_account, container, false)
        /*for some reason [this.view] remains null when we later try to use it, so we're explicitly storing a reference*/
        fragmentView = view
        return view
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        if(isVisibleToUser)setAccountInformation()
        super.setUserVisibleHint(isVisibleToUser)
    }

    private fun setAccountInformation(){
        val um = DataConfig.getUserManager()
        val au = um.getActiveUser()

        um.getUserInfo(au, Callback(
                onResponse = {when(it){
                    is SuccessfulAccountGetResponse -> {
                        val info = it.result

                        usernameText.text = info.name
                        uuidText.text = info.uuid
                        adminText.text = if(info.isAdmin) "YES" else "NO"

                        createdText.text = info.created.toString()
                        lastLoginText.text = info.lastLogin?.toString() ?: "-"

                        //now actually force the new information to show up
                        refreshUI()
                    }
                    else -> doAsync { uiThread{ activity?.longToast("could not get information") } }
                }},
                onError = {doAsync { uiThread { activity?.longToast("error: $it") } }}
        ))
    }

    /** forces a refresh, making changes visible*/
    private fun refreshUI(){
        /*hack: force a redraw by toasting */
        doAsync { uiThread { activity?.toast("updating values") } }

        //THIS does absolutely nothing: //TODO: figure out why
//        fragmentView.postInvalidate()
    }
}
4

0 に答える 0