नेवीगेशन व्यू को हेडर लेआउट मिलता है / मिलता है


171

मेरे नेविगेशन व्यू में मेरे पास सक्रिय बटनों के साथ आईडी 'व्यूआईड' वाला हेडर लेआउट है। उन बटन को सेटअप करने के लिए, मैं गतिविधि में निम्नलिखित करता हूं onPostCreate:

final View panel = findViewById(R.id.viewId);
panel.setOnClickListener(new View.OnClickListener() {
... setup goes here ...
});

नए संस्करण के साथ एंड्रॉइड सपोर्ट लाइब्रेरी, ( 23.1.0 ), दृश्य नहीं मिल सकता है, यह अशक्त देता है। पिछले संस्करणों के साथ इसने अच्छा काम किया। क्या यह बग है या मैं इस सुविधा का गलत उपयोग कर रहा हूं? यदि हां, तो हेडर लेआउट का उपयोग कैसे करें और इसमें व्यवहार कैसे जोड़ें?

जवाबों:


429

संस्करण 23.1.0 (पिछले के बजाय ) NavigationViewका उपयोग करने के लिए स्विच करता है और हेडर उन तत्वों में से एक के रूप में जोड़ा जाता है। इसका मतलब यह है कि यह तुरंत कॉल करने के लिए उपलब्ध नहीं है - इससे पहले कि यह संलग्न हो, एक लेआउट पास की आवश्यकता है ।RecyclerViewListViewfindViewById()NavigationView

समर्थन लाइब्रेरी के संस्करण 23.1.1 के लिए, अब आप शीर्ष लेख को देखने का संदर्भ प्राप्त कर सकते हैं getHeaderView():

View headerLayout = navigationView.getHeaderView(0); // 0-index header

यह XML के माध्यम से और कोड के माध्यम से जोड़ा हेडर पर काम करने का लाभ है।

यदि आप संबंधित बग के अनुसार अभी भी 23.1.0 का उपयोग कर रहे हैं , तो आप कोड में हेडर को बढ़ा सकते हैं और findViewById()उस पर उपयोग कर सकते हैं:

View headerLayout = 
    navigationView.inflateHeaderView(R.layout.navigation_header);
panel = headerLayout.findViewById(R.id.viewId);
// panel won't be null

जब तक आप 23.1.1 पर नहीं जाते।


1
शीघ्र सहायता के लिए धन्यवाद, वर्कअराउंड का उपयोग करेगा। समर्पित पद्धति से जाने का रास्ता लगता है, आशा है कि यह भविष्य के रिलीज में होगा।
कुशावत

2
@AlexanderFarber - मैंने जो कोड पोस्ट किया है वह वापस API 7 में काम करता है
ianhanniballake

4
मैं लिबास को डाउनग्रेड करना पसंद करता हूं। बग का परिचय देना Google के हस्ताक्षर की तरह है। यदि नए संस्करण में बग है, तो Google ने उस नए संस्करण
BamsBamx

1
@ GFPF - जब आप कॉल करते हैं inflateHeaderView, तो यह आपके RecyclerViewलिए सही पेरेंट के साथ सही लेयर में आपके लिए व्यू को संलग्न करता है - ऐसा कुछ जिसे आप बाहरी रूप से नहीं कर सकते NavigationView
ianhanniballake

1
@ आरएमके - धन्यवाद, मैंने एक्सएमएल के माध्यम से जोड़े गए हेडर को पुनः प्राप्त करने के लिए 23.1.1 में जोड़े गए नए एपीआई को प्रतिबिंबित करने के लिए उत्तर देने के लिए अपडेट किया है (जैसा कि पिछले वर्कअराउंड ने केवल कोड के माध्यम से जोड़े गए हेडर पर काम किया था)।
इयानहनिबेलके

142

अब डिजाइन समर्थन पुस्तकालय के 23.1.1 रिलीज के साथ, आप उपयोग कर सकते हैं

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

आप navigationView.getHeaderCount()जिस भी कारण से 1 से अधिक हैडर का उपयोग कर सकते हैं ।
फ्रेंकोइस डर्मू

13

इस तरह से मैंने इसका उपयोग किया ButterKnifeऔर यह मेरे लिए काम करता है।

protected static class HeaderViewHolder {

    @BindView(R.id.button)
    Button button;

    HeaderViewHolder(View view) {
        ButterKnife.bind(this, view);
    }
}

और फिर इस तरह इस दृश्य धारक का उपयोग करें:

View header = navigationView.getHeaderView(0);
headerViewHolder = new HeaderViewHolder(header);

2
यह सही है जब आप अपनी गतिविधि से संबंधित संबंधित तर्क निकालना चाहते हैं। महान विचार!
amouly

2
बटरकनीफ के साथ पूरी तरह से काम कर रहा है, धन्यवाद भाई।
राजेश नड्डी

8

मेरे लिए 23.1.0 के साथ यही स्थिति थी, अपडेट के बाद नल पॉइंटर अपवाद बन गया। इस मामले में NavigatorViewजैसा दिखता है:

<android.support.design.widget.NavigationView
  android:id="@+id/navigation_view"
  android:layout_height="match_parent"
  android:layout_width="wrap_content"
  android:layout_gravity="start"
  android:fitsSystemWindows="true"
  app:headerLayout="@layout/nav_header"
  app:menu="@menu/menu_nav"/>

मैंने ianhanniballake द्वारा समाधान प्रस्ताव की कोशिश की, लेकिन यह काम नहीं करता है। फिर मैंने सजा सुनाई:

LayoutInflater.from(getContext()).inflate(R.layout.nav_header, mNavigationView);

उसके बाद, मैं nav_heardलेआउट में परिभाषित सभी विचारों को आईडी द्वारा पा सकता हूं ।


3
NavigationView navigationView = findViewById(R.id.your_nav_view);
View header = navigationView.getHeaderView(0);
TextView textUsername = header.findViewById(R.id.textView);
textUsername.setText("you text here ");

नमस्कार और स्टैक ओवरफ्लो में आपका स्वागत है! कृपया कुछ पाठ जोड़कर बताएं कि यह ऊपर पूछे गए प्रश्न को कैसे हल करता है। धन्यवाद!
जोनाथन

0

कोटलिन में @ फ्रेंकोइस डर्मू कोड जैसा हो

val navigationView : NavigationView = findViewById(R.id.your_nav_view_id);
val header = navigationView.getHeaderView(0)
val textView = header.findViewById<TextView>(R.id.textView)

0

कोटलिन संस्करण।

val navView: NavigationView = findViewById(R.id.nav_view)       
// set User Name
val headerView: View = navView.getHeaderView(0)
headerView.txtUserName.text = "User Name Goes here"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.