💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ احمدرضا عبداللهی
navigation view
محسن موحد حل شده توسط محسن موحد

وقت بخیر

1- برای اینکه به view در navigation_header دسترسی پیدا کنیم باید به طریقه زیر عمل کنیم:

View headerView=navigationView.getHeaderView(0);
        TextView textView=headerView.findViewById(R.id.tv_header_name);

و نمیتونیم مستقیم به textview با view.findViewById دسترسی باشیم و force close میده میخواستم بدون علت اینکه نمیشه این کار رو انجام داد چی هست؟

2- من به جای اینکه از xml هدر navigation view رو ست کنم از متد addHeaderView استفاده کردم. به شکل زیر:

View headerView =LayoutInflater.from(getContext()).inflate(R.layout.view_navigation_header,null);
        navigationView.addHeaderView(headerView);

و به درستی کار کرد، سوالی که دارم اینه که آیا کدی که نوشتم برای این کار صحیحه؟

3- چطور navigation view ایجاد کنیم که مانند تلگرام فقط تا بخشی که navigation view باز شده روی رنگ status bar تاثیر بزاره و نه کل status بار؟

سلام،


1- علت اینکه نمی‌توانیم مستقیم به TextView با view.findViewById دسترسی داشته باشیم این است که navigationView یک LinearLayout است و TextView‌ها به عنوان فرزند این LinearLayout قرار می‌گیرند. وقتی از متد findViewById استفاده می‌کنیم، Android به دنبال یک View با شناسه R.id.tv_header_name در LinearLayout اصلی می‌گردد. از آنجایی که هیچ View با این شناسه در LinearLayout اصلی وجود ندارد، Android با خطای NullPointerException مواجه می‌شود.

برای حل این مشکل، باید از متد getHeaderView() استفاده کنیم. این متد یک View را بازمی گرداند که حاوی تمام View‌های موجود در Header navigationView است. سپس می‌توانیم از متد findViewById() برای دسترسی به TextView مورد نظر استفاده کنیم.

 

2- بله، کدی که نوشتید درست است.

3- برای اینکه Navigation View فقط روی بخشی از status bar تاثیر بگذارد و نه کل آن، می‌توانید از ترکیب fitsSystemWindows و android:clipToPadding در XML استفاده کنید. 

بهترین پاسخ
محسن موحد ۲۳ دی ۱۴۰۲، ۲۱:۴۶