2012-04-19 42 views
0

我正在創建一個允許插件視圖的家庭自動化應用程序。我已經能夠在一個單獨的項目來創建一個類爲樣本插件(APK):如何從動態加載的類調用.showDialog()

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)。這將是理想的,因此對話生命週期可以得到適當的管理。

在此先感謝。

回答

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這個類 - 所以只是用它。

+0

我將'Context'傳遞給這個類。活動是一種背景,但不幸的是背景不是一種活動。 '錯誤: 方法的ShowDialog(INT)是未定義的類型上下文\t MyTestClass_IRDroidUIPlugIn.java \t/testloadclass/src目錄/ COM/strutton /安卓/ testloadclass \t線22 \t的Java Problem' – cstrutton 2012-04-19 17:29:37

+0

@cstrutton:如果您在我的回答通知,我將構造函數和成員變量中的參數類型從上下文更改爲活動。當你將Context傳遞給構造函數時,你實際上正在傳遞活動 - 只需聲明它並使用它即可。當然,您也需要更改抽象超類。 – 2012-04-19 17:34:18

+0

再次感謝。看起來我有與同樣的代碼綁定的另一個問題。我加載了兩次接口(一次在主代碼中,一次在插件中)。一旦我明白了這一點,其他人就開始工作了。有一件事:我編輯了上面的代碼來將活動投射到上下文。 Eclipse在抱怨。我做了這個,因爲我的測試類擴展了Button。這是可以接受的? – cstrutton 2012-04-20 00:10:30