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

استفاده از عناصر تولبار در همه جای برنامه

SaeiD-as  9 سال پیش  9 سال پیش
0 0

سلام دوستان

داخل برنامه ام از تولبار استفاده کرده ام و داخل 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

با سپاس

0 0
-> up (9 سال پیش)
0 0
لطفا راهنمایی کنید، سپاس (9 سال پیش)
0 0
امان از این اسپم! لطفا راهنمایی کنید (9 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
sami  9 سال پیش
+1 0

سلام.

برای حل این مشکل چند تا روش وجود داره که مورد سوم می تونه جواب مد نظر شما باشه.

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 تغییر بدیم.

همونطور که گفته شد این تنها راه حل نیست و مطمئنا راه حلای دیگه ای هم وجود داره،مثه لیسنر نوشتن و ...

 

+1 0
سلام، سپاس از نظر خوب و کاملتون :))) کلاس EnhancedActivity من setContentView براش تعریف نکرده ام چون دلیل وجود داشتن این کلاس اینه که بقیه کلاسام ازش extends بشن و ویو خاصی نیاز نداره. دقیقا منم از همین روش اولی که ارائه دادید تا بحال استفاده می کردم ولی بهتر دیدم که از تولبار استفاده کنم. (9 سال پیش)
+1 0
خواهش می کنم.راستش منظورم از راه حل اول این بود که با استفاده از تولبار یه custom view بسازید.دلیل نوشتن اون نکته هم اینه که بجز شما ممکنه بقیه دوستان هم، این جوابارو بخونن و احیانا حواسشون به این موضوع نباشه :) خب نتیجه اینکه شما همونطور که خودتون تصمیم گرفتین باید از تولبار استفاده کنید و همون روش سوم بیشتر به کارتون میاد. (9 سال پیش)
+1 0
سپاس از لطف شما، دمتون گررررررررم ;) مشکلی که در روش سوم شما دارم اینه که من داخل ActivityMain و داخل اکشن باری که قبلا داشتم امتیاز کاربرا رو نشون میدادم ولی الآن در صورتی که داخل متد setContentView که فرمودید تمام کدهای تولبار رو قرار بدم داخل کلاس ActivityMain دسترسی بهش ندارم که بتونم مقدارشو تغییر بدم! میتونم یه متد بنویسم و با استفاده از اون این کار رو انجام بدم ولی فکر میکنم راه حل بهتری براش باشه که اینقد کثیف کد نزنم!! (9 سال پیش)
+1 0
پاسخ سوال رو مجددا ویرایش کردم و جواب سوالی که توی کامنت قبلی پرسیدین رو براتون،نوشتم.تو کلاس ActivityMain به تولبار دسترسی دارین و میشه تغییرات لازمو روی تولبار اعمال کرد. (9 سال پیش)
+1 0
اگه ممکنه تیتر سوالتون رو عوض کنید و یه عنوان که نشان دهنده نوع مشکلتون هست رو انتخاب کنید تا اگه بقیه دوستان هم به همچین مشکلی برخوردن،بتونن با جستجو توی انجمن به جواب برسن و دوباره همین سوال رو مطرح نکنن. (9 سال پیش)
+1 0
سپاس از جواب کاملتون :) تیتر سوال تغییر کرد (9 سال پیش)

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