Невозможно получить строки из SharedPreferences?
Я создаю список, который хранит и хранит значения в виде строки, используя общие настройки. Я хочу сохранить время событий (некоторые события).
Мой код выглядит
package com.defcomdevs.invento16;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.annotation.Nullable;
import android.util.Log;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;
/**
* Created by midhun on 18/11/15.
*/
public class SetTimings {
// context to hold the calling activity
static Context c;
String[] event_times;
// declare file name and mode of access
public static String MY_PREFS = "MY_PREFS";
private SharedPreferences mySharedPreferences = new SharedPreferences() {
@Override
public Map<String, ?> getAll() {
return null;
}
@Nullable
@Override
public String getString(String key, String defValue) {
return null;
}
@Nullable
@Override
public Set<String> getStringSet(String key, Set<String> defValues) {
return null;
}
@Override
public int getInt(String key, int defValue) {
return 0;
}
@Override
public long getLong(String key, long defValue) {
return 0;
}
@Override
public float getFloat(String key, float defValue) {
return 0;
}
@Override
public boolean getBoolean(String key, boolean defValue) {
return false;
}
@Override
public boolean contains(String key) {
return false;
}
@Override
public Editor edit() {
return null;
}
@Override
public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
}
@Override
public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
}
};
int prefMode = c.MODE_PRIVATE;
public static String[] eventslist = new String[50];
public SetTimings(Context context, String[] strings) {
int i = 0;
Log.d("Midhun", strings[1]);
this.c = context;
eventslist = c.getResources().getStringArray(R.array.Items);
SharedPreferences.Editor editor = mySharedPreferences.edit();
editor.putString(eventslist[i++], strings[i++]);
editor.putString(eventslist[i++], strings[i++]);
editor.putString(eventslist[i++], strings[i++]);
editor.putString(eventslist[i++], strings[i++]);
editor.putString(eventslist[i++], strings[i++]);
editor.putString(eventslist[i++], strings[i++]);
editor.putString(eventslist[i++], strings[i++]);
editor.putString(eventslist[i++], strings[i++]);
editor.putString(eventslist[i++], strings[i++]);
editor.putString(eventslist[i++], strings[i++]);
editor.apply();
Log.d("Midhun", mySharedPreferences.getString(eventslist[2], "null"));
}
public String[] getTimings(Context c1) {
eventslist = c1.getResources().getStringArray(R.array.Items);
for (int i = 0; i < eventslist.length; i++) {
event_times[i] = String.valueOf(mySharedPreferences.getString(eventslist[i], ""));
}
return event_times;
}
}
я называю класс и конструктор так:
setTimings= new SetTimings(this,this.getResources().getStringArray(R.array.Items));
И получить доступ к строкам, как это:
String[] time= setTimings.getTimings(this);
Проблема Когда я запускаю свое приложение, оно падает.
Отчет журнала:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] com.defcomdevs.invento16.SetTimings.getTimings(android.content.Context)' on a null object reference
Это показывает, что ошибка в getTimings()
Метод, я пытался с некоторыми вопросами по SO, но у меня не получилось.
Пожалуйста, выделите мою ошибку. И, пожалуйста, дайте решение. Спасибо
изменить код, где я использовал setTimings
:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context=this;
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setLogo(R.mipmap.ic_launcher);
setSupportActionBar(toolbar);
getTheAccountName=new GetTheAccountName();
final Context context=this;
adapter = new MyAdapter(this, getdata());
recyclerView = (RecyclerView) findViewById(R.id.recycler);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
mcollapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
mcollapsingToolbar.setTitle("INVENTO '16");
mcollapsingToolbar.setExpandedTitleColor(getResources().getColor(R.color.transparent));
mcollapsingToolbar.setCollapsedTitleTextColor(getResources().getColor(R.color.white));
fab_menu_titlescreen= (FloatingActionMenu) findViewById(R.id.menu_item);
fab_map = (FloatingActionButton) findViewById(R.id.map);
fab_register = (FloatingActionButton) findViewById(R.id.register);
fab_reminder = (FloatingActionButton) findViewById(R.id.reminder);
fab_refresh = (FloatingActionButton) findViewById(R.id.refresh);
String userName=getTheAccountName.getUsername(context);
String userId=getTheAccountName.getuserId(context);
//username= (TextView) findViewById(R.id.userNameText);
//username.setText(userName);
userid= (TextView) findViewById(R.id.userNameText);
userid.setText(userId);
Log.d("Midhun", "before");
String[] t= this.getResources().getStringArray(R.array.time);
//pass the time parameters to the class
setTimings= new SetTimings(this,t); //used setTimings
Log.d("Midhun","after");
и здесь
public List<ListItems> getdata() {
List<ListItems> grid_data = new ArrayList<>();
int[] icons = {R.drawable.hackbttn100, R.drawable.hackbttn100, R.drawable.hackbttn100, R.drawable.hackbttn100, R.drawable.hackbttn100, R.drawable.hackbttn100, R.drawable.hackbttn100, R.drawable.hackbttn100, R.drawable.hackbttn100, R.drawable.hackbttn100};
String[] texts = getResources().getStringArray(R.array.Items);
String[] time= setTimings(context);
Log.d("Midhun",time[1]);
for (int i = 0; i < icons.length && i < texts.length; i++) {
ListItems current = new ListItems();
current.iconId = icons[i];
current.IconName = texts[i];
current.ItemTime = time[i];
grid_data.add(current);
}
return grid_data;
}
3 ответа
Это связано со следующей строкой
editor.putString(eventslist[i++], strings[i++]);
здесь вы делаете i++ дважды. это означает, что вы не ссылаетесь на правильные элементы массива и не запускаете его в результате
Вы, вероятно, должны использовать цикл for, чтобы сделать выше. На самом деле, вы можете "сохранить" весь массив в общих настройках
Благодаря Майку М.
ПРОБЛЕМА
Во-первых, getdata() в моем экземпляре Adapter выполняется до создания setTimings, поэтому в этом методе он нулевой.
2. Во-вторых, я присваивал массив строк неинициализированному массиву строк. eventslist
,
3. Как указывал Уильям Ку, я использовал i++ дважды, поэтому выходил за пределы.
Поскольку он генерирует исключение NullPointerException в getTimings(), вы должны искать объект, который имеет значение null, и вызывается его метод. Итак, кандидатами могут быть: c1 (типа Context),eventList,mySharedPreference.