PDA

View Full Version : ثابت ماندن مقدار یک integet در هر دو حالت landscape و port



harani
شنبه 23 دی 1391, 00:41 صبح
سلام دوستان

من یک اکتیوتی دارم که شامل یک دکمه (button) و یک textview است .
در کلاس جاوا اکتیوتی یک int تعریف کردم (مثلاً int c) بعد تو onCreate یه مقدار اولیه 1 به آن دادم.
تو رویداد onclick دکمه گفتم که مقدار c رو یک واحد اضافه کن (یعنی همون ++c) بعد مقدار رو در textview نشون بده .
حالا مشکل من اینه که کاربر با فشردن کلید مثلاً عدد 3 رو چاپ کرده زمانی state دستگاه (land یا port) رو تغیر میده دوباره مقدار اولیش (یعنی همون 1) چاپ میشه من چجوری میتونم بگم عدد 3 با تغییر حالت دستگاه تغییر نکنه ؟؟؟؟؟


اگه ممکنه از Preferenceها استفاده نکنین ممنون میشم .


با سپاس از همگی

codelover
شنبه 23 دی 1391, 01:33 صبح
با سلام
به صورت پیش فرض اندروید بعد از تغییرات فیزیکی اکتویتی رو ری استارت می کنه برای اینکه این کار رو نکنه
این تیکه کد رو به تعریف اکتیویتی تو مانیفست اضافه کن


android:configChanges="keyboardHidden|orientation"

harani
شنبه 23 دی 1391, 09:26 صبح
ممنون درست شد زحمت کشیدین . تشکر
ولی یه مشکل کوچیک هست اونم اینکه این کار زمانی درست کار میکنه که من از emulator 2.2 استفاد میکنم تو emulator 4 درست کار نمیکنه چیکارش کنم ؟؟؟؟

codelover
شنبه 23 دی 1391, 11:22 صبح
سلام فرقی نمی کنه

تو همه اندروید ها کار می کنه مگه اینکه از کتابخونه sherlock یا support استفاده کرده باشید که در اون صورت این تغییر صفحه نمایش رو هم باید اضافه کنید



android:configChanges="screenSize|keyboardHidden|orientation"

harani
شنبه 23 دی 1391, 11:41 صبح
لطف کردی دوست من .ممنونم از شما

harani
شنبه 23 دی 1391, 12:11 عصر
android:configChanges="screenSize|keyboardHidden|orientation"
در اینجا keyboardHidden چی کار میکنه ؟؟

farhadfery
شنبه 23 دی 1391, 14:00 عصر
از کتابخونه sherlock یا support
کارشون چیه این دوا کتابخونه

Nevercom
شنبه 23 دی 1391, 14:35 عصر
کارشون چیه این دوا کتابخونه
Support Library که اشاره کردن رو گوگل برای ارائه ی امکاناتی که مثلاً در API 14 معرفی شده برای نسخه های قبل تر (تا API 4) معرفی کرده.
مثلاً با استفاده از این کتابخانه میتونید از Fragment در نسخه ی API 10 استفاده کنید.

sherlock هم احتمالاً منظورشون کتابخانه ی ActionBarSherlock هست که کتابخانه ای برای اضافه کردن ActionBar به برنامه هست که روی همه ی نسخه ها رفتار یکسانی داره (ActionBar اگر اشتباه نکنم از API 13 به بعد معرفی شده، که با این کتابخونه خیلی راحت میتونید روی نسخه های قبلتر هم استفاده کنید)

shahin bahari
شنبه 23 دی 1391, 15:56 عصر
سلام دوستان

من یک اکتیوتی دارم که شامل یک دکمه (button) و یک textview است .
در کلاس جاوا اکتیوتی یک int تعریف کردم (مثلاً int c) بعد تو onCreate یه مقدار اولیه 1 به آن دادم.
تو رویداد onclick دکمه گفتم که مقدار c رو یک واحد اضافه کن (یعنی همون ++c) بعد مقدار رو در textview نشون بده .
حالا مشکل من اینه که کاربر با فشردن کلید مثلاً عدد 3 رو چاپ کرده زمانی state دستگاه (land یا port) رو تغیر میده دوباره مقدار اولیش (یعنی همون 1) چاپ میشه من چجوری میتونم بگم عدد 3 با تغییر حالت دستگاه تغییر نکنه ؟؟؟؟؟


اگه ممکنه از Preferenceها استفاده نکنین ممنون میشم .


با سپاس از همگی

شما میتونید متغیرتون رو خارج از onCreate تعریف کنید و مقدار بدید.با pause شدن اکتیویتی مقدارش حفظ میشه.
یه راه دیگه هم استفاده از Saved Instance State هست. گرچه باطن کارش شبیه Preference هست ولی چون همیشه اول onCreate برای لود کردن وضعیت ویجت ها داره صدا زده میشه با یه Override کردن میتونید بگین پارامتر های بیشتری رو علاوه بر ویجت ها ذخیره کنه.

harani
یک شنبه 24 دی 1391, 12:23 عصر
شما میتونید متغیرتون رو خارج از onCreate تعریف کنید و مقدار بدید.با pause شدن اکتیویتی مقدارش حفظ میشه.
یه راه دیگه هم استفاده از Saved Instance State هست. گرچه باطن کارش شبیه Preference هست ولی چون همیشه اول onCreate برای لود کردن وضعیت ویجت ها داره صدا زده میشه با یه Override کردن میتونید بگین پارامتر های بیشتری رو علاوه بر ویجت ها ذخیره کنه.

من برای land و port دو فولدر مجزا درست کردم آیا این متد (Saved Instance State) بازم کار سازه ؟؟؟؟

harani
یک شنبه 24 دی 1391, 15:57 عصر
من با Preferenceها چجوری میتونم اینکارو کنم ؟؟؟؟؟؟/

shahin bahari
یک شنبه 24 دی 1391, 18:56 عصر
من برای land و port دو فولدر مجزا درست کردم آیا این متد (Saved Instance State) بازم کار سازه ؟؟؟؟orientation صفحه کاری با ذخیره شدن مقادیر نداره. فرضا شما یه seekBar دارید و مقدار 40 رو بهش دادید. حالا چه تو حالت افقی و چه تو حالت عمودی همون 40 نشون داده میشه و ذخیره میشه دیگه!


من با Preferenceها چجوری میتونم اینکارو کنم ؟؟؟؟؟؟/ با این دستور shared preference رو میسازید و مقدار بهش میدید.این اسمس که وارد میکنید برای فایلی هست که میخواید کلید های مورد نیاز رو توش تعریف کنید. هر چند تا که ایجاد کنید همون تعداد فایل براتون تو پوشه دیتا میسازه. اگر فقط یکی دارید نیازی به اسم نیست.
SharedPreferences setting = getSharedPreferences("your_Pref_name", 0);
با این دستور هم مقادیر رو میخونید.ارگومان اول کلید دسترسی هست و ارگومان دوم برای حالتی که تازه shared preference رو ایجاد کردید و مقداری نداره یا به هر دلیل نتونسته بازش کنه.مقدار دیفالت هستش.
int index = setting.getInt("INDEX", 0);
اگر میخواستید یه listener ایجاد کنید که در صورت تغییر کردن مقادیر صدا بشه باید از تابع زیر استفاده کنید.فراموش نکنید توی pause اون رو unregister کنید
setting.registerOnSharedPreferenceChangeListener(O nPrefChange);
برای ذخیره مقادیر هم از کد زیر استفاده کنید. فقط حتما آخرین تابع رو باید صدا کنید تا تاثیر اعمال بشه و اینکه تو برنامه های مالتی ترد حواستون باشه که 2 تا ترد باهم ننویسند که پشتیبانی نمیشه هنوز!
SharedPreferences.Editor edit = setting.edit();
edit.putInt("INDEX", 12);
edit.commit();
من یه بررسی کلی روی این موضوع انجام دادم.حالا دیگه خودتون در صورتیکه نیازه در اول برنامه مقادیر رو لود کنید. گرچه برای منظور شما saved instance state مناسب تر هست.