حفظ قيمة Shared Preferences بأبسط الطرق للاندرويد

بسم الله الرحمن الرحيم

– كيفية حفظ قيمة واستخدامها في كامل التطبيق, حتى الرجوع إليها في حال أغلق التطبيق.

درس جداً مهم, وقد طلب الكثير من الأصدقاء بالشرح أكثر عن Shared Preferences ونحاول قدر الإمكان تبسيط المعلومات لتسهيلها على المبتدئين في هذا المجال. اي الشرح للمبتدئين وهناك معلومات لم تذكر 🙂

سوف نحاول شرح أكثر من طريقة وكلها تدور حول آلية العمل نفسها. كما إنني سبق وقلت إن البرمجة مثل مادة الرياضيات يوجد الكثير من الطرق للوصول إلى نتيجة واحدة.

بالنسبة لـ Shared Preferences هي عبارة او فيك تعتبرها مبدئياً انو ملف لتحفظ فيه اعدادات المستخدم, حجم الخط, الصوت, اللون, و و إلخ.

عموماً لنستخدم مثال بسيط وشائع لدى الجميع, مثال ما هو اسمك ؟ .. ونستخدم الإسم في اكتفتي أخر, كما نجعله معروض بداخل الفراغ النصي حتى بعد تشغيل التطبيق من جديد.

وفي دروس لاحقا سوف نتعلم كيفية حفظ قيم مختلفة, في هذا الدرس سوف نركز على حفظ نص – سترنج \ string –

في البداية قم بإنشاء مشروع فارغ, وأجعل داخله 2 اكتفتي, الأولى يوجد فيها فراغ حقل نصي EditText وزر لحفظ القيمة وزر للانتقال للاكتفتي الاخرى. الاكتفتي الثانية اجعل فيها نص TextView لعرض تلك القيمة التي يكتبها المستخدم.

نقوم بعمل شكل مبدئي, بالشكل التالي :

layout-2015-04-30-075556

والكود له – activity_main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_margin="20dp"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">


        <LinearLayout
            android:orientation="vertical"
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="match_parent">

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="حفظ"
                android:id="@+id/save" />
        </LinearLayout>

        <LinearLayout
            android:orientation="vertical"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:textSize="30sp"
                android:text="ما هو اسمك ؟" />

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="textPersonName"
                android:layout_gravity="right"
                android:gravity="right"
                android:ems="10"
                android:id="@+id/editText_yourName" />

        </LinearLayout>

    </LinearLayout>

    <Button
        android:id="@+id/Enter"
        android:layout_gravity="center"
        android:text="دخول التطبيق"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

ما عليك فعله كمبتدئ فقط ان تلاحظ المعرفات التي قمنا باستخدامها في الكود, لتعرف لاحقاً من أين اتت عند استخدامها.

 أما الليوت الثانية, فهي بسيطة عبارة عن نص واحد.

second_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:text="مرحباً بك يا"
        android:layout_gravity="center_horizontal" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:textColor="#f00"
        android:id="@+id/receiver_name"
        android:layout_gravity="center_horizontal" />
</LinearLayout>

خرجنا بحاصل سابق من كلا اللياوتات : by ID

save : الزر الذي سوف يقوم بحفظ القيمة المدخلة, مع العلم الحاجة له ليست كبيرة تستطيع عند وضع زر الانتقال يحفظ القيمة الموجودة داخل الفراغ او الحقل النصي.

editText_yourName : وهو الحقل النصي الذي تقوم بإدخال فيه القيمة ليقوم بحفظها في ملفات التطبيق. والتي تستطيع الرجوع إليها في أي اكتفتي داخل التطبيق.

Enter : الزر الذي سوف يدخلنا إلى التطبيق, أو في مثالنا هذا للانتقال بنا الى الاكتفتي الثانية.

receiver_name : النص الموجود في اللياوت الثانية والذي سوف تصبح القيمة المدخلة سابقاً مكانه.

الان هكذا نحن انتهينا من القسم الظاهر للمستخدم. جزئية xml ولنبدء بالجزء البرمجي ..

في البداية نقوم بتعريف ما قمنا بإضافته, من نصوص وأزرار داخل كل اكتفتي. ونقوم بربطها بالمعرفات التي سبق ووضعناها.

-----------------
MainActivity.java
--
EditText Name;
Button Enter,Save;
-----------------
Second_Activity.java
--
TextView Rname;
-----------------

الطريقة واضحة السابقة, تعريف المتغيرات داخل الكلاس وخارج الدوال. ومن ثم ربط كل واحد منها بالمعرفات الخاصة بها.

-----------------
MainActivity.java
--
Name = (EditText)findViewById(R.id.editText_yourName);
        Enter = (Button)findViewById(R.id.Enter);
        Save = (Button)findViewById(R.id.save);
-----------------
Second_Activity.java
--
Rname = (TextView)findViewById(R.id.receiver_name);
-----------------

أرجوا الانتباه على أن الربط يكون داخل الدالة الرئيسية للتطبيق وهي دالة الاون كريت.
تمام هكذا انتهينا من الربط .. ما بين المتغيرات التي ضفناها وبين الكائنات في التصميم (اللياوت).

الان لنبدء ببرمجة الاكتفتي الاول الرئيسية :
نعطي أوامر الضغط على الزر الأول وذلك بدالة الاون كليك للزر Save, نعطي له الأمر بالشكل التالي :

SharedPreferences test_name = getSharedPreferences("NAME", 0);
               SharedPreferences.Editor editor = test_name.edit();
               editor.putString("name", Name.getText().toString());
                editor.commit();

وهذا الكود هو أهم ما نتعلمه في درس اليوم لمن هم في المراحل المتوسطة, نحن هنا قلنا له أتي لنا بـ ملف الذاكرة او الجزئية المحفوظة في التطبيق والتي أسمها (test_name) عند القيمة التي اسمها (NAME) والمود الخاص بها 0.
كتابة الـ getSharedPreferences بالصيغة العامة التالية :

getSharedPreferences (String name, int mode)

قلنا له سابقاً هكذا ولكن لا مانع إن كانت هذه القيم غير موجودة اصلاً .. فنحن قلنا له أسفل في الكود,

test_name.edit();

والمعنى عدل على الذي طلبنا, وإن لم يكن موجود قم بإنشائه.
بصراحة الموضوع في هذا الأمر طويل وأحاول اختصاره لكن لا أريد أحد أن يستاء منه فهو جداً جداً جداً مهم. وأحاول التبسيط قدر الإمكان. 

عموماً اغلب القيم في استخدامها أول مرة أضع انت ما شاءت ولكن متغيرات تعرفها وتحفظها جيداً لتعرف ما انت حافظ بداخلها, من ثم تقم باستدعائها في مكان آخر لاستخدامها. وفي حال تم الغاء تثبيت التطبيق سوف تحذف ولكن في حال الخروج من التطبيق والرجوع اليه تبقى موجودة. وهي خاصية تستخدم كثيراً في حفظ مثلاً قيمة المجموع لديك , اخر مرحلة قم بالوصول اليها, معلوماتك الشخصية و و و إلخ .. لها استخدامات كثيرة. وتقوم كذلك بحفظ اعدادات التطبيق للمستخدم.

بالنسبة لـ mode افتراضياً او الغالب له قيمة 0 أو MODE_PRIVATE و كذلك تستطيع استخدام قيمتين وهي MODE_WORLD_READABLE و MODE_WORLD_WRITEABLE وهي واضحة نوعاً ما أحدها لقراءة هذه الاعدادات او الملف الصغير الحجم, والاخر للتعديل عليه. ولكن أفضل لك استخدام قيمة الصفر كمبتدئين 🙂

كما ذكرنا في الكود السابق :

editor.putString(“name”, Name.getText().toString());

قلنا له التعديل الذي نريده قم بحفظ متغير بإسم name وهو الاسم الذي سوف نستخدمه لطلب القيمة التي بداخل Name والذي هو الحقل النصي المستخدم لكتابة اسم المستخدم.

والآن لنستخدم هذه القيمة بعد حفظها, اي بعد الضغط على زر الحفظ, نستخدمها في كلا الاكتفتي .. في الاكتفتي الاول نجعلها بداخل الحقل النصي .. أي في حال المستخدم كتب اي معلومة وضغط على زر الحفظ .. وقام باغلاق التطبيق والرجوع اليه يجدها مكتوبة في مكانها.
و أما استخدامها الآخر في الاكتفتي الثانية بنفس الطريقة فقط لتظهر القيمة التي استخدمها.

أنا استفدت من هذه العملية في تطبيق تحكم بالمصروفات, لإدخال المستخدم راتبه وفي حال الرجوع اليه يجده وكذلك استخدم راتبه في الحسابات.

إذا الآن بخارج دالة الاون كليك وبداخل دالة الاون كريت, أقوم بإستخدام القيمة التي قمت بحفظها بداخل زر الحفظ, وذلك كما ذكرنا سابقاً لاستخدمها.
نستخدم الكود بالشكل التالي :

SharedPreferences test_name = getSharedPreferences(“NAME”, 0);
Name.setText(test_name.getString(“name”, “”).toString());

قلنا له أتي لنا بـ test_name ولم نطلب منه التعديل كما فعلنا سابقاً .. فقط أتي لنا به , ومن ثم قلنا للحقل النصي Name قم بوضع نص داخلك وهو النص الذي قمنا بحفظه سابقاً داخل الـ test_name وبداخل القيمة name.

بعدها برمجنا زر الانتر بطريقة المعروفة للانتقال بنا من الاكتفتي الاول الى الثانية.

Intent i = new Intent(MainActivity.this,Second_Activity.class);
startActivity(i);

هكذا انتهينا من الاكتفتي الاولى والان لننتقل الى الاكتفتي الثانية :
كما الكود السابق ..

SharedPreferences test_name = getSharedPreferences("NAME", 0);
        Rname.setText(test_name.getString("name", "").toString());

فقط قلنا له أتي لنا بالملف المحفوظ test_name و أما عن النص Rname قم باستبداله بالنص المحفوظ سابقاً داخل قيمة name.

وبهكذا نكون قد أنتهينا من الدرس, فهو جداً سهل وبسيط ولكن مهم كثيراً .. ومع الشرح بدا انه طويل .. لذلك سوف أدرج لكم هنا الاكتفتي الاولى والثانية هنا لتشاهدوا ان العملية جداً بسيطة.

MainActivity.java

package com.andrody.testandrody;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class MainActivity extends ActionBarActivity {
    // المتغيرات
    EditText Name;
    Button Enter, Save;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // ربط المتغيرات بالمعرفات
        Name = (EditText) findViewById(R.id.editText_yourName);
        Enter = (Button) findViewById(R.id.Enter);
        Save = (Button) findViewById(R.id.save);
        // بعد النقر على زر حفظ save
        Save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences test_name = getSharedPreferences("NAME", 0);
                SharedPreferences.Editor editor = test_name.edit();
                editor.putString("name", Name.getText().toString());
                editor.commit();
            }
        });
        // طلب برمجي بحفظ القيمة التي قمنا بكتابتها داخل الحقل النصي في حال الرجوع مرة اخرى للتطبيق
        SharedPreferences test_name = getSharedPreferences("NAME", 0);
        Name.setText(test_name.getString("name", "").toString());
        // برمجة زر الانتقال انتر للانتقال بنا الى الاكتفتي الثانية
        Enter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Second_Activity.class);
                startActivity(i);
            }
        });


    }
}

Second_Activity.java

package com.andrody.testandrody;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;

/**
 * Created by Abboudi_Aliwi on 30/04/2015.
 */
public class Second_Activity extends ActionBarActivity {
    TextView Rname;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Rname = (TextView) findViewById(R.id.receiver_name);
        SharedPreferences test_name = getSharedPreferences("NAME", 0);
        Rname.setText(test_name.getString("name", "").toString());


    }
}

معاينة فيديو بعد الانتهاء من الشرح :

يوجد الكثير من الطرق كما ذكرت للوصول إلى نتيجة واحدة, ومن هذه الطرق :

بنفس الشرح السابق فقط استخدام التالي للحفظ :

SharedPreferences test_name = context.getSharedPreferences(“NAME“, MODE_PRIVATE);
Editor edit = test_name.edit();
edit.clear();
edit.putString(“name“, Name.getText().toString().trim());
edit.commit();

و لاستخدام القيمة :

SharedPreferences test_name = context.getSharedPreferences(“NAME“, MODE_PRIVATE);
String YOUR_NAME = test_name.getString(“name“, “”);

وبعدها تستخدم السترنج YOUR_NAME حيث تريد.

تستطيع حفظ أكثر من قيمة بداخل NAME بنفس الطريقة التي حفظها فيها القيمة name

إن شاء الله أكون قد شرحت المطلوب, وإن شاء الله هذا المجال واسع وسوف يكون في دروس أخرى لحفظ قيم مختلفة, والمعذرة كل المعذرة إن أخطأت فهذا الذي أستطعت فهمه من موقع مطورين اندرويد ومن مصادر اخرى.
وانتظرونا في المزيد والمزيد من الدروس .. والسلام عليكم 🙂

About عبدالقادر عليوي

مواليد 1996 , سوري الجنسية, طالب علم, لدي شغوف كبير في تعلم كل ما يتعلق بالانترنت من تطوير وحماية, أحب القراءة كثيراً .. هدفي نشر العلم بشتى أنواعه ومجالاته, متابع من الدرجة الأولى لـ الدكتور ابراهيم الفقي و الشيخ أحمد ديدات - رحمهم الله -.

Check Also

التقنيات التي نستطيع برمجة تطبيقات والعاب الاندرويد بها

هل أنت محتار من أين تريد البدأ في مجال برمجة التطبيقات للهواتف الذكية أو الألعاب عالية الاداء ؟ تعرف في هذا المقال عن اللغات والتقنيات واختر منها ما يناسبك لدخول هذا المجال

تعلم برمجة تطبيق اندرويد لمدونتك البلوجر (1)

هل لديك تدوينة أو موقع إخباري ؟ أو معرض يعرض الكثير من البيانات من وسائط ؟ وبحاجة لعرضها في تطبيق اندرويد ؟ هذه فرصتك من هنا وللمبتدئين تعلم برمجة تطبيق لمدونتك

عرض صورة في التطبيق من فايربيس

بسم الله الرحمن الرحيم اليوم سيكون شرحنا عن كيفية عرض صورة  في التطبيق من قاعدة …

2 comments

  1. Mohamed Amine

    جزاك لله خيرا

  2. اسامة الصرمي

    كيف احفظ هذة القيمة

    tpv1 = (ThumbUpView) findViewById(R.id.tpv1);

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

    tpv1.setOnThumbUp(new ThumbUpView.OnThumbUp() {

    @Override
    public void like(boolean like) {
    if (like) {

    tv1.setText(String.valueOf(Integer.valueOf(tv1.getText().toString()) + 1));

    } else {
    tv1.setText(String.valueOf(Integer.valueOf(tv1.getText().toString()) – 1));

    }

    }
    });
    }
    public void like(View v)
    {
    tpv1.Like();

    }

    public void unlike(View v)
    {
    tpv1.UnLike();

ضع بصمتك بتعليق يعبر عن امتنانك

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.