Java LibGDX从核心模块(MyGdxGame)中的android模块(AndroidLauncher)获取变量?

Java LibGDX从核心模块(MyGdxGame)中的android模块(AndroidLauncher)获取变量?,java,android,libgdx,core,Java,Android,Libgdx,Core,所以我看过这篇关于它的文章,我想它解决了一些问题。 链接: 但是,我正在使用AdMob和Firebase集成,因此我使用AdView、AdRequest和MobileAds等。我在AndroidLauncher中使用它们,这很好,但是当尝试实现一个名为AdsManager的接口并创建AdView类型的变量时,它无法解决这个问题。我想这是因为我没有android模块那么,当我在核心模块(MyGdxGame)中时,如何从AndroidLauncher获取“AdMob type”变量呢? 例如: 安卓

所以我看过这篇关于它的文章,我想它解决了一些问题。 链接:

但是,我正在使用AdMob和Firebase集成,因此我使用AdView、AdRequest和MobileAds等。我在AndroidLauncher中使用它们,这很好,但是当尝试实现一个名为AdsManager的接口并创建AdView类型的变量时,它无法解决这个问题。我想这是因为我没有android模块那么,当我在核心模块(MyGdxGame)中时,如何从AndroidLauncher获取“AdMob type”变量呢?

例如: 安卓模块

public class AndroidAdsManager implements AdsManager {
    private AdView adBanner; // Error: Android Studio doesn't find this type
    private AdHandler adHandler; // Also needs this in here, I guess, maybe not

    @Override
    public void showAds(boolean show) {
        adHandler.sendEmptyMessage(show ? adHandler.ADS_SHOW : adHandler.ADS_HIDE);
    }
}
AdsManager

package com.game.mygame.monetization;

public interface AdsManager {
    void showAds(boolean show);
}
public class AndroidLauncher extends AndroidApplication implements AdsManager {

private final String TAG = "AndroidLauncher";
private AdHandler adHandler; // Variable I want to reach from core module

static class AdHandler extends Handler {
    private final int ADS_SHOW = 1;
    private final int ADS_HIDE = 0;
    private AdView adBanner; // Variable I want to reach from core module

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        switch (msg.what) {
            case ADS_SHOW:
                adBanner.setVisibility(View.VISIBLE);
                break;

            case ADS_HIDE:
                adBanner.setVisibility(View.GONE);
                break;
        }
    }
}

@Override
protected void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
    RelativeLayout layout = new RelativeLayout(this);
    View view = initializeForView(new MyGdxGame(this), config);
    layout.addView(view);

    implementAds();
    requestAds(layout);

    // Sets the background image
    setContentView(layout);
}

public void implementAds() {
    // Implement ads
    MobileAds.initialize(this, "");

    adHandler = new AdHandler();
    adHandler.adBanner = new AdView(this);
    adHandler.adBanner.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            super.onAdLoaded();
            Log.i(TAG, "Ad loaded ...");
        }
    });

    adHandler.adBanner.setAdSize(AdSize.SMART_BANNER);
    adHandler.adBanner.setAdUnitId("");

}

public void requestAds(RelativeLayout layout) {
    AdRequest.Builder builder = new AdRequest.Builder();
    builder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);
    builder.addTestDevice("");

    RelativeLayout.LayoutParams adBannerParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
    adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);

    layout.addView(adHandler.adBanner, adBannerParams);
    adHandler.adBanner.loadAd(builder.build());
}

@Override
public void showAds(boolean show) {
    adHandler.sendEmptyMessage(show ? adHandler.ADS_SHOW : adHandler.ADS_HIDE);
}
public class AndroidAdsManager implements AdsManager {
  private AdView adBanner;
  private AdHandler adHandler;

    @Override
    public void showAds(boolean show) {
        adHandler.sendEmptyMessage(show ? adHandler.ADS_SHOW : adHandler.ADS_HIDE);
    }
    @Override
    public void implementAds() {
        // Implement ads
        MobileAds.initialize(this, ""); // HERE YOU NEED TO GET THE CONTEXT

        adHandler = new AdHandler();
        adHandler.adBanner = new AdView(this);
        adHandler.adBanner.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                super.onAdLoaded();
                Log.i(TAG, "Ad loaded ...");
            }
        });

        adHandler.adBanner.setAdSize(AdSize.SMART_BANNER);
        adHandler.adBanner.setAdUnitId("");
    }
    // You need to get a RelativeLayout reference for this method to work
    // I would get it from AndroidLauncher
    public void requestAds() {
        AdRequest.Builder builder = new AdRequest.Builder();
        builder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);
        builder.addTestDevice("");

        RelativeLayout.LayoutParams adBannerParams = new 
        RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT);
        adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
        adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);

        layout.addView(adHandler.adBanner, adBannerParams);
        adHandler.adBanner.loadAd(builder.build());
    }
}
public interface AdsManager {
    void implementAds();
    void requestAds(); // Relative layout param removed from here
    void showAds(boolean show);
}
AndroidLauncher

package com.game.mygame.monetization;

public interface AdsManager {
    void showAds(boolean show);
}
public class AndroidLauncher extends AndroidApplication implements AdsManager {

private final String TAG = "AndroidLauncher";
private AdHandler adHandler; // Variable I want to reach from core module

static class AdHandler extends Handler {
    private final int ADS_SHOW = 1;
    private final int ADS_HIDE = 0;
    private AdView adBanner; // Variable I want to reach from core module

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        switch (msg.what) {
            case ADS_SHOW:
                adBanner.setVisibility(View.VISIBLE);
                break;

            case ADS_HIDE:
                adBanner.setVisibility(View.GONE);
                break;
        }
    }
}

@Override
protected void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
    RelativeLayout layout = new RelativeLayout(this);
    View view = initializeForView(new MyGdxGame(this), config);
    layout.addView(view);

    implementAds();
    requestAds(layout);

    // Sets the background image
    setContentView(layout);
}

public void implementAds() {
    // Implement ads
    MobileAds.initialize(this, "");

    adHandler = new AdHandler();
    adHandler.adBanner = new AdView(this);
    adHandler.adBanner.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            super.onAdLoaded();
            Log.i(TAG, "Ad loaded ...");
        }
    });

    adHandler.adBanner.setAdSize(AdSize.SMART_BANNER);
    adHandler.adBanner.setAdUnitId("");

}

public void requestAds(RelativeLayout layout) {
    AdRequest.Builder builder = new AdRequest.Builder();
    builder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);
    builder.addTestDevice("");

    RelativeLayout.LayoutParams adBannerParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
    adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);

    layout.addView(adHandler.adBanner, adBannerParams);
    adHandler.adBanner.loadAd(builder.build());
}

@Override
public void showAds(boolean show) {
    adHandler.sendEmptyMessage(show ? adHandler.ADS_SHOW : adHandler.ADS_HIDE);
}
public class AndroidAdsManager implements AdsManager {
  private AdView adBanner;
  private AdHandler adHandler;

    @Override
    public void showAds(boolean show) {
        adHandler.sendEmptyMessage(show ? adHandler.ADS_SHOW : adHandler.ADS_HIDE);
    }
    @Override
    public void implementAds() {
        // Implement ads
        MobileAds.initialize(this, ""); // HERE YOU NEED TO GET THE CONTEXT

        adHandler = new AdHandler();
        adHandler.adBanner = new AdView(this);
        adHandler.adBanner.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                super.onAdLoaded();
                Log.i(TAG, "Ad loaded ...");
            }
        });

        adHandler.adBanner.setAdSize(AdSize.SMART_BANNER);
        adHandler.adBanner.setAdUnitId("");
    }
    // You need to get a RelativeLayout reference for this method to work
    // I would get it from AndroidLauncher
    public void requestAds() {
        AdRequest.Builder builder = new AdRequest.Builder();
        builder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);
        builder.addTestDevice("");

        RelativeLayout.LayoutParams adBannerParams = new 
        RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT);
        adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
        adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);

        layout.addView(adHandler.adBanner, adBannerParams);
        adHandler.adBanner.loadAd(builder.build());
    }
}
public interface AdsManager {
    void implementAds();
    void requestAds(); // Relative layout param removed from here
    void showAds(boolean show);
}
}

当试图创建一个名为AndroidManager的类来实现AdsManager时,它无法解析私有AdView变量,因为我想我已经不在android模块中了

核心模块

public class AndroidAdsManager implements AdsManager {
    private AdView adBanner; // Error: Android Studio doesn't find this type
    private AdHandler adHandler; // Also needs this in here, I guess, maybe not

    @Override
    public void showAds(boolean show) {
        adHandler.sendEmptyMessage(show ? adHandler.ADS_SHOW : adHandler.ADS_HIDE);
    }
}

长话短说:你不能 您好Kevvex,您无法从核心模块中的类访问AdView或AdHandler,您需要做的是(如您提供的链接所示)在实现AdsManager接口的AndroidManager类中实现所有逻辑

我要做的是,无论何时,只要你想用Android模块中的类型做一些事情,在AndroidManager中有一个methdod来做这些事情,你就需要在AdsManagerInterface中创建方法来调用它们:
AndroidManager

package com.game.mygame.monetization;

public interface AdsManager {
    void showAds(boolean show);
}
public class AndroidLauncher extends AndroidApplication implements AdsManager {

private final String TAG = "AndroidLauncher";
private AdHandler adHandler; // Variable I want to reach from core module

static class AdHandler extends Handler {
    private final int ADS_SHOW = 1;
    private final int ADS_HIDE = 0;
    private AdView adBanner; // Variable I want to reach from core module

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        switch (msg.what) {
            case ADS_SHOW:
                adBanner.setVisibility(View.VISIBLE);
                break;

            case ADS_HIDE:
                adBanner.setVisibility(View.GONE);
                break;
        }
    }
}

@Override
protected void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
    RelativeLayout layout = new RelativeLayout(this);
    View view = initializeForView(new MyGdxGame(this), config);
    layout.addView(view);

    implementAds();
    requestAds(layout);

    // Sets the background image
    setContentView(layout);
}

public void implementAds() {
    // Implement ads
    MobileAds.initialize(this, "");

    adHandler = new AdHandler();
    adHandler.adBanner = new AdView(this);
    adHandler.adBanner.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            super.onAdLoaded();
            Log.i(TAG, "Ad loaded ...");
        }
    });

    adHandler.adBanner.setAdSize(AdSize.SMART_BANNER);
    adHandler.adBanner.setAdUnitId("");

}

public void requestAds(RelativeLayout layout) {
    AdRequest.Builder builder = new AdRequest.Builder();
    builder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);
    builder.addTestDevice("");

    RelativeLayout.LayoutParams adBannerParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
    adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);

    layout.addView(adHandler.adBanner, adBannerParams);
    adHandler.adBanner.loadAd(builder.build());
}

@Override
public void showAds(boolean show) {
    adHandler.sendEmptyMessage(show ? adHandler.ADS_SHOW : adHandler.ADS_HIDE);
}
public class AndroidAdsManager implements AdsManager {
  private AdView adBanner;
  private AdHandler adHandler;

    @Override
    public void showAds(boolean show) {
        adHandler.sendEmptyMessage(show ? adHandler.ADS_SHOW : adHandler.ADS_HIDE);
    }
    @Override
    public void implementAds() {
        // Implement ads
        MobileAds.initialize(this, ""); // HERE YOU NEED TO GET THE CONTEXT

        adHandler = new AdHandler();
        adHandler.adBanner = new AdView(this);
        adHandler.adBanner.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                super.onAdLoaded();
                Log.i(TAG, "Ad loaded ...");
            }
        });

        adHandler.adBanner.setAdSize(AdSize.SMART_BANNER);
        adHandler.adBanner.setAdUnitId("");
    }
    // You need to get a RelativeLayout reference for this method to work
    // I would get it from AndroidLauncher
    public void requestAds() {
        AdRequest.Builder builder = new AdRequest.Builder();
        builder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);
        builder.addTestDevice("");

        RelativeLayout.LayoutParams adBannerParams = new 
        RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT);
        adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
        adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);

        layout.addView(adHandler.adBanner, adBannerParams);
        adHandler.adBanner.loadAd(builder.build());
    }
}
public interface AdsManager {
    void implementAds();
    void requestAds(); // Relative layout param removed from here
    void showAds(boolean show);
}
AdsManager

package com.game.mygame.monetization;

public interface AdsManager {
    void showAds(boolean show);
}
public class AndroidLauncher extends AndroidApplication implements AdsManager {

private final String TAG = "AndroidLauncher";
private AdHandler adHandler; // Variable I want to reach from core module

static class AdHandler extends Handler {
    private final int ADS_SHOW = 1;
    private final int ADS_HIDE = 0;
    private AdView adBanner; // Variable I want to reach from core module

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        switch (msg.what) {
            case ADS_SHOW:
                adBanner.setVisibility(View.VISIBLE);
                break;

            case ADS_HIDE:
                adBanner.setVisibility(View.GONE);
                break;
        }
    }
}

@Override
protected void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
    RelativeLayout layout = new RelativeLayout(this);
    View view = initializeForView(new MyGdxGame(this), config);
    layout.addView(view);

    implementAds();
    requestAds(layout);

    // Sets the background image
    setContentView(layout);
}

public void implementAds() {
    // Implement ads
    MobileAds.initialize(this, "");

    adHandler = new AdHandler();
    adHandler.adBanner = new AdView(this);
    adHandler.adBanner.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            super.onAdLoaded();
            Log.i(TAG, "Ad loaded ...");
        }
    });

    adHandler.adBanner.setAdSize(AdSize.SMART_BANNER);
    adHandler.adBanner.setAdUnitId("");

}

public void requestAds(RelativeLayout layout) {
    AdRequest.Builder builder = new AdRequest.Builder();
    builder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);
    builder.addTestDevice("");

    RelativeLayout.LayoutParams adBannerParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
    adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);

    layout.addView(adHandler.adBanner, adBannerParams);
    adHandler.adBanner.loadAd(builder.build());
}

@Override
public void showAds(boolean show) {
    adHandler.sendEmptyMessage(show ? adHandler.ADS_SHOW : adHandler.ADS_HIDE);
}
public class AndroidAdsManager implements AdsManager {
  private AdView adBanner;
  private AdHandler adHandler;

    @Override
    public void showAds(boolean show) {
        adHandler.sendEmptyMessage(show ? adHandler.ADS_SHOW : adHandler.ADS_HIDE);
    }
    @Override
    public void implementAds() {
        // Implement ads
        MobileAds.initialize(this, ""); // HERE YOU NEED TO GET THE CONTEXT

        adHandler = new AdHandler();
        adHandler.adBanner = new AdView(this);
        adHandler.adBanner.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                super.onAdLoaded();
                Log.i(TAG, "Ad loaded ...");
            }
        });

        adHandler.adBanner.setAdSize(AdSize.SMART_BANNER);
        adHandler.adBanner.setAdUnitId("");
    }
    // You need to get a RelativeLayout reference for this method to work
    // I would get it from AndroidLauncher
    public void requestAds() {
        AdRequest.Builder builder = new AdRequest.Builder();
        builder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR);
        builder.addTestDevice("");

        RelativeLayout.LayoutParams adBannerParams = new 
        RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT);
        adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
        adBannerParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);

        layout.addView(adHandler.adBanner, adBannerParams);
        adHandler.adBanner.loadAd(builder.build());
    }
}
public interface AdsManager {
    void implementAds();
    void requestAds(); // Relative layout param removed from here
    void showAds(boolean show);
}

在此之后,如果您希望这些操作影响您的游戏,只需从
AndroidLauncher
将您的游戏实例(核心模块)的引用传递到
androidManager
,就可以从那里调用您想要的任何方法,希望这有帮助

谢谢,但是我的核心包中仍然不能有AdMob类型变量?那么为什么这些存在于AndroidManager中呢?没错,在核心模块中不能有AdMob类型的变量。它们存在于AndroidManager中,因为该类位于Android模块中。AdsManager是核心模块中的一个接口。您的游戏类需要请求一个AdsManager实例的引用(在我建议的构造函数中)(实际上是一个AndroidManager实例)。因此,我试图找出如何从AndroidLauncher获取RelativeLayout和上下文,因为我需要在requestAds()和implementAds()中使用它们,但我无法在requestAds()中传递引用(RelativeLayout布局)由于我无法访问核心模块中的这些变量,我尝试创建一个静态布局变量,但根据Android Studio的说法,这显然会导致内存泄漏。您不希望也不需要调用requestAds(RelativeLayout布局)事实上,从核心模块来看,这毫无意义,因为您根本无法做到。相反,您所做的是从core从AndroidDSManager实例调用requestAds(),记住您的AndroidDSManager类位于ANDROID模块中。您的AdsManager接口位于核心模块中。