【问题标题】:How to implement a dialog for different activities?如何为不同的活动实现对话?
【发布时间】:2011-09-23 22:16:29
【问题描述】:

我想在不同的活动中显示相同的对话框。我试图制作一个BaseActivitiy。活动扩展了我的 BaseActivity。到目前为止有效,但现在我想更新在对话框关闭时显示对话框的 Activity。在我的例子中,更新意味着用 SQLite 数据库中的数据填充列表视图。

我还尝试检索类名以使用这些活动的更新方法。但是无法将更新方法更改为静态,因为非静态 SQL 方法...

你有什么想法吗?

活动:

    public class MyActivity extends Dialogs {
        ...
        @Override  
        public boolean onContextItemSelected(MenuItem item) { 
            AdapterContextMenuInfo info = (AdapterContextMenuInfo)  item.getMenuInfo();
            int idx = info.position;
            switch (item.getItemId()) {

                case CONTEXTMENU_ID:
                   showMyDialog(this,DIALOG_ID);
                   break;
            }      
        return true;
       }

       public void update() {
           ...
       }
    }

对话框类

    public class Dialogs extends Activity {
         @Override
         protected Dialog onCreateDialog(int id) {
              ...
         }
         ...
         //Called on Dialog-Butten press
         private void ReloadActivity(){
             if(DialogCalledByClass.contains("MyActivity")) {
                 MyActivity.update();// It doesn't worke because non-static....
              }
              else if(DialogCalledByClass.contains("MyActivity2")) {

              }
         }

         public void showMyDialog(Context ctx,int id) {
             showDialog(id);
             DialogCalledByClass =ctx.getClass().toString();
         }
     }

这就是我尝试过的......

【问题讨论】:

  • 你检索的是什么类名? UpdateMethod 位于何处?请提供更多详细信息并显示您的代码。

标签: android android-activity dialog


【解决方案1】:

例如...您可以创建自己的对话框,而不是创建 BaseActivity:

class myDialog extends AlertDialog {
   Activity myActivity;

   public myDialog(Activity myAct){
      myActivity=myAct;
   }

   @Override
   public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setContentView(R.layout.my_dialog);
      ...
      ...
   }

   @Override
   public void dismiss(){
      myActivity.update();
   }


   @Override
   public void cancel(){
      myActivity.update();
   }

}

我不知道我是否理解您的问题,但这是一个想法。希望对你有帮助。

【讨论】:

  • 这是正确的方向。如果我在活动中调用myDialog(?),我应该使用什么作为参数?
  • 您在活动中调用myDialog(this)。但要小心 myActivity 的类型,因为如果您的活动扩展了 ListActivity,您必须更改类型。
  • 现在我将 showMyDialog 更改为 public void showMyDialog(Activity act,int id){ act.update();} 但它不起作用,因为 update() 未定义类型 Activity...。
  • 好的,抱歉,我了解到您在管理 SQLite DB 和填充 listView 的活动中有更新方法。那么,您的更新方法在哪里?它的代码是什么?
  • 我认为你的解决方案太复杂了。如果方法更新它在对话框类中,您可以在方法取消或关闭或隐藏(覆盖它)中调用它。你可以在Activity中做(new myDialog(this)).show()不要使用onCreateDialog方法。
【解决方案2】:

我找到了解决方案。谢谢你大卫!!抱歉,我无法投票,因为声誉降低...

private void ReloadActivity(){
    if(DialogCalledByClass.contains("MyActivity")){
        try {
            Method m = DialogActivity.getClass().getMethod("Update");
            try {
                m.invoke(DialogActivity);
            } catch (IllegalArgumentException e) {

                e.printStackTrace();
            } catch (IllegalAccessException e) {

                e.printStackTrace();
            } catch (InvocationTargetException e) {

                e.printStackTrace();
            }


        } catch (SecurityException e) {

            error.d(TAG, "SecurityException"+ e);
            e.printStackTrace();
        } catch (NoSuchMethodException e) {

            Log.d(TAG, "NoSuchMethodException"+ e);
        }

    }
    else if(DialogCalledByClass.contains("MyActivity2")){

    }
}




public void showMyDialog(Activity act,int id){
    showDialog(id);

    DialogCalledByClass = act.getClass().toString();
    DialogActivity = act;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 2023-04-11
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多