SharedPreference в классе без активности или в классе адаптера RecyclerView - PullRequest
0 голосов
/ 08 октября 2018

Я сохранил общие предпочтения в настройках активности и могу получить их при загрузке.Также я могу получить те же общие настройки в основной деятельности.Однако, когда я пытаюсь вызвать его в отдельном классе, который я намереваюсь использовать на адаптере в представлении реселлера, так как в качестве префикса в каждом элементе представления карты, я получаю нулевую ошибку.Ниже приведены проблемы:

  1. Я сталкиваюсь с трудностями при настройке правильного контекста.
  2. Я попытался создать метод получения в классе / деятельности предпочтения, который возвращает ноль при вызове из отдельногоJava-класс.
  3. Я попытался определить контекст в классе адаптера и использовать его следующим образом

public SharedPreferences sharedPreferences;
      public Context context;

      ...

sharedPreferences=PreferenceManager.getDefaultSharedPreferences(this.context);    
     userCurrency = sharedPreferences.getString("sPrefix","");

Также попытался:

sharedPreferences=PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); 

Я получаю следующую ошибку при вызове этой строки sharedpreference.

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

Подскажите, пожалуйста, как настроить геттер, который я могу вызвать из отдельного класса, или инициализировать иполучить значения в этом отдельном классе напрямую.

Основное действие

открытый класс MainActivity расширяет AppCompatActivity {

Button btnm, btnw, btnsep;
Intent intent;
TextView tvRecall;
Third third;
Shared shared;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnm = findViewById(R.id.btnmain);
    btnw = findViewById(R.id.btnwhat);
    btnsep = findViewById(R.id.sepClass);
    tvRecall=findViewById(R.id.txtRecall);

    intent = new Intent(this, Shared.class);

    btnm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            startActivity(intent);

        }
    });


    btnw.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

           SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            String s = sharedPreferences.getString("txt","");
            Log.i("testlog*****","t "+ s);
            Toast.makeText(getApplicationContext(),"Text is " + s,Toast.LENGTH_SHORT).show();

        }
    });

    btnsep.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           third = new Third();
           third.callSharedPreference();
        }
    });

}

Деятельность по сохранению общего префикса

открытый класс Shared расширяет AppCompatActivity {

EditText textView ;
Button btn;
SharedPreferences sharedPreferences;
Context c;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shared);
    textView = findViewById(R.id.txtName);
    btn = findViewById(R.id.btnName);



    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            sharedPreferences.edit().putString("txt",textView.getText().toString()).apply();
        }
    });


}

public Shared () {    }

public void getlog () {
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(c);
        String s = sharedPreferences.getString("txt","");
        Log.i("testlog*****","t "+ s);
        Toast.makeText(getApplicationContext(),"Text is " + s,Toast.LENGTH_SHORT).show();
}

Третий класс для вызова sharedpreference с нулевой ошибкой, как указано выше при вызове

public class Third {

Context context;
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
String s = sharedPreferences.getString("txt","");


public Third (){}

public void callSharedPreference () {

    Log.i("testlog*****","t "+ s);
    Toast.makeText(context.getApplicationContext(),"Text is ==== " + s,Toast.LENGTH_SHORT).show();

}

1 Ответ

0 голосов
/ 09 октября 2018

в классе Third контекст не инициализирован, поэтому вы должны инициализировать его в методе конструктора и передать ему значение при вызове класса ... как это

public class Third {
Context context;
SharedPreferences sharedPreferences = 
PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
String s = sharedPreferences.getString("txt","");


public Third (Context context){
    this.context=context
}
//...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...