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

时间:2012-04-19 16:24:53

标签: android dialog dynamic-controls

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

public class MyTestClass_IRDroidUIPlugIn extends Button implements IRDroidInterface{
    Context mContext;
    public MyTestClass_IRDroidUIPlugIn(Context context) {
        super(context);
        mContext = context;
        setText("I was loaded dynamically! (1)");
        setOnClickListener(new View.OnClickListener() {  
            public void onClick(View v) {  
                    // how do I show the dialog from here? 
                Activity.showDialog(1);
            }}  
                );
    }
    public Dialog buildConfigDialog(int ID){
        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setMessage("Click the Button...(1)")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.dismiss();
               }           
           });
        return builder.create();
    }

}

我可以在运行时加载这个类并创建它的实例:

        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;
}

我希望插件能够显示配置对话框。有没有办法可以将Activity对象传递给这个类,以便它可以使用.showDialog(ID)。这将是理想的,以便可以正确管理对话生命周期。

提前致谢。

1 个答案:

答案 0 :(得分:2)

也许我错过了什么,但为什么你不能做这样的事情?

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);
            }}  

        );

.....
}

当你创建这个类时,你已经将Activity传递给了这个类 - 所以只需使用它。