在FragmentActivity中读取Fragment中的SharedPreferences数据 [英] Reading SharedPreferences data in Fragment, within FragmentActivity

查看:524
本文介绍了在FragmentActivity中读取Fragment中的SharedPreferences数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将用户在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆