1

私のアプリケーションでは、SharedPreference変数にユーザーが格納した値に基づいて配列を宣言する必要があります。問題は、クラスでonCreate()が呼び出される前に配列のサイズを宣言する必要があるため、配列を静的ブロックで宣言する必要があることです。

次の7日間の日付として、親配列を含む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;
    }

したがって、静的ブロック自体で配列の内容を宣言する必要があります。

表示する日数を変更したいのです(現在は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

これを達成するための可能な方法はありますか?

4

2 に答える 2

1

いいえ、あなたがすることはできません。以来、

static {
}

ブロックは、クラスを初めて参照するときに呼び出されます。onCreateだから、 siが電話する前だと思います。アクセスSharedPreferenceするには が必要でcontextcontextは の後に有効ですonCreateSharedPreferenceそのため、静的ブロックではアクセスできません

于 2012-06-20T07:36:35.650 に答える
0

まず、あなたのアプローチは少し独特だと言わざるを得ません。配列を静的として宣言し、onCreate の前に初期化する必要があるのはなぜですか? これが本当に必要な場合は、 onCreate() がコンテキストに初めてアクセスするため、解決策があるかどうかわかりません。

配列を静的として定義し、onCreate で初期化することを提案できます (使用する前に)。その配列がアクティビティの外で使用されない限り、これは機能するはずです。

おそらく、より詳細な情報 (onCreate の前に静的で開始する必要がある理由など) を共有していただければ、より多くの支援を受けることができます。

于 2012-06-20T07:28:29.483 に答える