नेविगेशन ड्रॉअर हैडर में टेक्स्ट व्यू का टेक्स्ट कैसे बदलें?


84

मैं नेविगेशन दराज हेडर के अंदर एक TextView के पाठ को बदलना चाहता हूं। लेकिन मुझे यह त्रुटि मिली:

java.lang.NullPointerException: आभासी पद्धति 'शून्य 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

GetHeaderView`on का उपयोग अपने नेविगेशन दृश्य में करें

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
एंटोनियो विनीसियस मेनेजेस मेडेई ऑग

सेवर मेट। भगवान आपका भला करे: D
बिस्वजीत दास

9

आपको पहले नेविगेशन दृश्य से अपना हैडर लेआउट बढ़ाना चाहिए ...

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

3
मेरे लिए inflateHeaderView ने काम नहीं किया। मैंने इसके बजाय getHeaderView (0) का उपयोग किया।
ज़ीज़र

6
यह समाधान सही ढंग से काम नहीं करता है। यह हैडर को दो बार दिखाता है। GetHeaderView (0) कार्यों का उपयोग करना।
अल्फ़ाड्यूपर

1
@BereketGobeze का सही उत्तर है, यह ठीक से काम नहीं करता है
टचऑफ़सर्मास

यदि आप XML फ़ाइल से अगली पंक्ति को हटाते हैं, तो यह समाधान ठीक ऐप भी काम करता है: शीर्ष लेख: "@ लेआउट / 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()

6

आप इसे 23.1.1 डिज़ाइन सपोर्ट लाइब्रेरी के रूप में भी उपयोग कर सकते हैं

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

संदर्भ: https://stackoverflow.com/a/33692431/2761923


3
  1. आपको अपनी गतिविधि में इस तरह से नेविगेशन व्यू आईडी प्राप्त करना होगा

    NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
    
  2. अब इस तरह से नेविगेशनव्यू आईडी का उपयोग करके हैडर व्यू लेआउट प्राप्त करें

    View headerView = navigationView.getHeaderView(0);
    
  3. अब आप किसी भी दृश्य आईडी को प्राप्त कर सकते हैं और उदाहरण के लिए आप जो चाहते हैं वह कार्य कर सकते हैं

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

आज मेरे लिए काम किया
अरसलान फखर

0

नेविगेशन हेडर प्राप्त करने के लिए इसका उपयोग करें

View hview = navigationView.getHeaderView(0);

फिर नेविगेशन हेडर के विभिन्न विचारों को प्राप्त करने के लिए hview का उपयोग करें और जो आप चाहते हैं वह करें

किसी और का उपयोग कर navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main); इस है इंडेक्स को 1 पर एक नया हैडर का निर्माण।


0

आमतौर पर, हमें नेविगेशन दृश्य को दृश्य दृश्य में फुलाकर नेविगेशन दृश्य का उदाहरण प्राप्त करना होगा, बाद में आप टेक्स्टव्यू को संपादित करने के लिए टेक्स्ट व्यू उदाहरण प्राप्त कर सकते हैं


0

मेरे लिए क्या काम किया? यही तो:-

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

लेकिन अपने xml फ़ाइल से इसे दूर करने के लिए याद रखें।app:headerLayout="@layout/nav_header_main"


ठीक है, इसके बाद के संस्करण के अलावा इसके अलावा..नहीं महीनों के बाद मुझे लगा कि अगर आप एंड्रॉइड डेवलपमेंट में पर्याप्त उन्नत हैं तो इसे करने का एक बेहतर तरीका है !! बस वहाँ फ्रेम लेआउट डालें और उसमें टुकड़ा लोड करें जिसके अंदर हमारे पास Recyclerview और हैडर सेक्शन है। Recyclerview के साथ आप हैडर को सेटअप कर सकते हैं जैसा कि आप टेक्स्टव्यू, इमेज, और बहुत से जैसे चाहें वैसे कर सकते हैं। हाल ही में मैं जिस एप्लिकेशन पर काम कर रहा हूं, उसने डायनेमिक रूप से डेटा को रिसाइकिलव्यू में आउट आइकनों से विखंडन से निकाला और एक रिश्तेदार लेआउट (टेक्स्टव्यू और इमेजव्यू के अंदर) भी डाला, जो कि रीसायकलवे के शीर्ष पर हेडर के रूप में कार्य करता है।


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: फ़ील्ड 'उपयोगकर्ता नाम' के लिए ID 2131296646 के साथ आवश्यक दृश्य 'nav_header_username' नहीं मिला। यदि यह दृश्य वैकल्पिक है तो '@ न्यूबल' (फ़ील्ड) या '@ ऑपशनल' (विधियाँ) एनोटेशन।

मेरे पास लगभग वही कोड है जो ऊपर पोस्ट किया गया है:

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

यह ओपी के सवाल का जवाब नहीं देता
निकोलाई शेवचेंको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.