Вызов методов MainActivity из других классов

136
23 января 2022, 14:40

Есть MainActivity, в нём есть 2 метода. Первый сохраняет строку:

public void saveInfo(String lvl){
    sPref = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sPref.edit();
    editor.putString("lvl", lvl);
    editor.commit();
}

Второй выгружает строку:

public String getInfo(){
    sPref = getPreferences(MODE_PRIVATE);
    String lvl = sPref.getString("lvl", "");
    return lvl;
}

Внутри MainActivity всё работает отлично, но как только я пытаюсь вызвать эти методы из другого класса, приложение крашится.

Что я делаю не так?

Как я вызываю метод из другого класса:

MainActivity mainActivity = new MainActivity();
mainActivity.saveInfo("2");

Я хочу сохранять данные в SharedPreferences из других классов, но не могу.

Answer 1

Управлять Activity и фрагментами должна операционная система. Создавать Activity нужно средствами SDK, к примеру, с помощью startActivityForResult.

Я хочу сохранять данные в SharedPreferences из других классов, но не могу.

Для использования SharedPreferences вам нужен Context.

Можно сделать методы static:

public static void saveInfo(Context ctx, String lvl){
    SharedPreferences sPref = context.getSharedPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sPref.edit();
    editor.putString("lvl", lvl);
    editor.commit();
}

Второй выгружает строку:

public static String getInfo(Context ctx){
    SharedPreferences sPref = context.getSharedPreferences(MODE_PRIVATE);
    String lvl = sPref.getString("lvl", "");
    return lvl;
}

И вызывать тогда так:

MainActivity.saveInfo(yourContext, "2");
Answer 2

Как вариант - создайте статическую переменную на объект приложения:

public class App extends Application {
    private static App _app;
    public static App getApp()
    {
        return _app;
    }
    public void onCreate() {
       super.onCreate();
       _app = this;
    }
    public void saveInfo(String lvl){
        sPref = getSharedPreferences("myPrefs", MODE_PRIVATE);
        SharedPreferences.Editor editor = sPref.edit();
        editor.putString("lvl", lvl);
        editor.commit();
    }
    public String getInfo(){
        sPref = getSharedPreferences("myPrefs", MODE_PRIVATE);
        String lvl = sPref.getString("lvl", "");
        return lvl;
    }
}

Далее можно вызывать в коде:

App.getApp().getInfo()
READ ALSO
Как разметить данный блок?

Как разметить данный блок?

Как разметить блок, чтобы выстроить элементы в линию?

136
Не работает опция shedule

Не работает опция shedule

С чем может быть связано нежелание g++ компилировать OpenMP программу с использованной опцией shedule(dynamic)?

76
Освобождение массива double-ов в std::unique_ptr

Освобождение массива double-ов в std::unique_ptr

Нужен массив double-овКоличество элементов определяется только во время выполнения программы - поэтому в стеке создать не получится

91