استفاده از عناصر تولبار در همه جای برنامه
سلام دوستان
داخل برنامه ام از تولبار استفاده کرده ام و داخل EnhancedActivity (کلاسی که همه اکتیویتی هایی که می خوام تولبار داخلشون داشته باشم رو از این اکتیویتی اکستندز کرده ام) این کدها رو قرار دادم:
Toolbar myToolbar = (Toolbar) findViewById(R.id.myToolbar);
setSupportActionBar(myToolbar);
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
actionBarView = inflater.inflate(R.layout.action_bar, null);
و داخل لایه تولبارم این کدها رو قرار داده ام:
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:elevation="4dp"
android:background="#CE102C"
android:id="@+id/myToolbar">
قبلا که از اکشن بار استفاده می کردم می تونستم داخل تمامی اکتیویتی هام هر باتن یا تکستی که در اکشن بار داشتم رو به راحتی متد براشون تعریف کنم و ویرایش یا تغییرشون بدم، ولی در اینجا در ActivityMain تکستی که داخل لایه تولبارم دارم رو پیدا نمی کنه و این ارورها رو می گیرم، ممنون می شم راه حلش رو بگید:
java.lang.NullPointerException: Attempt to invoke virtual method
'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
با سپاس
سلام.
برای حل این مشکل چند تا روش وجود داره که مورد سوم می تونه جواب مد نظر شما باشه.
1- روش اول اینه که یه custom view بسازید و بعنوان تولبار،تو همه اکتیویتی ها ازش استفاده کنید. لینک
2- یه فایل xml برای تولبار بسازید و توی هر اکتیویتی ای که خواستین از تولبار استفاده کنید،این فایل رو توی فایل xml اون اکتیویتی include کنید.
3 - روش سوم (و در واقع جواب اصلی مشکل شما) اینه که باید تو کلاس EnhancedActivity متد setContentView رو override کنید و توی این متد کدای مربوط به تولبارو قرار بدین.از این به بعد هر وقت لازم شد که از تولبار استفاده کنید،کافیه اکتیویتی مورد نظر از این کلاس extends بشه...
نکنه خیلی مهم : تو کلاس EnhancedActivity توی متد Oncreate ،باید اون کد setContentView همیشگی که برای ست کردن layout (فایل xml مربوط به اکتیویتی)استفاده میشه رو حذفش کنید.
در نهایت باید بگم که به تولبار هم به چشم یه view نگاه کنید،یه ویو مثه یه Button ! شما باتن رو هر جا که بخواین توی فایل xml اکتیویتی قرار میدین و ازش براحتی استفاده می کنید،تولبار هم دقیقا به همین شکل می تونه مورد استفاده قرار بگیره،منظورم اینه که تولبار یه custom view بیش نیست که شما می تونید هر بلایی سرش بیارید :)
بازم میشه راه حلای دیگه ای هم برای سوالتون ارائه داد،یعنی صرفا خودتونو به این جوابای من محدود نکنید...
ضمنا دلیل اون error شما، همین متد setContentView هستش که تو اکتیویتی extends شده از EnhancedActivity صدا زده میشه!!!!!!! ====> یه کم فک کنید دلیلش رو متوجه میشین.
اگه می خواین از روش سوم استفاده کنید،نکات زیر رو مد نظر داشته باشین.
1- اگه توی همه اکتیویتیا قراره تولبار رفتار ثابتی داشته باشه،کافیه این رفتار و عملکرد رو تماما توی EnhancedActivity و توی همون متد setContentView پیاده سازی کنید.
2- اما اگه می خواین تولبار توی بعضی جاها رفتار متفاوتی از خودش نشون بده،قضیه فرق می کنه.در برخورد با این مسئله راه حلای مختلفی رو میشه ارائه داد که من اینجا فقط یکیشونو مطرح می کنم،بقیه راه حلا با خودتون :)
برای دسترسی به تولبار و عناصر اون، توی اکتیویتی هاتون میتونید به روش زیر عمل کنید :
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
TextView txtToolbar = (TextView) toolbar.findViewById(R.id.txtToolbar);
txtToolbar.setText("toolbar title");
Button btnToolbar = (Button) toolbar.findViewById(R.id.btnToolbar);
btnToolbar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "hello from toolbar", Toast.LENGTH_SHORT).show();
}
});
این که همون روش همیشگیه!! ===> خب آره،همینطوره.چون ما قبلا توی اکتیویتی EnhancedActivity تولبار رو پیاده سازی کردیم،هر اکتیویتی دیگه ای که از این اکتیویتی ارث بری کنه،تولبار و همه عناصر اونو، به ارث میبره و در زمان اجرا این عناصر به ازای اکتیویتی مورد نظر،توی حافظه قرار می گیرن و ما می تونیم بهشون دسترسی داشته باشیم...
توی این مثال فرض بر اینه که ما توی تولبار یه Button و یه TextView داریم و قراره که مقادیر این المان هارو مثلا تو MainActivity تغییر بدیم.
همونطور که گفته شد این تنها راه حل نیست و مطمئنا راه حلای دیگه ای هم وجود داره،مثه لیسنر نوشتن و ...
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .