
[英]How do I add multiple adapters and listeners to one class in Android Studio?
[英]How do I pass instances of the main class to multiple listeners?
所以,我一直在研究一个插件。 它很棒,直到我偶然发现了一个问题。 我正在使用单独的Listener( implements Listener
)类来管理我的事件,但对于其中一些,我需要访问JavaPlugin
方法,比如获取配置文件。
在我的监听器类中使用下面的构造函数,但如果我尝试在另一个类中使用相同的东西,Eclipse会给它一个可爱的红色下划线,说blank final field plugin may have not been initialized
private final MainClass plugin;
public ListenerClass(MainClass instance){
this.plugin = instance;
}
如前所述,上面的代码可以工作,但只适用于一个监听器。 下面的构造函数在使用返回对象的方法时抛出NPE。 我不知道这是否是因为插件实例真的返回为null
或者如果没有手柄, 如果是null
。
// The only difference between this constructor and the last is that the final
// modifier was removed.
private MainClass plugin;
public ListenerClass(MainClass instance){
this.plugin = instance;
}
FileConfiguration config = plugin.getConfig(); // throws NPE
// Let's pretend that the line above isn't there, and I just use the getConfig() method instead.
@EventHandler
public void onJoin(PlayerJoinEvent event){
if(plugin.getConfig().getString("Strings.cat-toy").toLowerCase().equals("string")){ // throws NPE
// do stuff
}
}
我做了一些与大多数人不同的事情。 假设您extends JavaPlugin
的类是Main.java
,您可以在任何方法中添加以下代码:
public static Main plugin;
然后在你的onEnable()
添加它:
plugin = this
所以,你的Main
类看起来像这样。
public class Main extends JavaPlugin{
public static Main plugin; //create the variable
@Override
public void onEnable(){
plugin = this; //assign plugin to this class
//other onEnable things
}
@Override
public void onDisable(){
//onDisable things
plugin = null; //best to put this AFTER running any methods here
}
}
然后,在任何要使用JavaPlugin
方法的类中,只需使用Main.plugin
所以,如果你想在另一个类中获得插件的配置,你可以这样做:
YamlConfiguration config = Main.plugin.getConfig();
只需确保在将plugin
分配到主文件后执行此操作。 假设Handler.setup()
使用YamlConfiguration config = Main.plugin.getConfig();
在其中,并且您希望在启用插件时运行该方法。 你可以这样做:
public void onEnable(){
plugin = this;
Handler.setup();
}
但不是这个:
public void onEnable(){
Handler.setup();
plugin = this;
}
你必须重新发明Singleton模式 。
public class MainClass extends JavaPlugin {
private static MainClass instance;
public MainClass() {
instance = this;
}
public static MainClass getInstance() {
return instance;
}
@Override
public void onEnable() {
Listener listener = new ListenerClass();
}
}
您现在可以直接访问实例,而无需在ListenerClass
创建成员变量。
public class ListenerClass implements Listener {
public ListenerClass() {
Plugin main = MainClass.getInstance();
main.getServer().getPluginManager().registerEvents(this, main);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.