탐색 창 헤더에서 TextView의 텍스트를 변경하는 방법은 무엇입니까?


84

탐색 창 헤더 내에서 TextView의 텍스트를 변경하고 싶습니다. 하지만이 오류가 발생합니다.

java.lang.NullPointerException : null 객체 참조에서 가상 메소드 '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");    
}

어떻게 할 수 있습니까?

답변:


267

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

3
TextView탐색 창 헤더에서 를 안정적으로 업데이트하려면 ActionBarDrawerToggle.onDrawerOpened()메서드 에서이 코드를 사용하세요 . 참조 : stackoverflow.com/a/35952939/1657502 .
Antonio Vinicius Menezes Medei

세이버 메이트. 신의 축복을 빕니다 : D
Biswajit Das

9

먼저 NavigationView에서 헤더 레이아웃을 확장해야합니다.

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

3
나를 위해 inflateHeaderView가 작동하지 않았습니다. 대신 getHeaderView (0)을 사용했습니다.
Zeezer

6
이 솔루션은 제대로 작동하지 않습니다. 헤더가 두 번 표시됩니다. getHeaderView (0) 사용이 작동합니다.
AlphaDeveloper

1
@BereketGobeze에 정답이 있습니다. 제대로 작동하지 않습니다
touchofsarcasm

XML 파일에서 다음 줄을 제거하면,이 솔루션은 잘 응용 프로그램을 작동합니다 headerLayout을 = "@ 레이아웃 / nav_header_main"
파블로 인수 아

7

다음은 코드의 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()


3
  1. 이와 같은 활동에서 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");
    

오늘 나를 위해 일했습니다
Arsalan Fakhar

0

이것을 사용하여 탐색 헤더를 가져옵니다.

View hview = navigationView.getHeaderView(0);

그런 다음 hview를 사용하여 탐색 헤더의 다른보기를 얻고 원하는대로 수행하십시오.

그렇지 않으면 navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main); 이것을 사용 하면 색인 1에 새 헤더가 생성됩니다.


0

처음에는보기 변수에서 탐색보기를 확장하여 탐색보기의 인스턴스를 가져와야합니다. 나중에 textView 인스턴스를 가져 와서 textview를 편집 할 수 있습니다.


0

나를 위해 일한 것은 무엇입니까? 이것 :-

 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로 데이터를 동적으로 전달하고 Recyclerview 상단에 헤더 역할을하는 상대 레이아웃 (textviews 및 imageview 내부)도 넣었습니다.


0

이것은 나를 위해 일했습니다.

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

나는 같은 문제가 있지만 주어진 솔루션 모두 나를 위해 작동하지 않았습니다.

java.lang.IllegalStateException : 'username'필드에 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의 질문에 대답하지 않습니다
Nikolai Shevchenko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.