LibGDX 从核心模块 (MyGdxGame) 中的 android 模块 (AndroidLauncher) 获取变量?
LibGDX get variables from android module (AndroidLauncher) in the Core module (MyGdxGame)?
所以我看到了这篇关于它的文章,它解决了我猜想的一些问题。
Link:
但是,我使用的是 AdMob 和 Firebase 集成,因此我使用了 AdView、AdRequest 和 MobileAds 等。我在 AndroidLauncher 中使用它们并且工作正常,但是当尝试实现一个名为AdsManager 并创建一个 AdView 类型的变量,它无法解析它。我猜是因为我不在 android 模块中。 那么,当我在核心模块 (MyGdxGame) 中时,如何从 AndroidLauncher 获取 "AdMob type" 变量?
示例:
Android模块
AdsManager
package com.game.mygame.monetization;
public interface AdsManager {
void showAds(boolean show);
}
Android启动器
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);
}
}
当尝试创建一个名为 AndroidAdsManager 的 class 实现 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,您无法从核心模块中的 classes 访问 AdView 或 AdHandler,您需要做的是使用它们(如您提供的 link 所示)您在实现 AdsManager 接口
的 AndroidAdsManager class 中实现的所有逻辑
我的方法是,每当你想用 Android 模块中的类型做某事时,在 AndroidAdsManager 中有一个方法做那件事,你将需要在中创建方法AdsManagerInterface 以便调用它们:
AndroidAdsManager
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());
}
}
AdsManager
public interface AdsManager {
void implementAds();
void requestAds(); // Relative layout param removed from here
void showAds(boolean show);
}
在此之后,如果您希望这些操作影响您的游戏,只需将您的游戏实例(核心模块)的引用从 AndroidLauncher
传递到 AndroidAdsManager
即可调用任何您想要的方法,希望对您有所帮助!
所以我看到了这篇关于它的文章,它解决了我猜想的一些问题。
Link:
但是,我使用的是 AdMob 和 Firebase 集成,因此我使用了 AdView、AdRequest 和 MobileAds 等。我在 AndroidLauncher 中使用它们并且工作正常,但是当尝试实现一个名为AdsManager 并创建一个 AdView 类型的变量,它无法解析它。我猜是因为我不在 android 模块中。 那么,当我在核心模块 (MyGdxGame) 中时,如何从 AndroidLauncher 获取 "AdMob type" 变量?
示例: Android模块
AdsManager
package com.game.mygame.monetization;
public interface AdsManager {
void showAds(boolean show);
}
Android启动器
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);
}
}
当尝试创建一个名为 AndroidAdsManager 的 class 实现 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,您无法从核心模块中的 classes 访问 AdView 或 AdHandler,您需要做的是使用它们(如您提供的 link 所示)您在实现 AdsManager 接口
的 AndroidAdsManager class 中实现的所有逻辑
我的方法是,每当你想用 Android 模块中的类型做某事时,在 AndroidAdsManager 中有一个方法做那件事,你将需要在中创建方法AdsManagerInterface 以便调用它们:
AndroidAdsManager
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());
}
}
AdsManager
public interface AdsManager {
void implementAds();
void requestAds(); // Relative layout param removed from here
void showAds(boolean show);
}
在此之后,如果您希望这些操作影响您的游戏,只需将您的游戏实例(核心模块)的引用从 AndroidLauncher
传递到 AndroidAdsManager
即可调用任何您想要的方法,希望对您有所帮助!