2014-02-17 109 views
0

我想在第二個對話框中用後退按鈕顯示一個嵌套的對話框,點擊哪個用戶被顯示第一個對話框。我的代碼如下:Android嵌套對話框 - 指定的孩子已經有父母

public class FileOpenMenuDelegate { 
    AlertDialog.Builder fileOpenBuilderFolder = null; 
    AlertDialog fileOpenBuilderFolderDialog = null; 
    AlertDialog.Builder fileOpenBuilder = null; 
    AlertDialog fileOpenBuilderDialog = null; 

    public void setSelectedItem(int position) { 
     selectedItem = position; 
    } 

    public FileOpenMenuDelegate(Context context, View view) { 
     this.context = context; 
     this.view = view; 
     fileOpenBuilderFolder = new AlertDialog.Builder(context); 
     fileOpenBuilder = new AlertDialog.Builder(context); 
    } 

    public void fileOpenMenu() { 

     final CharSequence[] foldernames = getAllFolders(); 


     if (foldernames == null) { 
      //Handle 
     } else { 

      LayoutInflater inflater = LayoutInflater.from(context); 
      View convertView = (View) inflater.inflate(R.layout.dialog_list_layout, null); 

      ListView lv = (ListView) convertView.findViewById(R.id.listExample); 

      selectedAdapter = new CustomAdapter(context, 0, Arrays.asList(foldernames)); 
      lv.setAdapter(selectedAdapter); 

      fileOpenBuilderFolder.setTitle(FAC.OPEN_FOLDERS); 
      fileOpenBuilderFolder.setView(convertView); 

      selectedAdapter.setSelectedPosition(2); 

      lv.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView arg0, View view, 
             int position, long id) { 
        fileOpenBuilderFolderDialog.dismiss(); 
        selectedAdapter.setSelectedPosition(position - 1); 

        String selectedFolder = foldernames[position].toString(); 

        //Sub window 

        final CharSequence[] allFiles = getAllFiles(); 

        LayoutInflater inflater = LayoutInflater.from(context); 
        View convertView = (View) inflater.inflate(R.layout.dialog_list_layout, null); 
        ListView subListView = (ListView) convertView.findViewById(R.id.listExample); 
        fileOpenBuilder.setTitle("Test"); 

        subMenuAdapter = new CustomAdapter(context, 0, Arrays.asList(allFiles)); 
        subListView.setAdapter(subMenuAdapter); 

        fileOpenBuilder.setView(convertView); 

        subListView.setOnItemClickListener(new OnItemClickListener() { 
         @Override 
         public void onItemClick(AdapterView arg0, View view, 
               int position, long id) { 
          fileOpenBuilderDialog.dismiss(); 
          if (position == 0) { 
           fileOpenBuilderFolderDialog.dismiss(); 
           fileOpenBuilderFolderDialog = fileOpenBuilderFolder.create(); 
           fileOpenBuilderFolderDialog.show();************Error Line*************** 
          } 
         } 
        }); 

        fileOpenBuilderDialog = fileOpenBuilder.create(); 
        fileOpenBuilderDialog.show(); 
       } 
      }); 

     } 

     fileOpenBuilderFolderDialog = fileOpenBuilderFolder.create(); 
     fileOpenBuilderFolderDialog.show(); 
    } 

} 

一切正常,只是當我點擊第二警報的第一個項目很好,我已經寫了再次展示了第一個對話框的代碼 - 這使我的錯誤「指定的孩子已經有一個父錯誤「。我究竟做錯了什麼 ?請幫忙。

異常日誌::

  02-17 12:38:59.250: E/AndroidRuntime(27702): FATAL EXCEPTION: main 
    02-17 12:38:59.250: E/AndroidRuntime(27702): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.view.ViewGroup.addViewInner(ViewGroup.java:3672) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.view.ViewGroup.addView(ViewGroup.java:3543) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.view.ViewGroup.addView(ViewGroup.java:3519) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at com.android.internal.app.AlertController.setupView(AlertController.java:402) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at com.android.internal.app.AlertController.installContent(AlertController.java:242) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.app.AlertDialog.onCreate(AlertDialog.java:336) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.app.Dialog.dispatchOnCreate(Dialog.java:375) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.app.Dialog.show(Dialog.java:261) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at edu.delegates.FileOpenMenuDelegate$2$1.onItemClick(FileOpenMenuDelegate.java:196) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.widget.AdapterView.performItemClick(AdapterView.java:301) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.widget.AbsListView.performItemClick(AbsListView.java:1287) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.widget.AbsListView$PerformClick.run(AbsListView.java:3078) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.widget.AbsListView$1.run(AbsListView.java:4161) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.os.Handler.handleCallback(Handler.java:615) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.os.Handler.dispatchMessage(Handler.java:92) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.os.Looper.loop(Looper.java:137) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at android.app.ActivityThread.main(ActivityThread.java:4921) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at java.lang.reflect.Method.invokeNative(Native Method) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at java.lang.reflect.Method.invoke(Method.java:511) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
    02-17 12:38:59.250: E/AndroidRuntime(27702): at dalvik.system.NativeStart.main(Native Method) 
+0

爲什麼要關閉並顯示對話框?爲什麼不讓第二個對話框覆蓋第一個對話框呢?然後,在解散第二個對話框時,第一個對話框將已經在那裏,而沒有任何邏輯在你的末端? –

回答

2

由於列表視圖是第一個警報對話框的孩子,我得到了錯誤。我使用它來修復它

((ViewGroup) mainListView.getParent()).removeView(mainListView); 

在創建新對話框之前。這是解決問題的方法。

1

您嘗試添加View已經有一個父。這裏是什麼?

at edu.asu.fact.delegates 
    .FileOpenMenuDelegate$2$1 
    .onItemClick(FileOpenMenuDelegate.java:196) 

編輯

沒有必要保持AlertDialogAlertDialog.Builder變量作爲類成員。嘗試在每次需要時在本地創建它們。

+0

我已經更新了問題中的錯誤行。發生異常的行是 fileOpenBuilderFolderDialog.show(); – KarthikJ

+0

我已經做了一個編輯,請嘗試這個解決方案,讓我知道它是否有幫助。 – nikis

+0

感謝您的及時回覆。我將這些變量保存在類級別的原因是,如果它是本地的,那麼在列表視圖onclick方法內使用它們必須是最終的。這意味着我不能使用fileOpenBuilderDialog = fileOpenBuilder.create();無論我想要什麼,因爲它必須在開始時進行初始化。 – KarthikJ

相關問題