بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

ذخیره تغییرات بعد از خروج از برنامه

مدیریت گفتگو
gadolf 10 سال پیش
آخرین تغییر: 10 سال پیش

این برنامه شامل تعداد زیادی از linearLayout ه و من فقط دوتاشو این جا نشون دادم. من دو تا عکس قلب تو پوشه drawable دارم. یکی خاکستری و یکی قرمز. میخوام وقتی کاربر قلب رو انتخاب میکنه و قرمز میشه یا بالعکس، این تغییرات حتی در صورت خروج از برنامه هم ذخیره بمونه. من در اینجا از listView استفاده نکردم و به همین خاطر برای هر قلب، یک ID جداگانه تعریف کردم.

نظرات

alfredo 10 سال پیش
من هم دقیقا همچین سوالی دارم. ممنون میشم اگه کسی جواب بده. کلا پروسه ذخیره سازی اطلاعات تو برنامه با چه دستوراتی انجام میشه ؟
gadolf 10 سال پیش
من الان دارم درس 01-17 آموزش ها رو نگاه میکنم. به نظر تو این درس توضیح داده شده. جواب گرفتم، میگم.
MeY3am 10 سال پیش
اگر ذخیره داده و اطلاعات بعد از خروج از برنامه رو میخواهید از SharedPrefernces استفاده کنید که در آموزش های استاد هم موجوده، اگر میخواهید علاقه مندی ها بسازید از دیتابیس استفاده کنید خیلی بهتره !

پاسخ‌ها 4

gadolf 10 سال پیش

من میخوام تو متد پایین از SharedPrefernces استفاده کنم ولی هنوز نتونستم.  SharedPrefernces  تو کدوم قسمت از آموزش ها تدریس شده؟ با استفاده از علاقه مندی ها میتونم از همین عکس های قلب استفاده کنم؟

نظرات

MeY3am 10 سال پیش
تو بخش 17 استاد کامل درموردش توضیح دادن، برای علاقه مندی ها یا همون قلب که میگی از دیتابیس استفاده کن، درضمن مشکل شما اینه که بعد از اینکه چند بخش ابتدایی آموزش هارو دیدی میخوای سریع یه کتاب بنویسی که از غافله عقب نمونی، نخیر برادر من این روش اصلا برات صحیح نیست اول کامل آموزش هارو ببین بعد اقدام به ساخت برنامه بنما !
gadolf 10 سال پیش
این لینک همین مشکل من رو مطرح کرده که مثل اینکه درست کار کنه. من سه ماهه همین طوری دارم آموزش ها رو میبینم و پیشرفت نمیکنم. گفتم یه هدف رو شروع کنم و موردی به آموزش ها نگاه کنم، نمیخوام یه کتاب بسازم البته از جنبه هایی شبیه به کتاب هست. باز ممنونم از راهنمایی تون.
alfredo 10 سال پیش
منم وقتی آموزش ها رو نگاه میکنم و میرم جلو، حس میکنم هیچی یاد نمیگیرم، انگار دارم فیلم سینمایی میبینم. ولی وقتی برای ساخت یک برنامه تقلا می کنم و انواع کدها رو امتحان میکنم و تلاش میکنم، میتونم خیلی بهتر یاد بگیرم.
میرحسین 10 سال پیش

کلاس AppPrefrances برای ذخیره و گرفتن اطلاعات ذخیره شده

 public class AppPrefrances {
    protected static AppPrefrances INSTANCE;
    private static SharedPreferences prefs;
    public static AppPrefrances getInstance(Context context) {
        if (INSTANCE == null) {
            INSTANCE = new AppPrefrances();
            prefs = PreferenceManager.getDefaultSharedPreferences(context);
        }
        return INSTANCE;
    }
    public void setClicked(String a,String b) {
        prefs.edit().putString(a, b).commit();
    }

    public String getClicked(String a) {
        // 0 is the default value
        return prefs.getString(a, "0");
    }
}

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

 public void heart(int heartId,final String save){
    final ImageView heart = (ImageView) findViewById (heartId);
if (AppPrefrances.getInstance(getApplicationContext()).getClicked(save).equals("1")){ heart.setImageResource(R.drawable.heart_fill);
} else { heart.setImageResource(R.drawable.heart_empty);
}
heart.setOnClickListener(new View.onClickListener(){ @Override public void onClick(View V){ if (AppPrefrances.getInstance(getApplicationContext()).getClicked(save).equals("1")){ heart.setImageResource(R.drawable.heart_empty);
AppPrefrances.getInstance(getApplicationContext()).setClicked(save,"0"); } else { heart.setImageResource(R.drawable.heart_fill);
AppPrefrances.getInstance(getApplicationContext()).setClicked(save,"1"); }
}
});
}

 موفق باشید.

نظرات

gadolf 10 سال پیش

واقعاً از لطفت ممنونم که با توجه به کدهای من پاسخ دادید، ولی کد شما دو تا ایراد داره که برنامه اجرا نمیشه:

در کلاس AppPrefrances این خطا رو نشون میده:

و متدهای قابل استفاده این متدها هستند:

 

و اما در متد heart با توجه به متدی که در کلاس AppPrefrances تعریف شده باید هر دو مقدار String باشند. اعداد 0 و 1 رو تبدیل به String کنم؟

یک نکته دیگه اینکه چرا فقط از "LateralView" استفاده شده؟ هر چند درست کار نمیکنه چون شما اشراف کامل به برنامه من ندارید باز یه سرنخی به من دادید و واقعاً ممنونم.

نظرات

میرحسین 10 سال پیش
خواهش میکنم دوست من راستی برای اولی ()apply از نسخه 9 به بعد استفاده میشود که شما جایگزینش از ()commit استفاده نمایید و در مورد دومین ایراد من یاد رفته بود داخل کوتیشن اعداد رو قرار دهم و مشکل آن هم اصلاح شد ممنونم از اینکه گفتید
میرحسین 10 سال پیش
چون من فقط اطلاعات مربوط به LateralView این را میخواستم نحوه ی ذخیرش رو به شما نشان دهم چنانچه میخواهید چیز دیگری هم بکار ببرید کافیست به جای یک پارامتر ورودی دو پارامتر در متود heart بگیرید و دومین پارامتر رو از نوع String قرار داده و به جای "LateralView" نام متغیر گرفته شده رو قرار دهید
gadolf 10 سال پیش
ممنون، این دستورات نیازی به ساخت فایل xml برای ذخیره داده ها نداره؟ منظورم اینه خودش تو یه فایلی ذخیره میکنه؟ من تازه بحث Prefrances ها رو شروع کردم و از کم و کیف کار اطلاع کافی ندارم.
میرحسین 10 سال پیش
بله نیازی ندارد به فایل xml و خودش ذخیره میکند و فقط در هنگامی که Clear Data برنامه زده شود پاک میشود
gadolf 10 سال پیش
LateralView هم برام سوال بود. یه بار این کار رو کردم و نتونستم جواب بگیرم. ولی خب من بلد نیستم.
gadolf 10 سال پیش
AppPrefrances باید از نوع Prefrances باشه، درسته؟
gadolf 10 سال پیش
AppPrefrances باید از نوع Prefrances باشه، درسته؟
gadolf 10 سال پیش
یا همین متدی که نوشتید رو تو کلاس بدون چیز اضافی کپی کنم؟
میرحسین 10 سال پیش
الآن با این روشی که گفتم امتحان کنید اگر مشکلتان رفع نشد مطرح نمایید
میرحسین 10 سال پیش
من در یک کلاس مجزا بکارش بردم
میرحسین 10 سال پیش
AppPrefrances یک اسمی هست برای کلاسم شما هر اسم دیگری هم میتونید براش بذارید و نوع چیزی نیست من فقط در هرجا که بخوام صداش میکنم و کارم رو انجام میدم
gadolf 10 سال پیش
View.onClickListener در مال من مشکل داره، من به جاش onClickListener نوشتم. یه مورد دیگه هم heart.setImageResources که من heart.setImageResource نوشتم.
میرحسین 10 سال پیش
مورد اولی به خاطر تفاوت eclipse و android studio میباشد بابت دوم هم ممنون
gadolf 10 سال پیش
عالیه، درست کار میکنه. فقط یه چیز میخوام که عالی بشه. شما برنامه رو طوری نوشتید که وقتی رو TextView کلیک بشه مقدارش رو بخونه و بررسی کنه. TextView بخش اعظم مساحت linearLayout رو پوشانده. الان درست و عالی کار میکنه، فقط میخوام بدونم من برای هر linearLayout یک ID تعریف کنم میتونم با ID بررسی کنم؟
gadolf 10 سال پیش
برای تشکر یه 10 20 بار تأیید زدم برات. دو روز تمام الّاف این بودم. ممنون.
میرحسین 10 سال پیش
ممنونم دوست من فقط منظورت رو از id نفهمیدم شما میتونید به جای id از نام برای ذخیره سازی استفاده کنید تا بعدا متوجه بشید که این کد مثلا LateralView رو ذخیره میکنه و نشان میده با وارد کردن دو پارامتر در متود heart
gadolf 10 سال پیش
منظورم از ID اینه که برای هر linearLayout ی که دارم Assign ID یا Edit ID رو انتخاب کنم تا با این وسیله باهاش ارتباط برقرار کنم. شاید به خاطر اینکه از محیط دیگه ای به غیر اکلیپس استفاده میکنید گزینه ها متفاوت باشه.
میرحسین 10 سال پیش
در اینصورت اگه از لیست ویو استفاده نمایید بهتر است چون با id شما به linear layout دسترسی پیدا میکنید نه به imageview درون آن
gadolf 10 سال پیش
اول از listView استفاده کردم. خواستم دو تا layout رو تو یک Activity به دلایلی استفاده کنم. کمی گیج شدم. گفتم بذارم واسه بعد که اطلاعاتم بهتر شد از listView استفاده کنم. فعلا همین روش خیلی عالی ه و خواسته منو برآورده میکنه. اگر میشه به این لینک برید . شما روش بهتری سراغ دارید؟
gadolf 10 سال پیش

همین متد با استفاده از ID تعریف شده در هر listView (نیازی به تغییر کلاس AppPrefrances تعریف شده در بالا نیست):

 public void heart(int heartId, int listViewId) {
        final String NameId = listViewId + "";
        final ImageView heart = (ImageView) findViewById(heartId);

        if (AppPrefrances.getInstance(getApplicationContext()).getClicked(NameId).equals("1")) {
            heart.setImageResource(R.drawable.heart_fill);
        } else {
            heart.setImageResource(R.drawable.heart_empty);
        }

        heart.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View V) {

                if (AppPrefrances.getInstance(getApplicationContext()).getClicked(NameId).equals("1")) {
                    heart.setImageResource(R.drawable.heart_empty);
                    AppPrefrances.getInstance(getApplicationContext()).setClicked(NameId, "0");
                } else {
                    heart.setImageResource(R.drawable.heart_fill);
                    AppPrefrances.getInstance(getApplicationContext()).setClicked(NameId, "1");
                }

            }
        });
    }

نظرات


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