【问题标题】:How to change text of a TextView in navigation drawer header?如何在导航抽屉标题中更改 TextView 的文本?
【发布时间】:2016-04-30 15:10:33
【问题描述】:

我想更改导航抽屉标题内的 TextView 的文本。但我得到这个错误:

java.lang.NullPointerException: 尝试调用虚方法 'void android.widget.TextView.setText(java.lang.CharSequence)' 为空 对象引用


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

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

        <FrameLayout
            android:id="@+id/frame_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>

    <android.support.design.widget.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_main"
        app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>

nav_header_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/nav_header_height"
    android:background="@drawable/slide_nav_bar"
    android:gravity="bottom"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:theme="@style/ThemeOverlay.AppCompat.Dark">

    <ImageView
        android:id="@+id/tvHeaderIcon"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:src="@android:drawable/sym_def_app_icon" />

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

    <TextView
        android:id="@+id/tvHeaderName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

MainActivity.java

TextView tvHeaderName;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    tvHeaderName= (TextView) findViewById(R.id.tvHeaderName);
    tvHeaderName.setText("Saly");    
}

我该怎么做?

【问题讨论】:

    标签: java android textview


    【解决方案1】:

    在你的navigationView上使用getHeaderView函数:

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    View headerView = navigationView.getHeaderView(0);
    TextView navUsername = (TextView) headerView.findViewById(R.id.navUsername);
    navUsername.setText("Your Text Here");
    

    【讨论】:

    【解决方案2】:

    您应该首先从 NavigationView 中扩展您的 Header 布局...

    navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main);
    tvHeaderName= (TextView) navHeaderView.findViewById(R.id.tvHeaderName);
    tvHeaderName.setText("Saly"); 
    

    【讨论】:

    • 对我来说 inflateHeaderView 不起作用。我改用 getHeaderView(0)。
    • 此解决方案无法正常工作。这显示了两次标题。使用 getHeaderView(0) 有效。
    • @BereketGobeze 有正确答案,这不能正常工作
    • 如果您从 XML 文件中删除下一行,此解决方案也可以正常工作 app:headerLayout="@layout/nav_header_main"
    【解决方案3】:

    这是代码的 Kotlin 版本,希望它对那里的人有所帮助。

    val navigationView : NavigationView  = findViewById(R.id.nav_view)
    val headerView : View = navigationView.getHeaderView(0)
    val navUsername : TextView = headerView.findViewById(R.id.txtUserName)
    val navUserEmail : TextView = headerView.findViewById(R.id.txtEmail)
    
    navUsername.text = username.toString()
    navUserEmail.text = email.toString()
    

    【讨论】:

      【解决方案4】:

      您也可以从 23.1.1 设计支持库开始使用它

      View header = navigationView.getHeaderView(0)
      TextView text = (TextView) header.findViewById(R.id.textView);
      

      参考:https://stackoverflow.com/a/33692431/2761923

      【讨论】:

        【解决方案5】:
        1. 您需要像这样在 Activity 中获取 NavigationView id

          NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
          
        2. 现在像这样使用 Navigationview id 获取 HeaderView 布局

          View headerView = navigationView.getHeaderView(0);
          
        3. 现在您可以获取任何视图 ID 并执行您想要的操作示例

          TextView navUsername = (TextView) headerView.findViewById(R.id.navUsername);
          navUsername.setText("Your Text Here");
          

        【讨论】:

        • 今天为我工作
        【解决方案6】:
        val navigationView = findViewById<View>(R.id.nav_view_home) as NavigationView
                val headerView = navigationView.getHeaderView(0)
                val tvUserName = headerView.findViewById<View>(R.id.tvUserName) as TextView
                tvUserName.text=(Preference.getInstance("your text")
        

        【讨论】:

          【解决方案7】:

          使用它来获取导航标题

          View hview = navigationView.getHeaderView(0);

          然后使用 hview 获取导航标题的不同视图并做任何你想做的事情

          else using navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main); 这是在索引 1 处创建一个新标头。

          【讨论】:

            【解决方案8】:

            最初,我们必须通过在视图变量中膨胀导航视图来获取导航视图的实例,稍后您可以获取 textView 实例来编辑文本视图

            【讨论】:

              【解决方案9】:

              什么对我有用?它是这样的:-

               View linearLayout=navigationView.inflateHeaderView(R.layout.nav_header_main);
                    TextView name =  linearLayout.findViewById(R.id.welcomenametext);
              

              但请记住将其从您的 xml 文件中删除,即从 NavigationView 中删除:-app:headerLayout="@layout/nav_header_main"


              好的,除了上面的答案..几个月以来,我现在认为如果您在 android 开发方面足够先进,有更好的方法!只需将框架布局放在那里并在其中加载片段,其中我们有 Recyclerview 和标题部分。使用 Recyclerview 您可以根据需要使用 textviews、image 等设置标题。我正在处理的最近的应用程序就是这样做的。将数据从没有图标的片段活动动态传递到 Recyclerview,并且还放置了一个相对布局(在 textviews 和 imageview 中),它作为 Recyclerview 顶部的标题。

              【讨论】:

                【解决方案10】:

                这对我有用:

                NavigationView navigationView = findViewById(R.id.nav_view);
                View headerView = navigationView.getHeaderView(0);
                TextView title = headerView.findViewById(R.id.nav_title);
                TextView subTitle = headerView.findViewById(R.id.nav_sub_title);
                

                【讨论】:

                  【解决方案11】:

                  我有同样的问题,但两个给定的解决方案都不适合我

                  java.lang.IllegalStateException:找不到字段“用户名”的 ID 为 2131296646 的必需视图“nav_header_username”。如果此视图是可选的,请添加“@Nullable”(字段)或“@Optional”(方法)注释。

                  我的代码与上面发布的几乎相同:

                  NavigationView navigationView = (NavigationView)findViewById(R.id.navigation_content);
                  View headerView = navigationView.inflateHeaderView(R.layout.nav_header);
                  TextView navUsername = (TextView) headerView.findViewById(R.id.nav_header_username);
                  navUsername.setText("Hello, "+mUserSession.getLoggedUserData().getmFirstName());
                  

                  【讨论】:

                  • 这不能回答 OP 的问题
                  猜你喜欢
                  • 2016-09-08
                  • 2015-07-21
                  • 1970-01-01
                  • 2020-08-30
                  • 1970-01-01
                  • 2023-02-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多