2012-06-20 2 views
0

В моем приложении мне нужно объявить массив на основе значения, хранящегося пользователем в переменной SharedPreference. Проблема состоит в том, что массив должен быть объявлен в статическом блоке, так как размер массива должен быть объявлен до того, как onCreate() вызывается в моем классе.Android getSharedPreferences в статическом блоке класса

У меня есть ExpandableList в моей деятельности с родительским массивом в качестве дат следующих семи дней.

static int plannerSlotCount=7; 
static public String[] parent = new String[plannerSlotCount]; 
static 
{ 

    Calendar cal = Calendar.getInstance(); 
    String strdate = null; 
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 

    int i; 
    for(i=0;i<plannerSlotCount;i++) 
    { 

     if (cal != null) { 
      strdate = sdf.format(cal.getTime()); 
      } 
      parent[i] = strdate; 
      cal.add(Calendar.HOUR_OF_DAY,24); 
    } 

} 

Если я не объявите массив внутри статического блока, то я получаю сообщение об ошибке при

public View getGroupView(int groupPosition, boolean isExpanded, 
      View convertView, ViewGroup parent) { 
     TextView textView = getGenericView(); 
     textView.setText(getGroup(groupPosition).toString()); 
     return textView; 
    } 

Итак, я должен объявить содержание массива в самом I статического блока Угадай.

Дело в том, что я хочу изменить количество отображаемых дней (в настоящее время оно установлено в 7). Поэтому я решил сохранить номер в переменной SharedPreference и получить доступ к нему для инициализации массива.

Проблема я столкнулся, что

SharedPreferences preferences = getSharedPreferences(Settings.PREF_SETTINGS_FILE_NAME, MODE_PRIVATE); 
    final int slotCounter = preferences.getInt("slotCount", 7); 

дает мне ошибку о том, что

Cannot make a static reference to the non-static method getSharedPreferences(String, int) from the type ContextWrapper 

Есть ли возможный путь для достижения этой цели?

ответ

1

нет, не можете. Поскольку

static { 
} 

Блоки вызываются при первом обращении к классу. Итак, я думаю, до того, как вызвала si. Для доступа к SharedPreference вам нужен context, а context действителен после onCreate. Таким образом, вы не можете получить доступ к SharedPreference в статическом блоке

+0

Я отредактировал мой вопрос. Пожалуйста, проверьте и предложите что угодно, если это возможно. – Swayam

+0

где вы пытаетесь извлечь sharedPreference? – Blackbelt

+0

Я хочу сделать это внутри статического блока. Но это дает ошибку. Код, заданный в моем вопросе, работает, но я хочу включить в него также SharedPreferences. – Swayam

0

Во-первых, я должен сказать, что вы приближаетесь к звукам немного странно. Почему вы хотите объявить массив как static и инициализировать его перед onCreate? Если это действительно требование, я не уверен, что есть решение, так как onCreate() - это первый раз, когда вы получаете доступ к контексту.

Я мог бы предложить вам определить ваш массив как статический, но затем инициализировать его в onCreate (перед тем, как вы его используете). Если этот массив не используется вне вашей деятельности, это должно работать.

Возможно, если вы поделились более подробной информацией (например, почему она должна быть статической и инициирована до начала создания), вы можете получить дополнительную помощь.

+0

Я отредактировал свой вопрос. Пожалуйста, проверьте и предложите что угодно, если это возможно. – Swayam

Смежные вопросы