2015-11-19 4 views
-3

Я создаю список, который хранит и сохраняет значения как строку, используя общие настройки. Я хочу хранить время событий (некоторые события).Не удалось получить строки из 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);

Проблема Когда я запускаю свое приложение, он падает.

Log Report:

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 но не работаю для меня.

Пожалуйста Выделите мой error.And любезно передаст solution.Thanks

Редактировать код, в котором я использовал 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; 
} 
+0

«Это показывает, что ошибка находится в' getTimings() 'method" - Нет, ваша ошибка говорит о том, что 'setTimings' или какой-либо другой экземпляр класса SetTimings равен null. –

+0

@MikeM. Я дал несколько операторов журнала внутри costructer. Но консоль не показывает эти утверждения. Кажется, что поток не достигает этого. Какая может быть причина. – Midhun0407

+0

Не знаю. Вы не разместили достаточно кода, в котором вы создаете экземпляр и используете 'setTimings'. –

ответ

1

Он должен сделать со следующей строкой

editor.putString(eventslist[i++], strings[i++]); 

здесь вы делаете i ++ дважды. Это означает, что вы не ссылаетесь на правильные элементы массива и заканчиваете в итоге

Возможно, вы должны использовать цикл for для выполнения вышеуказанных действий. На самом деле, вы можете «сохранить» весь массив в sharedpreferences

+0

спасибо, я исправил это, но все еще сбой из-за той же ошибки – Midhun0407

+0

вы можете показать свой новый код? –

0

Поскольку он бросает исключение NullPointerException в getTimings(), вы должны искать объект, который является нулевым, и его метод вызывается. Таким образом, кандидаты могут быть: c1 (типа Context), eventList, mySharedPreference.

0

Благодаря Mike M.

ПРОБЛЕМА

1.First, что GetData() в моей конкретизации адаптера производится до инстанцирования setTimings, так что нуль в этом методе.

2. Второй раз я присваивал массив строк неинициализированному массиву строк eventslist.

3.Как отметил Уильям Ку, я дважды использовал i ++, поэтому выходил за пределы.

Смежные вопросы