Android 如何从动态加载的类调用.showDialog()

Android 如何从动态加载的类调用.showDialog(),android,dialog,dynamic-controls,Android,Dialog,Dynamic Controls,我正在创建一个家庭自动化应用程序,允许插件视图。我已经能够在单独的项目(apk)中创建一个类作为示例插件: 我可以在运行时加载此类并创建其实例: try { final File filesDir = this.getFilesDir(); final File tmpDir = getDir("dex", 0); final DexClassLoader classloader = new DexClassLoader( file

我正在创建一个家庭自动化应用程序,允许插件视图。我已经能够在单独的项目(apk)中创建一个类作为示例插件:

我可以在运行时加载此类并创建其实例:

        try {
        final File filesDir = this.getFilesDir();
        final File tmpDir = getDir("dex", 0);
        final DexClassLoader classloader = new DexClassLoader( filesDir.getAbsolutePath()+"/testloadclass.apk",
                tmpDir.getAbsolutePath(),
                null, this.getClass().getClassLoader());
        final Class<View> classToLoad = 
                (Class<View>) classloader.loadClass("com.strutton.android.testloadclass.MyTestClass_IRDroidUIPlugIn");
        mybutton = (View) classToLoad.getDeclaredConstructor(Context.class).newInstance(this);
        mybutton.setId(2);
        main.addView((View)mybutton);
      } catch (Exception e) {
        e.printStackTrace();
    }

    setContentView(main);
}
protected Dialog onCreateDialog(int id) {
    switch (id) {
        case 1:
            return ((IRDroidInterface) mybutton).buildConfigDialog(id);
    }
    return null;
}
试试看{
final File filesDir=this.getFilesDir();
最终文件tmpDir=getDir(“dex”,0);
final DexClassLoader classloader=新的DexClassLoader(filesDir.getAbsolutePath()+“/testloadclass.apk”,
tmpDir.getAbsolutePath(),
null,this.getClass().getClassLoader());
最终类classToLoad=
(Class)classloader.loadClass(“com.strutton.android.testloadclass.MyTestClass_IRDroidUIPlugIn”);
mybutton=(视图)classToLoad.getDeclaredConstructor(Context.class).newInstance(此);
mybutton.setId(2);
main.addView((视图)mybutton);
}捕获(例外e){
e、 printStackTrace();
}
setContentView(主);
}
受保护的对话框onCreateDialog(int id){
开关(id){
案例1:
返回((IRDroidInterface)mybutton).buildConfigDialog(id);
}
返回null;
}
我希望插件能够显示一个配置对话框。是否有一种方法可以将Activity对象传递给此类,使其可以使用.showDialog(ID)。这将是理想的,这样可以正确管理对话框生命周期


提前谢谢。

也许我遗漏了什么,但你为什么不能这样做呢

public class MyTestClass_IRDroidUIPlugIn extends Button implements IRDroidInterface{
    Activity mContext;
    public MyTestClass_IRDroidUIPlugIn(Activity context) {
        super(context);
        mContext = context;
        ...
        setOnClickListener(new View.OnClickListener() {  
            public void onClick(View v) {  
                mContext.showDialog(1);
            }}  

        );

.....
}

当你创建这个类时,你已经将
活动
传递到这个类中了,所以只要使用它。

我将
上下文
传递到这个类中。活动是上下文,但不幸的是上下文不是活动<代码>错误:方法showDialog(int)对于类型Context MyTestClass_IRDroidUIPlugIn.java/testloadclass/src/com/strutton/android/testloadclass line 22 java Problem@cstrutton未定义:如果您注意到我在回答中,我将构造函数和成员变量中的参数类型从Context更改为Activity。当您将上下文传递到构造函数中时,实际上是在传递活动——只需声明它并使用它即可。当然,您也需要为此更改抽象超类。再次感谢。似乎我有另一个问题与相同的代码有关。我加载了两次接口(一次在主代码中,一次在插件中)。一旦我明白了这一点,其余的就开始起作用了。不过有一件事:我编辑了上面的代码,将活动转换为上下文。Eclipse在抱怨。我这样做是因为我的测试类扩展了按钮。这是可以接受的?@cstruton你演得怎么样?也许你只是缺少了一对括号。我的错误是把我的界面变成了两个项目(主应用程序和插件)的一个comon文件,而不是创建一个库项目并在这两个项目中引用它。正如我所能想到的,我加载了两次接口,并且出现了强制转换异常。我还没有机会测试这一点,但我确信情况确实如此。我必须说我对Android框架非常满意。我尝试的每一件事都很有效。然后,当一些事情没有发生时,我会变得非常沮丧,因为我确信我只是在某个地方漏掉了一个括号或逗号。
public class MyTestClass_IRDroidUIPlugIn extends Button implements IRDroidInterface{
    Activity mContext;
    public MyTestClass_IRDroidUIPlugIn(Activity context) {
        super(context);
        mContext = context;
        ...
        setOnClickListener(new View.OnClickListener() {  
            public void onClick(View v) {  
                mContext.showDialog(1);
            }}  

        );

.....
}