如何从 Activity 更新 Navigation Header 中的 TextView?

How to update TextView in Navigation Header from Activity?

导航中 TextView 的更改 header 不会更新 UI。所有这些都在 UI 线程上执行。 TextView 的值是用户特定的,所以我需要从 Activity.

中设置它们

我的想法是从我的 API 获取信息,然后只显示它。 API 部分工作正常,显示不多。

我的activity:


class User(val username: String, val display_name: String )

class MainActivity : AppCompatActivity() {


    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var mDrawerLayout: DrawerLayout
    private lateinit var btnLogout: TextView
    val client: OkHttpClient = OkHttpClient()


    fun getMyProfile(){
        // code that makes the request to my API is here!(and it's working)

            override fun onResponse(call: Call, response: Response) {
                val body= response.body()?.string()

                println(response.code())
                println(body)
                if(response.code()==200){
                    val gson = GsonBuilder().create()
                    val my_user = gson.fromJson(body, User::class.java)
                    val view = LayoutInflater.from(this@MainActivity).inflate(R.layout.nav_header_main, null, false)
                    val username: TextView = view.findViewById(R.id.username)
                    val display_name: TextView = view.findViewById(R.id.displayname)
                    username.text = my_user.username
                    display_name.text = my_user.display_name


                }
                if(response.code()==401){
                    // if the request is not allowed
                }
            }
        })
    }

    override fun onCreate(savedInstanceState: Bundle?) {



        val context:Context = baseContext
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val toolbar: Toolbar = findViewById(R.id.toolbar)
        setSupportActionBar(toolbar)

        val fab: FloatingActionButton = findViewById(R.id.fab)
        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show()
        }
        val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
        val navView: NavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.nav_home, R.id.nav_new_group, R.id.nav_new_channel,
                R.id.nav_contacts, R.id.nav_settings, R.id.nav_send
            ), drawerLayout
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        getMyProfile()
        ...
    }
        ...





}

nav_header_main.xml

<TextView
        android:id="@+id/displayname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:text="@string/nav_header_title"
        android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

    <TextView
        android:id="@+id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/nav_header_subtitle" />

my_user.username和my_user.display_name都有值(我特地查过了)。

我明白了。 您必须创建 inflater 和一个 ViewGroup。 于是就变成了:

val inflater: LayoutInflater = this@MainActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val viewGroup : ViewGroup = findViewById (R.id.nav_view)
var view = inflater.inflate(R.layout.nav_header_main, viewGroup)

指向 TextView 的变量变为:

var display_name: TextView = view.findViewById(R.id.displayname)
var username: TextView = view.findViewById(R.id.username)