Làm cách nào để thay đổi văn bản của TextView trong tiêu đề ngăn điều hướng?


84

Tôi muốn thay đổi văn bản của TextView bên trong tiêu đề ngăn điều hướng. Nhưng tôi gặp lỗi này:

java.lang.NullPointerException: Cố gắng gọi phương thức ảo 'void android.widget.TextView.setText (java.lang.CharSequence)' trên tham chiếu đối tượng rỗng


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");    
}

Tôi có thể làm cái này như thế nào?

Câu trả lời:


267

Sử dụng getHeaderView` trên navigationView của bạn

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");

3
Để cập nhật một cách đáng tin cậy TextViewtiêu đề ngăn điều hướng, hãy sử dụng mã này trong ActionBarDrawerToggle.onDrawerOpened()phương pháp. Xem: stackoverflow.com/a/35952939/1657502 .
Antonio Vinicius Menezes Medei

Người bạn đời tiết kiệm. Chúa phù hộ cho bạn: D
Biswajit Das

9

Trước tiên, bạn nên phóng to bố cục Header của mình từ NavigationView ...

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

3
Đối với tôi, InflateHeaderView không hoạt động. Tôi đã sử dụng getHeaderView (0) để thay thế.
Zeezer

6
Giải pháp này không hoạt động chính xác. Điều này hiển thị tiêu đề hai lần. Sử dụng getHeaderView (0) hoạt động.
AlphaDeveloper

1
@BereketGobeze có câu trả lời chính xác, câu trả lời này không hoạt động đúng
touchhofsarcasm

Nếu bạn loại bỏ các dòng tiếp theo từ tập tin XML, giải pháp này cũng hoạt động ứng dụng tốt: headerLayout = "@ layout / nav_header_main"
Pablo Insua

7

Đây là phiên bản Kotlin của mã, hy vọng nó sẽ giúp ích cho ai đó.

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()


3
  1. Bạn cần lấy id NavigationView trong Hoạt động của mình như thế này

    NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
    
  2. Bây giờ hãy tải Bố cục HeaderView bằng id Navigationview như thế này

    View headerView = navigationView.getHeaderView(0);
    
  3. Bây giờ bạn có thể nhận được Bất kỳ id chế độ xem nào và thực hiện hành động như bạn muốn.

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

Làm việc cho tôi hôm nay
Arsalan Fakhar

0

Sử dụng cái này để lấy tiêu đề điều hướng

View hview = navigationView.getHeaderView(0);

sau đó sử dụng hview để có các chế độ xem khác nhau của tiêu đề điều hướng và làm bất cứ điều gì bạn muốn

khác bằng cách sử dụng navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main); này là tạo một tiêu đề mới tại chỉ mục 1.


0

Về cơ bản, chúng ta phải có được phiên bản của chế độ xem điều hướng bằng cách tăng chế độ xem điều hướng trong một biến thể chế độ xem, sau này bạn có thể nhận được phiên bản textView để chỉnh sửa chế độ xem văn bản


0

Điều gì đã làm việc cho tôi? của nó thế này: -

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

Nhưng hãy nhớ xóa cái này khỏi tệp xml của bạn, tức là khỏi NavigationView: -app:headerLayout="@layout/nav_header_main"


Được rồi, ngoài câu trả lời ở trên này .. qua nhiều tháng, giờ tôi đã tìm ra cách tốt hơn để làm điều đó nếu bạn đủ trình độ chuyên sâu về phát triển Android !! Chỉ cần đặt bố cục khung ở đó và tải phân đoạn trong đó, bên trong chúng ta có Recyclerview và phần tiêu đề. Với Recyclerview Bạn có thể thiết lập tiêu đề theo ý muốn với các chế độ xem văn bản, hình ảnh và nhiều thứ khác tùy thích. Ứng dụng gần đây mà tôi đang làm việc đã làm được điều đó. Dữ liệu được truyền động vào Recyclerview từ hiện tượng phân mảnh với các biểu tượng và cũng đặt một bố cục tương đối (bên trong các chế độ xem văn bản và chế độ xem ảnh) đóng vai trò như tiêu đề trên đầu Recyclerview.


0

Điều này đã làm việc cho tôi:

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);

0
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")

-1

Tôi gặp vấn đề tương tự, nhưng cả hai giải pháp đưa ra đều không hiệu quả với tôi

java.lang.IllegalStateException: Không tìm thấy chế độ xem bắt buộc 'nav_header_username' với ID 2131296646 cho trường 'tên người dùng'. Nếu chế độ xem này là tùy chọn, hãy thêm chú thích '@Nullable' (các trường) hoặc '@Optional' (các phương thức).

Tôi có mã gần giống như đã đăng ở trên:

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());

Điều đó không trả lời câu hỏi của OP
Nikolai Shevchenko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.