নেভিগেশনভিউ শিরোনাম বিন্যাস পান / সন্ধান করুন


171

আমার নেভিগেশনভিউতে সক্রিয় বোতামগুলির সাথে আইডি 'ভিউআইডি' সহ আমার একটি শিরোনাম লেআউট রয়েছে। এই বোতামগুলি সেটআপ করতে, আমি ক্রিয়াকলাপের মধ্যে নিম্নলিখিতটি করি onPostCreate:

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

নতুন সংস্করণ অ্যান্ড্রয়েড সমর্থন লাইব্রেরি, ( ২৩.১.০ ) এর সাথে ভিউটি পাওয়া যাবে না, এটি বাতিল হয়ে যায়। পূর্ববর্তী সংস্করণগুলির সাথে এটি ভাল কাজ করেছে। এটি কি কোনও বাগ বা আমি এই বৈশিষ্ট্যটি ভুল ব্যবহার করছি? যদি তা হয় তবে কিভাবে শিরোনাম লেআউট অ্যাক্সেস করবেন এবং এর সাথে আচরণ যুক্ত করবেন?

উত্তর:


429

সংস্করণ 23.1.0 NavigationViewএকটি RecyclerView(আগের চেয়ে বরং ListView) ব্যবহার করে স্যুইচ করে এবং শিরোনামকে সেই উপাদানগুলির মধ্যে একটি হিসাবে যুক্ত করা হয়। এর অর্থ এটি কল করার জন্য তাত্ক্ষণিকভাবে উপলব্ধ নয় findViewById()- এটির সাথে সংযুক্ত হওয়ার আগে একটি লেআউট পাস প্রয়োজন NavigationView

সমর্থন লাইব্রেরির 23.1.1 সংস্করণের জন্য আপনি এখন ব্যবহার করে শিরোনাম দর্শনটির জন্য একটি রেফারেন্স পেতে পারেন getHeaderView():

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

এটি এক্সএমএল এবং কোডের মাধ্যমে যুক্ত শিরোনামগুলিতে কাজ করার সুবিধা রয়েছে।

আপনি যদি এখনও সম্পর্কিত ত্রুটি অনুযায়ী 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
@ আলেকজান্ডার ফারবার - আমি পোস্ট করা কোডটি API 7-এ ফিরে কাজ করে
ianhanniballake

4
আমি libs ডাউনগ্রেড করতে পছন্দ করি। একটি বাগ প্রবর্তন করা গুগলের স্বাক্ষরের মতো। নতুন সংস্করণে যদি ত্রুটি থাকে তবে গুগল সেই নতুন সংস্করণটি প্রকাশ করেছে
বামসব্যাক্স

1
@ জিএফপিএফ - আপনি কল করার সময় এটি সঠিক পিতামাতার সাথে inflateHeaderViewসঠিক স্তরে আপনার জন্য দৃষ্টিভঙ্গি সংযুক্ত করে RecyclerView- এমন কোনও কিছু যা আপনি বাহ্যিকভাবে করতে পারবেন না NavigationView
ianhanniballake

1
@ আরএমকে - ধন্যবাদ, আমি এক্সএমএলের মাধ্যমে সংযুক্ত শিরোনামগুলি পুনরুদ্ধার করতে 23.1.1-এ যুক্ত হওয়া নতুন এপিআইগুলি প্রতিফলিত করার জবাব দিতে আপডেট করেছি (পূর্ববর্তী কাজটি কেবল কোডের মাধ্যমে সংযুক্ত শিরোনামগুলিতে কাজ করেছিল)।
ianhanniballake

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
আপনি যখন আপনার ক্রিয়াকলাপ থেকে সম্পর্কিত যুক্তি দেখুন সরাতে চান তখন এটি নিখুঁত। ভালো বুদ্ধি!
amlyly

2
বাটারনিফের সাথে এটি পুরোপুরি কাজ করছে, ধন্যবাদ ভাই।
রাজেশ নাদি 26'18

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"/>

আইয়ানহানিবলাকে সমাধান প্রস্তাব দেওয়ার চেষ্টা করেছি কিন্তু তা কার্যকর হয় না। তারপর আমি বাক্যটি ফুলে উঠলাম:

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"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.