フラグメントのAndroidSharedPreferences


90

Fragment内のSharedPreferencesを読み込もうとしています。私のコードは、他のアクティビティで設定を取得するために使用するものです。

     SharedPreferences preferences = getSharedPreferences("pref", 0);

エラーが発生します

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

私はこれらのリンクをたどろうとしましたが、運が悪かったのですが、静的メソッド静的SharedPreferencesを介してSharedPreferencesにアクセスしました。解決策をありがとうございます。

回答:


254

メソッドgetSharedPreferencesContextオブジェクトのメソッドであるため、からgetSharedPreferencesを呼び出すだけFragmentでは機能しません...コンテキストではないためです!(アクティビティはContextの拡張であるため、そこからgetSharedPreferencesを呼び出すことができます)。

したがって、アプリケーションのコンテキストを取得する必要があります

// this = your fragment
SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);

1
getSharedPreferences( "pref"、0); zero(0)は、どのプライベート/パブリックを意味しますか?
カイラス2013年

@Kailas正解、モード、つまりWORLD_READABLEect。 developer.android.com/reference/android/content/...、INT)
Jug6ernaut

5
0は、MODE_PRIVATE(または、フラグメントなど、Contextの拡張ではないクラス内で使用される場合はContext.MODE_PRIVATE)に類似しています。これは、問題のアプリのみが設定にアクセスできることを意味します。WORLD_READABLEまたはWORLD_WRITEABLEは、セキュリティの脅威は言うまでもなく、API 17以降で非推奨になっているため、使用しないでください。
Ankit Aggarwal 2014

1
このthisキーワードは実行するときに必要this.getActivity().getShared..ですか?
Subby 2014年

2
@Subbyいいえ、明示的に「これ」だけを呼び出す必要はありません。あいまいなメソッド呼び出しが嫌いなので、個人的な好みからそれを行いました。「これ」が必要なのは、匿名の内部クラス/インターフェースにあるスコープ外にいるときに、親の非静的オブジェクトにアクセスしようとしているときだけです。
Jug6ernaut 2014年

13

マークされた答えは私にはうまくいきませんでした、私は使用しなければなりませんでした

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());

編集:

または、this:を削除してみてください

SharedPreferences prefs = getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);

8
デフォルトの共有設定にアクセスしているため、マークされた回答は機能しませんでした。より良い設計は、設定を共有オブジェクトとしてではなく、別のプライベートスペースに保存することです。これが、ここでの質問と回答です。
zeeshan 2014年

8

注意点として、私の上のユーザーによって提供されたこの回答は正しいです。

SharedPreferences preferences = this.getActivity().getSharedPreferences("pref",0);

ただし、onAttachが呼び出される前にフラグメント内の何かを取得しようとすると、getActivity()はnullを返します。


3

次のようにフラグメントのSharedPrefencesinonAttachメソッドを作成できます。

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    SharedPreferences preferences = context.getSharedPreferences("pref", 0);
}


1

getActivity()そしてonAttach()、同じ状況で私を助け
なかったかもしれませんが、私は何か間違っ
たことをしたかもしれませんが!フラグメント内に
フィールドを作成し、 メソッドonCreateViewから現在のコンテキストを取得した別の決定を見つけました。これでContext thisContext、フラグメント から共有設定を操作できます。

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {   
...   
thisContext = container.getContext();   
...   
}

1

フラグメントでプリファレンスを定義するには: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR",Context.MODE_PRIVATE); editor.putString("credi_credito",cre); editor.commit();

別のアクティビティを呼び出すか、設定データをフラグメント化するには: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR", Context.MODE_PRIVATE); credit=pref.getString("credi_credito",""); if(credit.isNotEmpty)...


0

内からコンテキストを取得することが可能です Fragment

ただやる

public class YourFragment extends Fragment {

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        final View root = inflater.inflate(R.layout.yout_fragment_layout, container, false);
        // get context here
        Context context = getContext();
        // do as you please with the context


        // if you decide to go with second option
        SomeViewModel someViewModel = ViewModelProviders.of(this).get(SomeViewModel.class);
        Context context = homeViewModel.getContext();
        // do as you please with the context
        return root;
    }
}

また、添付のことAndroidViewModelonCreateView方法その実装アプリケーションコンテキストを返すメソッド

public class SomeViewModel extends AndroidViewModel {

    private MutableLiveData<ArrayList<String>> someMutableData;
    Context context;

    public SomeViewModel(Application application) {
        super(application);
        context = getApplication().getApplicationContext();
        someMutableData = new MutableLiveData<>();
        .
        .
     }

     public Context getContext() {
         return context
     }
  }

0

多分これは数年後に誰かに役立つでしょう。Androidxで、SharedPreferences()フラグメント内に入る新しい方法は、に実装することです。gradle dependencies

implementation "androidx.preference:preference:1.1.1"

次に、フラグメント呼び出し内

SharedPreferences preferences;
preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(getActivity());
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.