PDA

View Full Version : سوال درباره ذخیره تنظیمات و خواندن از صفحه دیگر



rasaaam
شنبه 20 مهر 1392, 16:43 عصر
سلام
میخوام با استفاده از SharedPreferences توی یه صفحه یه مقدار رو ذخیره کنم و توی یه صفحه دیگه اون مقدار رو بخونم باید چیکار کنم؟
اولش توی صفحه اول تنظیمات رو ذخیره میکنم و وقتی توی صفحه دوم میخوام با همون اسم SharedPreferences اون متن رو بخونم بهم متن خالی میده

rubiks.kde
شنبه 20 مهر 1392, 17:20 عصر
کدهاتون رو قرار بدید.

rasaaam
شنبه 20 مهر 1392, 21:42 عصر
این برای صفحه ذخیره هست:
Button fav=(Button) findViewById(R.id.fav);

Button zakhire_btn=(Button) findViewById(R.id.zakhire_btn);
SharedPreferences zakhire;
zakhire=getPreferences(MODE_PRIVATE);
final Editor ed=zakhire.edit();


fav.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
startActivity(new Intent(MainActivity.this, fav.class));

}
});

zakhire_btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
String txt="2";
ed.putString("Name_a", txt);
ed.commit();

}
});



این برای صفحه دوم هست که میخوام مقدار ذخیره شده رو بخونم:


SharedPreferences zakhire;
zakhire = getPreferences(MODE_PRIVATE);
String txt_a = zakhire.getString("Name_a", "");
TextView tv=(TextView) findViewById(R.id.tv);
tv.setText(txt_a);


ولی هیچی نمایش نمیده و مقدار خالی میده به متن

rubiks.kde
شنبه 20 مهر 1392, 23:57 عصر
اشتباهتون اینه که موقع ساخت فایل تنظیمات بهش اسم نمیدید. زمانی که شما به این صورت
zakhire = getPreferences(MODE_PRIVATE);
شی رو میسازید شی تنها برای اون اکتیویتی ایجاد میشه.به همیین خاطر اکتیوتی دوم نمیتونه به اون تنظیمات دست پیدا کنه
بهتره به این تابع آرگومان اول رو بدید.

مثل این :
public static final String GAME_PREFERENCES_LOGIN = "Login";

// String from the text input (can be from anywhere)
String login = inputLogin.getText().toString();

// then to add a value in InputCalss "SAVE",
SharedPreferences example = getSharedPreferences(GAME_PREFERENCES_LOGIN, 0);
Editor editor = example.edit();
editor.putString("value", login);
editor.commit();

در واقع به فایلت باید یه اسم واحد بدی که بقیه هم اون رو بشناسن

یا از این تابع استفاده کنی:

PreferenceManager.getDefaultSharedPreferences(this );

rasaaam
یک شنبه 21 مهر 1392, 21:31 عصر
ممنون از جوابتون.من الان توی صفحه اول همینی که شما گفتید رو انجام دادم و به صورت زیر هست ولی وقتی میخوام توی صفحه دوم بخونمش باید چه کدی رو وارد کنم؟کد صفحه دوم رو هم میزارم ولی ارور میده
این کد صفحه اول:
public class MainActivity extends Activity {
/** Called when the activity is first created. */


public static final String GAME_PREFERENCES_LOGIN = "zakhire";


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final TextView tv=(TextView) findViewById(R.id.tv);


final String login=tv.getText().toString();
Button fav=(Button) findViewById(R.id.fav);

Button aa=(Button) findViewById(R.id.aa);

fav.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
startActivity(new Intent(MainActivity.this, fav.class));

}
});

aa.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
tv.setText("1");
SharedPreferences example = getSharedPreferences(GAME_PREFERENCES_LOGIN, 0);
Editor editor = example.edit();
editor.putString("value", login);

}
});



این هم صفحه دوم که ارور میده و تنظیمات رو نمیشناسه:
example = getPreferences(zakhire, 0);
که نه example رو میشناسه و نه zakhire دیگه نمیدونم کجاشو گاف دادم:لبخند:

rubiks.kde
دوشنبه 22 مهر 1392, 00:16 صبح
:خجالت:
معلومه نمیشناسه چون باید از اول این ها رو هم تعریف کنی. این دو شی که گفتید نمیشناسه رو توی صفحه دوم هم تعریف کنید.(منظورم example و zakhire هست ، مثل صفحه اول تعریف کن و ازش استفاده کن)
منظورم از نشناختن فایل تنظیمات این نیست که اشیا شناخته نمیشن.منظورم خود فایل بود.(زمانی که شما یه Preferences ایجاد میکنید درواقع دارید یه فایل xml درست میکنید که تنظیمات رو توش می نویسید)

rasaaam
دوشنبه 22 مهر 1392, 06:47 صبح
ایندفه دیگه ارور نمیده ولی بازم متن خالی میمونه:لبخند:
public class fav extends Activity {


public static final String GAME_PREFERENCES_LOGIN = "zakhire";

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.fav);

SharedPreferences example = getSharedPreferences(GAME_PREFERENCES_LOGIN, 0);





TextView tv=(TextView) findViewById(R.id.tv);

String savetxt = example.getString("value", "");
tv.setText(savetxt);
}
}

rubiks.kde
دوشنبه 22 مهر 1392, 10:06 صبح
سلام این کد رو توی اکتیویتی اولت بزن :

SharedPreferences example = getSharedPreferences("setting", 0);
Editor editor = example.edit();
editor.putString("value", login);
editor.commit();

واین رو توی اکتیویتی دوم :

SharedPreferences example = getSharedPreferences("setting", 0);
TextView tv=(TextView) findViewById(R.id.tv);

String savetxt = example.getString("value", "");
tv.setText(savetxt);

rasaaam
دوشنبه 22 مهر 1392, 12:48 عصر
اینی که گفتید شد ولی مثله اینکه نمیشه با این روش لیست فاووریت ساخت درسته؟
از این متد میخواستم برای ایجاد لیست علاقمندی استفاده کنم ولی الان هم که به نتیجه رسیدم میبینم نمیشه ازش استفاده کنم.باید از چه متدی استفاده کنم؟!:افسرده:
خواستم با این متد توی اون صفحه ای که میخوام لایک بشه با زدن دکمه یه مقداری مثلا یک به یکی از تکست های فایل ذخیره داده بشه و وقتی دیسلایک کردم اون مقدار بشه مثلا صفر.بعد توی صفحه لایک اون تکست هائی که مقدارشون یک هست رو بهم نشون بده.ولی باید اول یه مقداری به اون تکست ها داده بشه مثلا همشون صفر باشن که بشه ادیتشون کرد.باید چیکار کنم که از اول مثلا مقدار صفر برای همه تکستهای فایل ذخیره قرار داده بشه و بعد کاربر فقط با زدن دکمه ویرایشش کنه؟

rubiks.kde
دوشنبه 22 مهر 1392, 15:34 عصر
متوجه منظورتون نشدم اگه میشه واضح تر توضیح بدید.

rasaaam
دوشنبه 22 مهر 1392, 16:22 عصر
ببینید فرض کنید برای اولین بار میخواید از برنامه استفاده کنید شما.من میخوام توی فایل تنظیمات الان یه سری داده با مقدار 0 قرار بدم و وقتی شما میخواید استفاده کنید از برنامه با کلیک روی دکمه مربوط به هر صفحه ، مقدار مربوط به اون صفحه توی فایل تنظیمات 1 بشه.بعد توی لیست علاقمندی ها مقادیری که به 1 تبدیل شدن رو براش یه دکمه ایجاد کنه (که از قبل با کلیک بر روی دکمه اون صفحه مقدارش از 0 به 1 تبدیل شده)
من میخوام از قبل مثلا a , b , c , d رو 0 قرار بدم.صفحه اول مثلا a دوم b سوم c و چهارم d باشه .وقتی از صفحه اول کلیک کنید a بشه 1 یا اگه توی صفحه دوم کلیک کنید b بشه 1. یعنی این صفحات علامت گذاری بشن که توی لیست علاقمندی ها نشون داده بشه:لبخند:

rubiks.kde
دوشنبه 22 مهر 1392, 16:37 عصر
خوب تمام این چیزی که گفتید به همون صورت قابل انجام هست حالا مشکل چیه؟
همین چیزیهایی رو که گفتید رو پیاده کنید.

rasaaam
دوشنبه 22 مهر 1392, 16:50 عصر
خب چجوری باید الان مقدار بدم به فایل ذخیره؟:لبخند:منظورم از الان این هست که وقتی میخوام فایل رو اکسپورت کنم اون فایل از قبل اون پارامترها رو توی خودش ذخیره داشته باشه و نیازی نباشه بعد از اجرا ایجاد بشه

rubiks.kde
دوشنبه 22 مهر 1392, 21:15 عصر
شما الان میخواید مقدار اولیه 0 باشه درسته؟؟؟؟

اگه این طوره خوب مقدار دیفالت رو صفر بزارید تا توی بار اول که بهش مقدار ندادید صفر برگردونه
مثلا توی این مثال
String savetxt = example.getString("value", "0");
مقدار اولیه صفره (پارامتر دوم تابع getstring ) که در صورت مقدار نداشتن value صفر برمیگرده.

توصیه میکنم ابتدا یکم در مورد SharedPreferences مطالعه داشته باشید.

rasaaam
دوشنبه 22 مهر 1392, 21:25 عصر
ببخشید اگر اذیتتون کردم:لبخند:
ببینید من میدونم اینها رو خب؟منظورم برای بار اول هست!ببینید الان من این مقادیر رو گذاشتم صفر خب؟!دفه بعد که نرم افزار باز میشه خب دوباره این مقادیر صفر میشه در صورتیکه من میخوام لیست علاقمندی با بستن برنامه از بین نره!
اگه همین مقدار دهی ای که شما فرمودید رو توی ران صفحه اول بزارم درسته که در حین اجرای برنامه و وقتی که برنامه در حال اجرا هست و روی دکمه ها کلیک میشه مقادیر عوض بشه ولی وقتی برنامه بسته بشه و دوباره ران بشه خب دوباره همه مقادیری که توی صفحه اول بهش مقدار دادم دوباره صفر میشن نه؟:لبخند:خب میخوام صفر نشن و تغییراتی که توی برنامه ایجاد شده باقی بمونه!

rubiks.kde
دوشنبه 22 مهر 1392, 23:31 عصر
به نظر خودت این منطق ایی؟
پس چرا شما از SharedPreferences داری استفاده میکنی؟
معلومه که شما تغییرات رو دخیره میکنید و اون ها همیشه هستن تا خودتون دستی پاک نکنید .

بهتره باز برید در مورد SharedPreferences خوب مطالعه کنید و چندین مثال هم اجرا کنید تا کاملا با موضع آشنا بشید.

بگو خب.:چشمک:

rasaaam
سه شنبه 23 مهر 1392, 06:46 صبح
منظور من پاک کردن تغییرات نیست:لبخند::لبخند:منظورم ایجاد کردنشونه.ببینید من کدهای زیر رو توی صفحه اول گذاشتم:
editor.putString("aa", "0");
editor.putString("ab", "0");
editor.putString("ac", "0");
editor.putString("ad", "0");
editor.putString("ae", "0");
editor.putString("af", "0");
editor.putString("ag", "0");
editor.putString("ah", "0");
editor.putString("ai", "0");

درسته که وقتی برنامه اجرا میشه مقادیر رو از اول برام صفر قرار میده و میتونم تغییرشون بدم ولی وقتی برنامه رو میبندم و دوباره اجرا میکنم همه ذخیره هام میشه دوغ:لبخند:دوباره با این کد خب میشن 0 دیگه مگه غیر اینه؟!:لبخند:ایناها دارم الان اجرا میکنم که میگم دیگه خب؟:لبخند:

newMethed
سه شنبه 23 مهر 1392, 07:59 صبح
این آقا که داره به شما جواب میده خیلی صبوره ، بخاطر خودت میگم اگه اینطوری میخوای برنامه نویسی کنه بهتره بیخیال بشی ، خب من از شما بدتر بودم ولی بیش از سوال کردن میخوندم و جستجو میکردم ، الان شما اگه کمی جاوا بلد باشی و به توصیه دوستمون در مورد مطالعه بیشتر توجه کنی ، هزار تا راه برای سوال آخریت وجود داره که حل شه ، یکیش اینکه یه متغیر boolean درست میکنی و با یه شرط ساده تنها بار اول میشه اون کار رو انجام داد.

abbasalim
سه شنبه 23 مهر 1392, 08:36 صبح
یا با دیتابیس خیلی راحت تر می تونید یک table واسه علاقه مندی هات درست کنی و هرچی که کاربر مارک دار کرد و بفرستی داخلش
این روش شما خیلی عجیبه من هم اوایل میخواستم این کاررو بکنم ولی خیلی وقت گیره + شما هنوز SharedPreferences رو تا اون حد که لازمه نشناختین

rasaaam
سه شنبه 23 مهر 1392, 22:41 عصر
ممنون از همگی
مثله اینکه بهتر بود همون چیزی که بهش رسیده بودم رو اجرا میکردم تا اینکه مزاحم وقت شما دوستان بشم. اینکه یه دکمه ایجاد میکنم و مقدار دهی رو توی اون میزارم که وقتی کلیک شد مقادیر توی فایل ذخیره بشن و هم اینکه یه مقدار برگشتی هم برای خود دکمه صادر بشه که دفه بعدی که برنامه بالا اومد دیگه اون دکمه نشون داده نشه که مقادیری که کاربر ذخیره میکنه رو تغییر بده.

22 سالمه ولی تا امروز فکر نمیکردم ندونستن انقدر عیبه و لطف کردن انقدر منتش سنگینه
متشکر از همگی بابت راهنمائیهاشون

rubiks.kde
چهارشنبه 24 مهر 1392, 01:40 صبح
منظور من پاک کردن تغییرات نیست:لبخند::لبخند:منظورم ایجاد کردنشونه.ببینید من کدهای زیر رو توی صفحه اول گذاشتم:
editor.putString("aa", "0");
editor.putString("ab", "0");
editor.putString("ac", "0");
editor.putString("ad", "0");
editor.putString("ae", "0");
editor.putString("af", "0");
editor.putString("ag", "0");
editor.putString("ah", "0");
editor.putString("ai", "0");

درسته که وقتی برنامه اجرا میشه مقادیر رو از اول برام صفر قرار میده و میتونم تغییرشون بدم ولی وقتی برنامه رو میبندم و دوباره اجرا میکنم همه ذخیره هام میشه دوغ:لبخند:دوباره با این کد خب میشن 0 دیگه مگه غیر اینه؟!:لبخند:ایناها دارم الان اجرا میکنم که میگم دیگه خب؟:لبخند:

ببینید شما الان دارید به این صورت تنظیمات رو ذخیره میکنید.
به فرض من الان تمام روند لیست مورد علاقه رو برای شما پیاده میکنم.توی اینجا ما 5 تا موضوع داریم که هرکدومشون کنارشون یه ستاره دارن برای افزودن به لیست.اگه توی لسیت مورد علاقه باشن ستاره تو پر والا خالی.
1-برنامه برای بار اول اجرا میشه و من میخوام وضعیت این موضوعات رو مشخص کنم.در نتیجه میام کد زیر رو میزنم براش : (ستاره ها در حالت عادی خالی هستن)

SharedPreferences example = getSharedPreferences("setting", 0);
If(example.getString(“star_1”,”0”).equal( 1”))
ستاره شماره 1 را روشن میکنم
Else if(example.getString(“star_2”,”0”).equal( 1”))
ستاره شماره 2 را روشن میکنم
Else if(example.getString(“star_3”,”0”).equal( 1”))
ستاره شماره 3 را روشن میکنم
Else if(example.getString(“star_4”,”0”).equal( 1”))
ستاره شماره 4 را روشن میکنم
Else if(example.getString(“star_5”,”0”).equal( 1”))
ستاره شماره 5 را روشن میکنم


حالا چون بار اوله و هیچ مقداری براشون ثبت نشده تمام موارد توی تابع getString مقدار پیش فرض که همون صفر هست رو برمیگردونن و هیچ کدوم از ستاره ها روشن نمیشن و در نتیجه چیزی توی لیست مورد علاقه وجود ندارد.
حالا فرض کنید من چند مورد رو وارد لیست مورد علاقه میکنم به صورت زیر:

SharedPreferences example = getSharedPreferences("setting", 0);
Editor editor = example.edit();
editor.putString("star_3", “1”);
editor.putString("star_4", “1”);
editor.commit();


حالا بعد از اجرا این کد اگه برنامه بسته بشه و دوباره باز بشه و اون کد بالا اجرا بشه دیگه برای مقادیر star_3 و star_4 مقدار پیش فرض برنمیگرده و مقدار یک برمیگرده و چون شرط درسته ستاره مربوط به این موارد توپر میشه و نشون میده که وارد لیست مورد علاقه شده.

rubiks.kde
چهارشنبه 24 مهر 1392, 02:05 صبح
22 سالمه ولی تا امروز فکر نمیکردم ندونستن انقدر عیبه و لطف کردن انقدر منتش سنگینه

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


از همه دوستان هم میخوام که اگه میبینید شخصی مبتدی داره سوال میپرسه ، اگه حتی دوست ندارید کمک کنید حداقل کاری نکنید که شخص از سوال
پرسیدن پشیمون بشه (ندونستن عیب نیست ، نپرسیدن عیبه) و یادتون نره که همه ما هم یه روز مبتدی بودیم و از روی پرس و جو به این جایی که هستیم رسیدیم.:چشمک:

rasaaam
چهارشنبه 24 مهر 1392, 08:47 صبح
دوست عزیز ما برای جواب دادن به کسی توی این انجمن از کسی پولی یا چیزی دریافت نمیکنیم و تمام کارها به صورت اختیاری و از روی
علاقس ، پس کسی حق نداره شخصی رو به دلیل ندونسن تحقیر کنه یا منت بزاره به خاطر سوء تفاهم به وجود اومده شرمندم.


از همه دوستان هم میخوام که اگه میبینید شخصی مبتدی داره سوال میپرسه ، اگه حتی دوست ندارید کمک کنید حداقل کاری نکنید که شخص از سوال
پرسیدن پشیمون بشه (ندونستن عیب نیست ، نپرسیدن عیبه) و یادتون نره که همه ما هم یه روز مبتدی بودیم و از روی پرس و جو به این جایی که هستیم رسیدیم.:چشمک:

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


در مورد این لیست من اشتباهی که کردم این بود که فکر میکردم اگر توی فایل مقدار نداده باشی برنامه ارور میده که الان که گفتید رفتم امتحان کردم دیدم به قول شما اصلا احتیاجی به تعریف اولیه نیست و اگر تعریف نشده باشه مقداری بر نمیگردونه.
باز هم از لطف و راهنمائی شما تشکر میکنم