Android:无法读取共享偏好

时间:2016-09-23 20:11:51

标签: android sharedpreferences preferences shared

所以我有一个小问题。我有一种简单的感觉,我必须要忽视它。在我的第二个片段中,我正在写共享偏好一定数量的键和应用()后记。在我将数据写入共享偏好后,我用主片段(片段#1)替换当前片段(片段#2)。加载此片段后,我调用readPreferences(),它应该读取存储的数据,并将数据写入我在主片段上的各种文本视图。这不会发生。我不确定此时是否由于写入错误或读取错误。你的帮助一如既往,赞赏。感谢。

第二片段

package lucaclock.moticlock;

import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

public class secondFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private TimePicker timePicker;
private int hour = 0;
private int min  = 0;
private String mParam1;
private String mParam2;
public SharedPreferences sharedPreferences;
public SharedPreferences.Editor prefEditor;
public static final String alarmPreferences = "alarmPreferences";
public static final String alarmTimeKey = "alarmTimeKey";
public static final String alarmNameKey = "alarmNameKey";
public static final String alarmOccuranceKey = "alarmOccuranceKey";
public static final String alarmVolumeKey = "alarmVolumeKey";
public static final String alarmSnoozeKey = "alarmSnoozeKey";
public static final String alarmVisibleKey = "alarmVisibleKey";

public int snoozeTime;

public secondFragment() {
    // Required empty public constructor
}
// TODO: Rename and change types and number of parameters
public static secondFragment newInstance(String param1, String param2) {
    secondFragment fragment = new secondFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


}

@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    final View view = inflater.inflate(R.layout.fragment_second, container, false);

    sharedPreferences = getActivity().getPreferences(Context.MODE_PRIVATE);

    final Button btnOK = (Button) view.findViewById(R.id.btnOK);
    final TimePicker tp = (TimePicker) view.findViewById(R.id.timePicker);

    //Stage 1 Components
    final EditText edAlarmName = (EditText) view.findViewById(R.id.edAlarmName);
    edAlarmName.setOnTouchListener(new View.OnTouchListener()
    {
       public boolean onTouch(View view, MotionEvent event)
       {
           if(event.getAction() == MotionEvent.ACTION_DOWN)
           {
               edAlarmName.setText("");
           }
           return false;
       }
    });
    final EditText edAlarmTime = (EditText) view.findViewById(R.id.edTime);
    final EditText edOccurance = (EditText) view.findViewById(R.id.edOccurance);
    edOccurance.setOnTouchListener(new View.OnTouchListener()
    {
        public boolean onTouch(View v, MotionEvent event)
        {
            if(event.getAction() == MotionEvent.ACTION_DOWN)
            {
                dialogOccurance(view);
                return true;
            }

            return false;
        }
    });
    final SeekBar seekVolume = (SeekBar) view.findViewById(R.id.seekVolume);
    seekVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
    {
        TextView tv = (TextView) view.findViewById(R.id.txtVolume);
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub
            tv.setText("How Loud?");
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
            // TODO Auto-generated method stub

            tv.setText("Volume: " + Integer.toString(progress));
            //Toast.makeText(getApplicationContext(), String.valueOf(progress), Toast.LENGTH_LONG).show();

        }
    });
    final RadioButton rad5min = (RadioButton) view.findViewById(R.id.radSnooze5min);
    final RadioButton rad10min = (RadioButton) view.findViewById(R.id.radSnooze10min);

    rad5min.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View view)
        {
            if(rad5min.isChecked() == true)
            {
                rad10min.setChecked(false);
                snoozeTime = 5;
            }
        }
    });
    rad10min.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View view)
        {
            if(rad10min.isChecked() == true)
            {
                rad5min.setChecked(false);
                snoozeTime = 10;
            }
        }
    });
    final EditText edCustomSnooze = (EditText) view.findViewById(R.id.edSnoozeTime);
    edCustomSnooze.setOnTouchListener(new View.OnTouchListener()
    {
       public boolean onTouch(View view, MotionEvent motion)
       {
           edCustomSnooze.setText("");
           if(motion.getAction() == MotionEvent.ACTION_DOWN)
           {
               rad5min.setChecked(false);
               rad10min.setChecked(false);
               snoozeTime = 0;
           }
           return false;
       }
    });
    Button btnSave = (Button) view.findViewById(R.id.btnSaveAlarm);
    TextView txtOccur = (TextView) view.findViewById(R.id.txtOccur);
    final TextView txtVolume = (TextView) view.findViewById(R.id.txtVolume);
    TextView txtSnooze = (TextView) view.findViewById(R.id.txtSnooze);
    final Button btnCancel = (Button) view.findViewById(R.id.btnCancel);
    btnOK.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            String minString = null;
            tp.setIs24HourView(false);
            hour = tp.getCurrentHour();
            min  = tp.getCurrentMinute();
            if(min < 10)
            {
                 minString = new StringBuilder().append(Integer.toString(0)).append(min).toString();
            }
            else
                minString = new StringBuilder().append(Integer.toString(min)).toString();

            //tv.setText(formatTime(hour, minString));
            //storeSetAlarmTime(formatTime(hour, minString));
            setVisibleStage(0, view);
            setVisibleStage(1, view);
            edAlarmTime.setText(formatTime(hour, minString));
            //HomeFragment hFrag = new HomeFragment();
            //replaceFragment(hFrag);
        }
    });

    btnCancel.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            HomeFragment hFrag = new HomeFragment();
            replaceFragment(hFrag);
        }
    });

    btnSave.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            edAlarmName.clearFocus();
            edAlarmTime.clearFocus();
            edOccurance.clearFocus();
            edCustomSnooze.clearFocus();
            //INPUT VALIDATION

            //ALL INPUT IS OK. NO NULL VALUES ANYWHERE. PROCEED...
            if(validateInput(edAlarmTime, edAlarmName, edOccurance, seekVolume, rad5min, rad10min, edCustomSnooze))
            {
                saveData(view, edAlarmName.getText().toString(), edAlarmTime.getText().toString(), edOccurance.getText().toString(), seekVolume.getProgress(), snoozeTime, sharedPreferences);
                //dialogBuilder("Alarm Saved", "Your alarm has been saved");
            }
            else
                dialogBuilder("Validation Error", "Fix your input and try again");
        }
    });

    edAlarmTime.setOnTouchListener(new View.OnTouchListener()
    {
        public boolean onTouch(View view, MotionEvent event)
        {
            if(event.getAction() ==  MotionEvent.ACTION_DOWN)
            {

            }
            return false;
        }
    });
    return view;
}
public void dialogBuilder(String title, String message)
{
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(title);
    builder.setMessage(message);
    builder.show();
}
public void dialogOccurance(final View view)
{

    CharSequence colors[] = new CharSequence[] {"Once", "Daily", "Weekly"};

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("How often will this alarm repeat?");
    builder.setItems(colors, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

            TextView tv = (TextView) view.findViewById(R.id.edOccurance);
            if(which == 0)
            {
                tv.setText("ONCE");
            }
            else if(which == 1)
                tv.setText("DAILY");
            else if(which == 2)
                tv.setText("WEEKLY");
        }
    });
    builder.show();
}

public void saveData(View view, String alarmName, String alarmTime, String occurance, int volume, int snoozeTime, SharedPreferences sharedPreferences)
{
    prefEditor = sharedPreferences.edit();
    prefEditor.putString(alarmTimeKey, alarmTime);
    prefEditor.putString(alarmNameKey, alarmName);
    prefEditor.putString(alarmOccuranceKey, occurance);
    prefEditor.putInt(alarmVolumeKey, volume);
    prefEditor.putInt(alarmSnoozeKey, snoozeTime);
    prefEditor.putBoolean(alarmVisibleKey, true);
    prefEditor.commit();

    if(!sharedPreferences.getBoolean(alarmVisibleKey, true))
    {
        dialogBuilder("ERROR", "We tried writing the data, however we cant verify it exists");
    }
    else
    {
        dialogBuilder("Write Successfull", "true");
    }
    Toast.makeText(getActivity().getApplicationContext(), "Alarm Added", Toast.LENGTH_LONG).show();

    HomeFragment hFrag = new HomeFragment();
    replaceFragment(hFrag);

}

public void setVisibleStage(int stage, View view)
{
    //Stage 0 Components
    TimePicker tp = (TimePicker) view.findViewById(R.id.timePicker);
    Button btnOK = (Button) view.findViewById(R.id.btnOK);
    Button btnCancel = (Button) view.findViewById(R.id.btnCancel);

    //Stage 1 Components
    EditText edAlarmName = (EditText) view.findViewById(R.id.edAlarmName);
    EditText edAlarmTime = (EditText) view.findViewById(R.id.edTime);
    EditText edOccurance = (EditText) view.findViewById(R.id.edOccurance);
    SeekBar seekVolume = (SeekBar) view.findViewById(R.id.seekVolume);
    RadioButton rad5min = (RadioButton) view.findViewById(R.id.radSnooze5min);
    RadioButton rad10min = (RadioButton) view.findViewById(R.id.radSnooze10min);
    EditText edCustomSnooze = (EditText) view.findViewById(R.id.edSnoozeTime);
    Button btnSave = (Button) view.findViewById(R.id.btnSaveAlarm);
    TextView txtOccur = (TextView) view.findViewById(R.id.txtOccur);
    TextView txtVolume = (TextView) view.findViewById(R.id.txtVolume);
    TextView txtSnooze = (TextView) view.findViewById(R.id.txtSnooze);

    if(stage == 0)
    {
        //STAGE 0 = ANALOG CLOCK DISPLAY ONLY
        tp.setVisibility(view.INVISIBLE);
        btnOK.setVisibility(view.INVISIBLE);
        btnCancel.setVisibility(view.INVISIBLE);
    }
    else if(stage == 1)
    {
        //STAGE 1 = EVERYTHING ELSE VISIBLE
        edAlarmName.setVisibility(view.VISIBLE);
        edAlarmTime.setVisibility(view.VISIBLE);
        txtOccur.setVisibility(view.VISIBLE);
        edOccurance.setVisibility(view.VISIBLE);
        txtVolume.setVisibility(view.VISIBLE);
        seekVolume.setVisibility(view.VISIBLE);
        txtSnooze.setVisibility(view.VISIBLE);
        rad5min.setVisibility(view.VISIBLE);
        rad10min.setVisibility(view.VISIBLE);
        edCustomSnooze.setVisibility(view.VISIBLE);
        btnSave.setVisibility(view.VISIBLE);
    }
}

public void replaceFragment(Fragment fragment)
{
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.frame_container, fragment);
    //fragmentTransaction.addToBackStack(fragment.toString());
    fragmentTransaction.commit();
}

public boolean validateInput(EditText edAlarmTime, EditText edAlarmName, EditText edOccurance, SeekBar seekVolume, RadioButton rad5min, RadioButton rad10min, EditText customSnooze)
{
    String alarmTimeOK = edAlarmTime.getText().toString();
    String alarmNameOK = edAlarmName.getText().toString();
    String OccuranceOK = edOccurance.getText().toString();
    int volumeOK = seekVolume.getProgress();
    boolean FiveMinChecked = rad5min.isChecked();
    boolean TenMinChecked  = rad10min.isChecked();
    String customSnoozeOK = customSnooze.getText().toString();

    if(alarmTimeOK.matches("") || !alarmTimeOK.contains(":"))
        return false;
    else if(alarmNameOK.matches("") || alarmNameOK.contains("Alarm Name"))
        return false;
    else if(OccuranceOK.matches("") || OccuranceOK.contains("Choose Occurance"))
        return false;
    else if(volumeOK == 0)
        return false;
    else if(FiveMinChecked && customSnoozeOK.matches("Enter your own"))
        return true;
    else if(TenMinChecked && customSnoozeOK.matches("Enter your own"))
        return true;
    else if(FiveMinChecked == false && customSnoozeOK.matches("Enter your own"))
        return false;
    else if(TenMinChecked == false && customSnoozeOK.matches("Enter your own"))
        return false;
    else
        return true;
}

public String formatTime(int hour, String minString)
{
    String formattedString = null;
    if(hour > 12)
    {
        formattedString = new StringBuilder().append(Integer.toString(hour - 12)).append(":").append(minString).append("PM").toString();
    }
    else
        formattedString = new StringBuilder().append(Integer.toString(hour)).append(":").append(minString).append("AM").toString();
    return formattedString;
}

}

Home Fragment

    public class HomeFragment extends Fragment{
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private boolean alarm1Active = false;
//private boolean alarm1Visible = false;
//public String alarm1Name;
//public String alarm1Time;
//public String alarm1Occurance;
//public int alarm1Snooze;
//public int alarm1Volume;
//public boolean fragmentSwitch;

SharedPreferences sharedPreferences;
SharedPreferences.Editor prefEditor;
public static final String alarmPreferences = "alarmPreferences";
public static final String alarmTimeKey = "alarmTimeKey";
public static final String alarmNameKey = "alarmNameKey";
public static final String alarmOccuranceKey = "alarmOccuranceKey";
public static final String alarmVolumeKey = "alarmVolumeKey";
public static final String alarmSnoozeKey = "alarmSnoozeKey";
public static final String alarmVisibleKey = "alarmVisibleKey";
public boolean devMode = true;

public HomeFragment() {
    // Required empty public constructor
}

public static HomeFragment newInstance(String param1, String param2) {
    HomeFragment fragment = new HomeFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    final View view = inflater.inflate(R.layout.fragment_home, container, false);

    //CODE HERE


    readPreferences(view);

    FloatingActionButton fabAddAlarm = (FloatingActionButton) view.findViewById(R.id.fabRefresh);
    fabAddAlarm.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Toast.makeText(getActivity().getApplicationContext(), "Reading Preferences", Toast.LENGTH_LONG).show();
            readPreferences(view);
        }
    });

    return view;
}

public void readPreferences(View view)
{
    TextView tvAlarm1Name = (TextView) view.findViewById(R.id.tvAlarm1Name);
    TextView tvAlarm1Time = (TextView) view.findViewById(R.id.tvAlarm1Time);
    TextView tvAlarm1Occurance = (TextView) view.findViewById(R.id.tvAlarm1Occurance);
    Switch swAlarm1Active = (Switch) view.findViewById(R.id.swEnableAlarm1);
    Button btnEditAlarm1 = (Button) view.findViewById(R.id.btnEditAlarm1);
    TextView status = (TextView) view.findViewById(R.id.tvNoAlarms);

    sharedPreferences = getActivity().getSharedPreferences(alarmPreferences, Context.MODE_PRIVATE);
    String alarm1Name = sharedPreferences.getString(alarmNameKey, null);
    String alarm1Time = sharedPreferences.getString(alarmTimeKey, null);
    String alarm1Occurance = sharedPreferences.getString(alarmOccuranceKey, null);
    int alarm1Snooze = sharedPreferences.getInt(alarmSnoozeKey, 0);
    int alarm1Volume = sharedPreferences.getInt(alarmVolumeKey, 0);
    boolean alarm1Visible = sharedPreferences.getBoolean(alarmVisibleKey, false);

    if(!alarm1Visible)
    {
        status.setVisibility(View.VISIBLE);
        status.setText("You have no alarms set!");
    }
    else if(alarm1Visible)
    {
        status.setVisibility(View.INVISIBLE);
        tvAlarm1Time.setVisibility(View.VISIBLE);
        tvAlarm1Name.setVisibility(View.VISIBLE);
        tvAlarm1Occurance.setVisibility(View.VISIBLE);
        btnEditAlarm1.setVisibility(View.VISIBLE);
        swAlarm1Active.setVisibility(View.VISIBLE);

        tvAlarm1Time.setText(alarm1Time);
        tvAlarm1Name.setText(alarm1Name);
        tvAlarm1Occurance.setText(alarm1Occurance);
    }
}

}

3 个答案:

答案 0 :(得分:0)

null上保存字符串时,请确保您没有保存prefEditor.putString(alarmOccuranceKey, occurance); 。它将改为清除首选项键。

occurance

确保Metric不为空。

答案 1 :(得分:0)

请使用commit()保存数据。您还可以为SharedPreferences创建一个简单的可重用类。请参考我的自定义课程:https://codebegetter.wordpress.com/2016/08/04/shared-preferences-reusable-class/

答案 2 :(得分:0)

根据其中一个答案中的评论,您似乎已经应用了解决方案。但是,根据您在此处发布的代码是问题:

您不存储和检索同一SharedPreferences文件中的值。存储值时,您使用的是自定义名为SharedPreferences的文件。当您尝试检索这些值时,您引用了SharedPreferences文件,该文件特定于承载您的secondFragment的Activity。 (在某种程度上,它实际上是自定义命名的......框架基于你的Activity名称)。

当您在secondFragment中将值写入SharedPreferences时,请致电:

sharedPreferences = getActivity().getSharedPreferences(alarmPreferences, Context.MODE_PRIVATE);
//...
prefEditor = sharedPreferences.edit();

当您尝试在HomeFragment中阅读这些值时,请致电:

sharedPreferences = getActivity().getPreferences(Context.MODE_PRIVATE);

这两个代码段不引用相同的SharePreferences文件。最直接的解决方案是更新HomeFragment中的代码,以便获得存储值的相同SharePreferences文件,如下所示:

sharedPreferences = getActivity().getSharedPreferences(alarmPreferences, Context.MODE_PRIVATE);