كيف يمكنني إنشاء فئة خصيصًا لغرض استخدام المشاركين؟

StackOverflow https://stackoverflow.com/questions/4024297

سؤال

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

لسوء الحظ ، لا أفهم كيفية القيام بذلك بشكل صحيح.

لن يتم تجميع هذا ، لأنه يقول "GetSharedPreferences غير محدد لنوع AppPrefs."

public class AppPrefs {
 public void foo() {
  SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0);
 } 
}

أخيرًا ، اعتقدت ، ربما نظرًا لأن المشاركين هي واجهة يمكنني القيام بذلك ، ولكن بعد ذلك يجب أن أقوم بتنفيذ الأساليب الموروثة. ليس لدي أي سبب لتجاوز أي من هذه الطرق ، لذلك لا يوجد سبب للقيام بذلك أيضًا.

public class AppPrefs implements SharedPreferences {
 public void foo() {
  SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0);
 } 
}

ما هو المنطقي أن نفعل هنا؟ هل هناك مفهوم أفتقده؟ هل يمكن لأي شخص توضيح وشرح؟ شكرًا.

هل كانت مفيدة؟

المحلول

اجتياز سياقك في Getter الخاص بك.

public class AppPrefs {
 public static void foo(Context ctx) {
  SharedPreferences settings = ctx.getSharedPreferences("MyAppPrefs", 0);
 } 
}

الآن فقط تمر this من فئة النشاط إلى foo()

نصائح أخرى

إذا كانت التفضيلات عالمية للتطبيق ، فيمكنك استخدامها PreferenceManager.getDefaultSharedPreferences(); عندما تحتاج إلى الوصول إلى التفضيلات المشتركة. إذا كانت التفضيلات خاصة بمجموعة فرعية من Activities, ، لديك بعض الخيارات المختلفة:

يمكنك جعل ملف Activity الفئة الفرعية التي تمتدها جميع الفئات التي تحتاج إلى الوصول إلى التفضيلات:

public abstract class AbstractFooActivity extends Activity
{
    protected SharedPreferences getFooPreferences()
    {
        return getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
    }

    private static final String PREFS_NAME = "FooPrefs";
}

public class AFooActivity extends AbstractFooActivity
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getFooPreferences();
    }
}

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

public final class FooConstants
{
    public static final String FOO_PREFS_NAME = "FooPrefs";
}

public class AFooActivity extends Activity
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getSharedPreferences(FOO_PREFS_NAME, MODE_PRIVATE);
    }
}

public class AFooService extends Service
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getSharedPreferences(FOO_PREFS_NAME, MODE_PRIVATE);
    }
}

الطريقة الثانية أقل تغليفًا قليلاً ، ولكنها تضع قيودًا أقل على التسلسل الهرمي للكائن ، وهو مفاضلة جيدة في رأيي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top