آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

راهنمایی: رفع مشکل خطای NullPointException هنگام نشان دادن پیش نمایش XML Graphical Layout قبل از اجر ...

لذت برنامه نویسی اندروید  11 سال پیش  11 سال پیش
0 0

با سلام.

امروز یه تجربه جالب داشتم که گفتم با دوستان به اشتراک بگذارم. نمیدونم توی انجمن مشابه اش مطرح شده یا نه. از بس که این حالت ویژه است مونده بودم چه عنوانی براش انتخاب کنم.

قضیه از این قراره: برنامه شما هیچ مشکلی نداره و به خوبی اجرا میشه بدون هیچ خطایی. ولی به قسمت طراحی UI دسترسی ندارید.

مشکل در دیدن پیش نمایش UI طراحی شده در حالت XML Graphical Layout هست. که وقتی که روی فایل XML دابل کلیک میکنید تا محیط UI رو ببینید اکلیپس خطای NullPointException میده و هیچی از محیط UI بهتون نشون نمیده .

در نتیجه هیچ تغییری در محیط UI نمیتونید بدید مگر اینکه خطی که باعث ایجاد این خطا شده رو غیر فعال کنید اون وقت محیط UI بدرستی رندر شده و میتونید روی طراحی UI کار کنید. ولی با این کار برنامه تون دیگه درست کار نخواهد کرد چون اون خط رو که لازم داشتید غیر فعال کردید.

در مورد اختصاصی خودم من یک CustomView برای بازیم طراحی کرده بودم که همه چیز توش بدرستی کار میکرد و برنامه هم بدرستی Run میشد. بعد از اینکه از صحت الگوریتم برنامه مطمئن شدم رفتم سراغ کار با UI که دیدم اصلا محیط طراحی UI دیده نمیشه و اکلیپس خطا میده. از خطی هم خطا میده که دستور کشیدن یک دایره توش بود. من هم همه تنظیمات و مقداردهی اولیه رو توی کلاس G انجام داده بودم در قسمت onCreat.

بعد از کلی این در و اون در زدن جوابم رو توی stackOverfllow پیدا کردم. مشکل این بود که توی دستور رسم دایره چون توی خود کاستوم کلاسم Paint مربوطه مقداردهی نشده بود و برای رسم دایره فراخوانی میشد خطا میداد و کل محیط طراحی UI از کار می افتاد. البته من همه کارها رو از تعریف Paint گرفته تا ایجاد اون و مقداردهی اولیه اون رو، توی کلاس G انجام داده بودم و تعجب میکردم که چرا برنامه به درستی کار میکنه ولی موقع نمایش UI توی رندرش مشکل داره و خطا میگیره. خلاصه باید مقداردهی اولیه Paint توی قسمت constructors کلاس CustomView انجام میدادم. منم یاد فیلم استاد افتادم که در قسمت constructors یه متد initialize رو فراخوانی میکرد. پس توی کلاس G یه متد initialize تعریف کردم و همه مقداردهی اولیه ها رو به اون متد انتقال دادم و در کلاس CustomView هم در قسمت constructors ها بعد از super متد initialize تعریف شده توی کلاس G رو فراخوانی کردم و اینطوری مشکل حل شد. و نمایش UI درست شد. جالبش اینجا بود که مختصات رسم دایره هام نقاط تصادفی بود که در خود کلاس G مقداردهی میشد. و در تابع onDraw موجود در CustomViewاز کلاس G فراخوانی میشد. با هر بار باز کردن XML Layout  نقاط تصادفی محاسبه شده و دایره ها در نقاط تصادفی محاسبه شده نمایش داده میشدند. بدون اینکه برنامه ام رو اجرا کرده باشم.

خیلی قاطی پاتی شد توضیحاتم، نمیدونم تونستم مشکل رو خوب توضیح بدم و همچنین راه حلش رو یا نه. و احیانا در این مورد قبلا تاپیکی وجود داشته یا نه؟ بهرحال خوشحال میشم از نظر دوستان در این مورد مطلع بشم.

 برای این سوال پاسخی وجود ندارد.

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .