Как получитьContext () в приложении LIBGDX android - PullRequest
1 голос
/ 02 февраля 2020

Мне нужно получить Context моего приложения, но в моем основном классе он расширяется от Game, поэтому я не могу расширить от Activity. Кто-нибудь знает, как это сделать?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 02 февраля 2020

LibGDX - кроссплатформенный игровой движок, поэтому ваше приложение может выполняться на нескольких платформах. Только Android, который является только одной поддерживаемой платформой, может предоставить объект Context.

Чтобы обойти эту проблему, вам нужно создать Interface в основном модуле вашего проекта LibGDX , Этот интерфейс может, например, содержать метод getContext(). Добавьте интерфейс в качестве аргумента в конструктор вашего основного класса LibGDX. В каждом модуле c, определяемом платформой, вы должны затем реализовать этот Interface, переопределить метод getContext() (возвращая объект Context в модуле android и null в каждом другом модуле) и передать это с конструктором для основного класса LibGDX в классе Launcher для этого модуля.

Для получения дополнительной информации о topi c, прочитайте LibGDX Wiki: https://github.com/libgdx/libgdx/wiki/Interfacing-with-platform-specific-code

РЕДАКТИРОВАТЬ: LibGDX не может обрабатывать объект Context, вам нужно будет манипулировать объектом Context в модуле Android вместо передачи его в модуль ядра ! Спасибо @Nicolas и @Luis Fernando Frontanilla за упоминание этого.

0 голосов
/ 06 февраля 2020

Интерфейс - это путь к go, поскольку вы не можете получить доступ к Android, указанному c коду из Core модуля.

Шаг 1: Создайте интерфейс (CORE MODULE)

public interface MyInterface {

    void manipulateContext();

    void manipulateContextWithExtraParams(String example, int example2);
}

Шаг 2: Реализуйте интерфейс (ANDROID MODULE)

import android.content.Context;

public class InterfaceImplementation implements MyInterface {

    private Context context;

    public InterfaceImplementation(Context context) {
        // Store the context for later use
        this.context = context;
    }

    @Override
    public void manipulateContext() {
        // Do something with the context, this is called on the core module
        System.out.println(context);
    }

    @Override
    public void manipulateContextWithExtraParams(String example, int example2) {
        if (example2 == 1) {
            System.out.println(example + context);
        } else {
            System.out.println(example);
        }
    }
}

Шаг 3: Отправьте реализованный интерфейс вашей игре (ANDROID МОДУЛЬ)

import android.os.Bundle;

import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import com.frontanilla.helping.getcontext.InterfaceImplementation;
import com.frontanilla.helping.getcontext.MyGame;

public class AndroidLauncher extends AndroidApplication {
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();

        InterfaceImplementation interfaceImplementation = new InterfaceImplementation(this);

        // Here we send the implementation to our Game in Core module
        initialize(new MyGame(interfaceImplementation), config);
    }
}

Шаг 4: Сохраните и используйте методы, которые вы определили в вашем интерфейсе (CORE MODULE)

import com.badlogic.gdx.Game;

public class MyGame extends Game {

    private MyInterface myInterface;

    public MyGame(MyInterface myInterface) {
        // Store for later use
        this.myInterface = myInterface;
    }

    @Override
    public void create() {
        // Example of manipulating the Android Context indirectly from Core module
        myInterface.manipulateContext();
        myInterface.manipulateContextWithExtraParams("Hello", 2);
    }
}

Как вы можете видеть, вы не будете манипулировать Context непосредственно из основного модуля, вместо этого поместите эти логики c в InterfaceImplementation класс

0 голосов
/ 05 февраля 2020

Я попробовал:

scoreHelper = new ScoreSQLiteHelper(context,"dbtest",null,1); db = scoreHelper.getWritableDatabase();

, но у меня нет контекста для подачи этого метода.

Это было бы полезно любым другим способом чтобы получить путь для создания БД с помощью:

db = SQLiteDatabase.openOrCreateDatabase(path,null);

...