Kotlin 更新来自 activity 的不同布局的 textview 文本

Kotlin update text of textview on different layout from activity

我有一个导航 header 如下 我想通过 Kotlin

MainActivity.kt 更新 nav_header.xml 中的 TextView

我想从 MainActivity.kt

更新 TextView(id=drawer_user_name) 的文本

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/content_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="45dp"
            android:background="@android:drawable/screen_background_light_transparent"
            tools:listitem="@layout/item_list" />


    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header"
        app:menu="@menu/nav_menu" />


</androidx.drawerlayout.widget.DrawerLayout>

nav_header.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:background="#4cAF50"
    android:orientation="vertical"
    android:layout_gravity="top"
    android:paddingTop="35dp"
    android:paddingLeft="15dp"
    android:paddingBottom="15dp"
    android:id="@+id/ddd">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"
        android:id="@+id/imageView"
        android:layout_marginBottom="15dp"/>

    <TextView
        android:id="@+id/drawer_user_name"    //--> i want to update this TextView from MainActivity.kt
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="title"
        android:textColor="#FFFFFF"
        android:textStyle="bold" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="this our navigation drawer"
        android:textColor="#FFFFFF" />

</LinearLayout>  

content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/colorPrimary"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center_vertical"
                android:orientation="horizontal">

                <TextView
                    style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
                    android:id="@+id/home_page_username"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Chat"
                    android:textColor="#FFFFFF" />
            </LinearLayout>


        </androidx.appcompat.widget.Toolbar>
    </com.google.android.material.appbar.AppBarLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="this is my content"/>
    </LinearLayout>

</LinearLayout>

请帮助我,我真的需要一种方法来解决这个问题
谢谢

Babbab 强迫我们在这里写故事,以便我们 post 提出问题(看来您的 post 主要是代码;请添加更多详细信息)

编辑
我的 MainActivity.kt

package com.example.myapplication

...
import android.view.LayoutInflater
import android.widget.LinearLayout
import kotlinx.android.synthetic.main.activity_main_page.*
import kotlinx.android.synthetic.main.nav_header.view.*

class MainPageActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener,CustomAdapter.OnItemClickListener {

    lateinit var toolbar:androidx.appcompat.widget.Toolbar
    lateinit var drawerLayout: DrawerLayout
    lateinit var navView:NavigationView

    private var data = arrayListOf<UserChanel>()
    private lateinit var myadapter:CustomAdapter
    private val gson = Gson()


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        toolbar =findViewById(R.id.toolbar)
        setSupportActionBar(toolbar)

        drawerLayout = findViewById(R.id.drawer_layout)
        navView = findViewById(R.id.nav_view)

        val toggle = ActionBarDrawerToggle(this,drawerLayout,toolbar,0,0)
        drawerLayout.addDrawerListener(toggle)
        toggle.syncState()
        navView.setNavigationItemSelectedListener(this)

//        val userNameTextView = nav_view.findViewById<TextView>(R.id.drawer_user_name)
//        userNameTextView.text = "SOME TEXT"   // error

        nav_view.drawer_user_name.text = "SOME TEXT"   // Error

       
        val recyclerview = findViewById<RecyclerView>(R.id.recycler_view)



        // for insert line divider to recyclerview items
        recyclerview.addItemDecoration(SimpleDividerItemDecoration(this)) // for insert line divider to recyclerview items

        send_request()

        val adapter = CustomAdapter(this,data,this)
        recyclerview.layoutManager = LinearLayoutManager(this)
        recyclerview.adapter = adapter
        recyclerview.setHasFixedSize(true)
        myadapter = adapter

    }

    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.nav_profile->{
                Toast.makeText(this,"profile clicked",Toast.LENGTH_SHORT).show()
            }
            R.id.nav_message->{
                Toast.makeText(this,"message clicked",Toast.LENGTH_SHORT).show()
            }
            R.id.nav_frinds->{
                Toast.makeText(this,"frinds clicked",Toast.LENGTH_SHORT).show()
            }
            R.id.nav_update->{
                Toast.makeText(this,"update clicked",Toast.LENGTH_SHORT).show()
            }
            R.id.nav_logout->{
                Toast.makeText(this,"logout clicked",Toast.LENGTH_SHORT).show()
            }
        }
        drawerLayout.closeDrawer(GravityCompat.START)
        return true
    }
    private fun send_request(){
       ...
    }

    override fun onItemClick(position: Int,adapter: CustomAdapter,v:View) {
        ...
    }

}

您可以通过以下任一方式从 activity 中的 parent 找到目标视图:

nav_view.getHeaderView(0).findViewById<TextView>(R.id.drawer_user_name).text = "SOME TEXT"

import kotlinx.android.synthetic.main.nav_header.view.*
...

nav_view.getHeaderView(0).drawer_user_name.text = "SOME TEXT"

根据文档,可以使用 getheaderview(int index) 访问 header 视图。由于您在 NavigationView 中有一个 header 视图,因此可以通过索引 0.

访问它