在FragmentActivity中读取Fragment中的SharedPreferences数据 [英] Reading SharedPreferences data in Fragment, within FragmentActivity
问题描述
我正在尝试将用户在Settings.java
下方的登录屏幕上输入的名称保存为sharedPreference
,该名称将由TestFragment2.java
读取,该名称由另一个FragmentActivity SampleTabsDefault.java
调用>
Settings.java
private void savePrefs(String key, boolean value) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putBoolean(key, value);
edit.commit();
}
private void savePrefs(String key, String value) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putString(key, value);
edit.commit();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
savePrefs("CHECKBOX", cb.isChecked());
if (cb.isChecked())
savePrefs("NAME", et.getText().toString());
Intent myIntent = new Intent("com.test.SAMPLETABSDEFAULT");
startActivity(myIntent);
finish();
}
}
Intent myIntent = new Intent("com.test.SAMPLETABSDEFAULT");startActivity(myIntent);
加载SampleTabsDefault.java
就好了,它调用的所有片段也是如此.
class NavTabs extends FragmentPagerAdapter {
public NavTabs(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch(position)
{
case 0:
TestFragment fragment = new TestFragment();
return fragment;
case 1:
TestFragment2 fragment2 = new TestFragment2();
return fragment2;
}
TestFragment3 fragment3 = new TestFragment3();
return fragment3;
}
我可以向左滚动并到达片段TestFragment2.java,如下所示....但是它没有读到,或者我在TestFragment2.java
内部应用了sharedPreferences
进行了非常简单的移动
TestFragment2.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View myView = inflater.inflate(R.layout.fragment_2, container, false);
text = (TextView)myView.findViewById(R.id.textView1);
et = (TextView)myView.findViewById(R.id.textView3);
cb = (CheckBox) myView.findViewById(R.id.checkBox1);
loadPrefs();
return myView;
}
private void loadPrefs() {
SharedPreferences sp = getActivity().getSharedPreferences("CHECKBOX", 0);
boolean cbValue = sp.getBoolean("CHECKBOX", false);
String name = sp.getString("NAME", "YourName");
if(cbValue){
cb.setChecked(true);
}else{
cb.setChecked(false);
}
et.setText(name);
}
在TestFragment2.java
中,我试图通过'setText();阅读并应用于textView
sharedPreferences与我在Settings.java
上所做的相同. Settings.java
中的代码可以正常工作,String name = sp.getString("NAME", "YourName");
可以加载sharedPreference
并显示上次运行应用程序时用户输入的名称,但是在TestFragmnet2.java
中,同一代码块从String name = sp.getString("NAME", "YourName");
返回YourName >
非常感谢您的帮助,谢谢!
我认为您正在呼叫
SharedPreferences sp = getActivity().getSharedPreferences("CHECKBOX", 0);
在TestFragment2的loadPrefs()
方法中不正确
从 docs 第一个参数(名称)是:
所需的首选项文件.如果没有使用此名称的首选项文件 存在,它将在您检索编辑器时创建 (SharedPreferences.edit()),然后提交更改(Editor.commit()).
因此,似乎您正在TestFragment2中创建一个名为"CHECKBOX"的新偏好设置文件.
可以将loadPrefs()
更改为Settings.java中发现的相同用法,以便您可以调用以前使用的相同首选项,如下所示:
private void loadPrefs() {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity())
boolean cbValue = sp.getBoolean("CHECKBOX", false);
String name = sp.getString("NAME", "YourName");
if(cbValue){
cb.setChecked(true);
}else{
cb.setChecked(false);
}
et.setText(name);
}
I'm trying to save the name the user enters on the log in screen below Settings.java
to a sharedPreference
, which will be read by TestFragment2.java
, which is called from another FragmentActivity, SampleTabsDefault.java
Settings.java
private void savePrefs(String key, boolean value) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putBoolean(key, value);
edit.commit();
}
private void savePrefs(String key, String value) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putString(key, value);
edit.commit();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
savePrefs("CHECKBOX", cb.isChecked());
if (cb.isChecked())
savePrefs("NAME", et.getText().toString());
Intent myIntent = new Intent("com.test.SAMPLETABSDEFAULT");
startActivity(myIntent);
finish();
}
}
Intent myIntent = new Intent("com.test.SAMPLETABSDEFAULT");startActivity(myIntent);
loads the SampleTabsDefault.java
just fine, and so do all the fragments it calls.
class NavTabs extends FragmentPagerAdapter {
public NavTabs(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch(position)
{
case 0:
TestFragment fragment = new TestFragment();
return fragment;
case 1:
TestFragment2 fragment2 = new TestFragment2();
return fragment2;
}
TestFragment3 fragment3 = new TestFragment3();
return fragment3;
}
I can scroll left right and get to fragment TestFragment2.java seen below....however its not reading, or Im making a very bonehead move applying the sharedPreferences
inside TestFragment2.java
TestFragment2.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View myView = inflater.inflate(R.layout.fragment_2, container, false);
text = (TextView)myView.findViewById(R.id.textView1);
et = (TextView)myView.findViewById(R.id.textView3);
cb = (CheckBox) myView.findViewById(R.id.checkBox1);
loadPrefs();
return myView;
}
private void loadPrefs() {
SharedPreferences sp = getActivity().getSharedPreferences("CHECKBOX", 0);
boolean cbValue = sp.getBoolean("CHECKBOX", false);
String name = sp.getString("NAME", "YourName");
if(cbValue){
cb.setChecked(true);
}else{
cb.setChecked(false);
}
et.setText(name);
}
In TestFragment2.java
Im trying to read and apply to textView
via 'setText();' the sharedPreferences the same way I do on Settings.java
. The code in Settings.java
does work, String name = sp.getString("NAME", "YourName");
it loads the sharedPreference
and displays the name entered by the user last time application was ran , but in TestFragmnet2.java
the same block of code returns YourName from String name = sp.getString("NAME", "YourName");
Any help is greatly appreciated, thanks!!
I think that you are calling
SharedPreferences sp = getActivity().getSharedPreferences("CHECKBOX", 0);
incorrectly in TestFragment2's loadPrefs()
,method
From the docs the first param (name) is:
Desired preferences file. If a preferences file by this name does not exist, it will be created when you retrieve an editor (SharedPreferences.edit()) and then commit changes (Editor.commit()).
So it looks like you are creating a new prefernces file called "CHECKBOX" in TestFragment2.
maybe change loadPrefs()
to the same usage found in Settings.java so you can call up the same preferences used earlier like so:
private void loadPrefs() {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity())
boolean cbValue = sp.getBoolean("CHECKBOX", false);
String name = sp.getString("NAME", "YourName");
if(cbValue){
cb.setChecked(true);
}else{
cb.setChecked(false);
}
et.setText(name);
}
这篇关于在FragmentActivity中读取Fragment中的SharedPreferences数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!