我正在尝试阅读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 methods和 Static SharedPreferences。谢谢你的任何解决方案。
答案 0 :(得分:209)
方法getSharedPreferences
是Context
对象的一种方法,所以只调用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
如果您有任何其他问题,请告诉我。