Java 为什么SharedReference不在这里保存?
我试图在SharedReferences中设置一些字符串,但当我重新启动应用程序时,首选项为空,因此在getString方法中返回“null”Java 为什么SharedReference不在这里保存?,java,android,sharedpreferences,Java,Android,Sharedpreferences,我试图在SharedReferences中设置一些字符串,但当我重新启动应用程序时,首选项为空,因此在getString方法中返回“null” public class settingsView extends Fragment { DataSnapshot citiesSnap; Spinner theaterSpinner, citySpinner; String selectedCity, selectedTheater; String[] cities
public class settingsView extends Fragment {
DataSnapshot citiesSnap;
Spinner theaterSpinner, citySpinner;
String selectedCity, selectedTheater;
String[] cities = {"Bagalkot", "Belgaum", "Bellary", "Bijapur", "Chitradurga", "Davanagere", "Dharwad", "Gadag", "Hassan", "Hosapete", "Hospet", "Hubli", "Mysore", "Shimoga", "Tumkur"};
List<String>theaters ;
public settingsView() {
Log.d("testing" , "settingsview constructor called");
citiesSnap = null;
theaterSpinner = null;
citySpinner = null;
selectedCity = null;
selectedTheater = null;
theaters = null ;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d("testing", "Called onActivityCreated");
citySpinner = (Spinner) getActivity().findViewById(R.id.citySpinner);
theaterSpinner = (Spinner) getActivity().findViewById(R.id.theaterSpinner);
final SharedPreferences mSettings = this.getActivity().getPreferences(Context.MODE_PRIVATE);
selectedCity = mSettings.getString("selectedCity", "null" );
selectedTheater = mSettings.getString("selectedTheater", "null");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), android.R.layout.simple_selectable_list_item, cities);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
citySpinner.setAdapter(adapter);
updateTheatersSpinner(selectedCity);
if(theaters!=null)
theaterSpinner.setSelection(theaters.indexOf(selectedTheater));
FirebaseDatabase.getInstance().getReference("movies/karnataka").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
citiesSnap = dataSnapshot;
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
citySpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(Spinner parent, View view, int position, long id) {
updateTheatersSpinner(citySpinner.getSelectedItem().toString());
mSettings.edit().putString("selectedCity" , citySpinner.getSelectedItem().toString()).commit();
}
});
theaterSpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(Spinner parent, View view, int position, long id) {
mSettings.edit().putString("selectedTheater" , theaterSpinner.getSelectedItem().toString()).commit() ;
}
});
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.settingsview, container, false);
return view;
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
Log.d("testing" , "On save instancestate") ;
super.onSaveInstanceState(outState);
SharedPreferences preferences = this.getActivity().getPreferences(Context.MODE_PRIVATE);
preferences.edit().putString("selectedCity", selectedCity).putString("selectedTheater", theaterSpinner.getSelectedItem().toString()).commit();
}
public void updateTheatersSpinner(String city) {
if (citiesSnap != null) {
ArrayList<String> theaterlist = new ArrayList<>();
for (DataSnapshot snapshot : citiesSnap.child(city).getChildren()) {
theaterlist.add(snapshot.getKey());
}
this.theaters = theaterlist ;
Log.d("firebasedata", "theaterlist : " + theaterlist.toString());
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), android.R.layout.simple_selectable_list_item, theaterlist);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
this.theaterSpinner.setAdapter(adapter);
}
}
}
公共类设置视图扩展了片段{
DataSnapshot citiesSnap;
旋转器剧院旋转器,城市旋转器;
字符串selectedCity,SelectedThewer;
字符串[]城市={“巴加尔科特”、“贝尔高姆”、“贝拉里”、“比贾普尔”、“奇特拉杜加”、“达瓦盖尔”、“达瓦德”、“加达格”、“哈桑”、“霍萨佩特”、“霍斯佩特”、“胡比”、“迈索尔”、“希莫加”、“图姆库尔”};
剧院;
公共设置视图(){
d(“测试”、“设置视图构造函数调用”);
citiesSnap=null;
theaterSpinner=null;
citySpinner=null;
selectedCity=null;
SelectedThewer=null;
剧院=空;
}
@凌驾
ActivityCreated上的公共无效(@Nullable Bundle savedinStateCState){
super.onActivityCreated(savedInstanceState);
Log.d(“测试”,“称为onActivityCreated”);
citySpinner=(微调器)getActivity().findViewById(R.id.citySpinner);
theaterSpinner=(Spinner)getActivity().findViewById(R.id.theaterSpinner);
最终SharedReferences mSettings=this.getActivity().getPreferences(Context.MODE\u PRIVATE);
selectedCity=mSettings.getString(“selectedCity”、“null”);
selectedthewer=mSettings.getString(“selectedthewer”、“null”);
ArrayAdapter=新的ArrayAdapter(getActivity().getApplicationContext(),android.R.layout.simple\u可选\u列表\u项,城市);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
citySpinner.setAdapter(适配器);
更新aterspinner(selectedCity);
如果(剧院!=null)
剧院微调器.setSelection(剧院.indexOf(SelectedThewer));
FirebaseDatabase.getInstance().getReference(“电影/卡纳塔克邦”).addValueEventListener(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
citiesSnap=dataSnapshot;
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
citySpinner.setOnItemSelectedListener(新微调器.OnItemSelectedListener(){
@凌驾
已选择公共空间(微调器父对象、视图、整型位置、长id){
更新aterspinner(citySpinner.getSelectedItem().toString());
mSettings.edit().putString(“selectedCity”,citySpinner.getSelectedItem().toString()).commit();
}
});
theaterSpinner.setOnItemSelectedListener(新建Spinner.OnItemSelectedListener()){
@凌驾
已选择公共空间(微调器父对象、视图、整型位置、长id){
mSettings.edit().putString(“selectedthewer”,theaterSpinner.getSelectedItem().toString()).commit();
}
});
}
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、@Nullable ViewGroup container、@Nullable Bundle savedInstanceState){
视图=充气机。充气(R.layout.Settings视图,容器,错误);
返回视图;
}
@凌驾
SAVEInstanceState上的公共无效(@NonNull Bundle outState){
Log.d(“测试”、“保存实例状态”);
super.onSaveInstanceState(超出状态);
SharedReferences preferences=this.getActivity().getPreferences(Context.MODE\u PRIVATE);
preferences.edit().putString(“selectedCity”,selectedCity).putString(“selectedthewer”,theaterSpinner.getSelectedItem().toString()).commit();
}
public void updateTheaterspinner(字符串城市){
如果(citiesSnap!=null){
ArrayList theaterlist=新的ArrayList();
for(DataSnapshot快照:citiesSnap.child(city.getChildren()){
添加(snapshot.getKey());
}
this.theaters=剧院列表;
Log.d(“firebasedata”,“theaterlist:+theaterlist.toString());
ArrayAdapter=新的ArrayAdapter(getActivity().getApplicationContext(),android.R.layout.simple\u可选\u列表\u项,theaterlist);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
this.theaterSpinner.setAdapter(适配器);
}
}
}
您有类字段selectedCity
和SelectedThewer
,您从不更新它们,因此它们总是null
,但是在onSaveInstanceState
中保存这些字段,因此当您的活动关闭时,它会将null
写入共享引用中的两个字段。spnner更改时,您应该更新这些字段
citySpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(Spinner parent, View view, int position, long id) {
selectedCity = citySpinner.getSelectedItem().toString(); // <--
updateTheatersSpinner(selectedCity);
mSettings.edit().putString("selectedCity", selectedCity).commit();
}
});
theaterSpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(Spinner parent, View view, int position, long id) {
selectedTheater = theaterSpinner.getSelectedItem().toString(); // <--
mSettings.edit().putString("selectedTheater", selectedTheater).commit();
}
});
是否尝试使用GetDefaultSharedReferences()?保存所选城市时使用了错误的微调器(剧院)。
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
Log.d("testing" , "On save instancestate") ;
super.onSaveInstanceState(outState);
SharedPreferences preferences = this.getActivity().getPreferences(Context.MODE_PRIVATE);
preferences.edit()
.putString("selectedCity", selectedCity)
.putString("selectedTheater", selectedTheater)
.commit();
}