片段中的Android SharedPreferences

时间:2012-07-31 13:30:22

标签: android android-fragments sharedpreferences

我正在尝试阅读Fragment中的SharedPreferences。我的代码就是我用来获取任何其他Activity的首选项。

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

我收到错误

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

我试图按照这些链接但没有运气Accessing SharedPreferences through static methodsStatic SharedPreferences。谢谢你的任何解决方案。

12 个答案:

答案 0 :(得分:209)

方法getSharedPreferencesContext对象的一种方法,所以只调用Fragment中的getSharedPreferences不起作用......因为它不是一个Context! (Activity是Context的扩展,所以我们可以从中调用getSharedPreferences。)

所以你必须通过

获取你的应用程序
// this = your fragment
SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);

答案 1 :(得分:10)

明确的答案对我不起作用,我必须使用

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

编辑:

或者只是尝试删除this

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

答案 2 :(得分:6)

请注意,我上面的用户提供的答案是正确的。

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

但是,如果在调用onAttach之前尝试获取片段中的任何内容,则getActivity()将返回null。

答案 3 :(得分:1)

您可以在片段的add_action( 'woocommerce_check_cart_items', 'check_total' ); function check_total() { // Only run in the Cart or Checkout pages if( is_cart() || is_checkout() ) { global $woocommerce, $product; $total_quantity = 0; $display_notice = 1; $i = 0; //loop through all cart products foreach ( $woocommerce->cart->cart_contents as $product ) { // See if any product is from the cuvees category or not if ( has_term( 'category-1', 'product_cat', $product['product_id'] )) { $total_quantity += $product['quantity']; } } // Set up the acceptable totals and loop through them so we don't have an ugly if statement below. $acceptable_totals = array(1); 方法中制作SharedPrefences,如下所示:

onAttach

答案 4 :(得分:1)

这对我来说很有把戏

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());

点击此处https://developer.android.com/guide/topics/ui/settings.html#ReadingPrefs

答案 5 :(得分:1)

// html <div class="button"> <div class="white u-on-top"></div> <div class="black"></div> </div> // css .button { width: 100px; height: 100px; margin: 10px; position: relative; display: inline-block; .white { width: 100%; height: 100%; background: #fff; border: 1px solid #000; position: absolute; transition: .5s; } .black { width: 100%; height: 100%; background: #000; border: 1px solid #000; } } .u-on-top { z-index: 1; } .u-at-bottom { z-index: -1; } // javascript var btn = document.querySelector(".button"); var btnState = false; btn.addEventListener("click", () => { var btnw = btn.querySelector(".white"); if (!btnState) { btnw.style.transform = "scale(0)"; btnState = true; } else { btnw.style.transform = "scale(1)"; btnState = false; } }) getActivity()在相同情况下对我没有帮助
也许我做错了
但!我发现了另一个决定
我在片段内创建了一个字段onAttach()
并从onCreateView方法获得了当前上下文
现在我可以使用片段

中的共享首选项
Context thisContext

答案 6 :(得分:0)

要在“片段”中定义首选项: 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)...

答案 7 :(得分: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;
    }
}

您还可以在AndroidViewModel方法中附加一个onCreateView,该方法实现了一种返回应用程序上下文的方法

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
     }
  }

答案 8 :(得分:0)

也许这对几年后的人很有帮助。 在Androidx上,将SharedPreferences()放入片段的新方法是实现到gradle dependencies

implementation "androidx.preference:preference:1.1.1"

然后在片段调用内部

SharedPreferences preferences;
preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(getActivity());

答案 9 :(得分:0)

在片段Kotlin中使用requiredactivity

 val sharedPreferences = requireActivity().getSharedPreferences(loginmasuk.LOGIN_DATA, Context.MODE_PRIVATE)

答案 10 :(得分:0)

获取当前日期和时间或从中获取每个属性:

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;

String timeStamp = new SimpleDateFormat( "dd/MM/yy   HH:mm:ss").format(Calendar.getInstance().getTime());

        String timeStamp1 = new SimpleDateFormat("dd/MM/yy").format(Calendar.getInstance().getTime());
        String timeStamp2 = new SimpleDateFormat("dd").format(Calendar.getInstance().getTime());
        System.out.print(timeStamp1);
        if(timeStamp1.contains("10/03/21")) {
            System.out.print("\ntrue");
        }
        else {
            System.out.print("false");
        }

答案 11 :(得分:0)

给定一个片段,你可以像这样设置你的 SharedPreferences:

val sharedPreferences = activity!!.applicationContext.getSharedPreferences(TAG,   Context.MODE_PRIVATE) // kotlin
SharedPreferences sharedPreferences = getActivity().getApplicationContext().getSharedPreferences(TAG,   Context.MODE_PRIVATE); // java

如果您有任何其他问题,请告诉我。