Android Kotlin在与“活动”不同的布局上更新textview的文本

Android Kotlin在与“活动”不同的布局上更新textview的文本,android,android-layout,kotlin,android-activity,android-xml,Android,Android Layout,Kotlin,Android Activity,Android Xml,我有一个导航标题如下 我想从Kotlin的MainActivity.kt更新nav_header.xml中的TextView 我想从MainActivity.kt package com.example.myapplication ... import android.view.LayoutInflater import android.widget.LinearLayout import kotlinx.android.synthetic.main.activity_main_page.*

我有一个导航标题如下 我想从Kotlin的
MainActivity.kt
更新
nav_header.xml
中的TextView

我想从
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) {
        ...
    }

}
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>
<?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>  
<?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>

您可以从活动中的父视图中找到目标视图,方法如下:

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

可以根据文档使用访问标题视图。由于您在
导航视图中有一个标题视图
,因此可以通过索引
0

访问它。我收到一个错误“无法启动活动组件信息{com.example.myapplication/com.example.myapplication.MainPageActivity}”:java.lang.NullPointerException:userNameTextView不能为null'请分享您放在这一行的一些活动代码块。是的,对我有用,谢谢,请简要解释getHeaderView及其用法,谢谢
import kotlinx.android.synthetic.main.nav_header.view.*
...

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