The specified child already has a parent. You must call removeView的解決辦法
阿新 • • 發佈:2018-08-12
list create lin interface start ply format 來看 tex
事情是這樣子的,我在一個活動中自定義了一個AlertDialog,通過一個按鈕點擊即可彈出,而後來出現的情況是,第一次點擊就沒問題,
正常跳出,而第二次就直接程序閃退,然後報標題中的錯誤,
這是我的AlertDialog的代碼,和布局
final AlertDialog setTheOrder = new AlertDialog.Builder(Passenger.this) .setView(R.layout.order_layout) .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Overridepublic void onClick(DialogInterface dialog, int which) { //以下都是這個Dialog布局中的一些控件 getLocation("湘潭",startInput.getText().toString(),0); getLocation("湘潭",endInput.getText().toString(),1); startPlace = startInput.getText().toString(); endPlace= endInput.getText().toString(); startTime = getFormatTime(startTimeInput_h.getText().toString(),startTimeInput_m.getText().toString()); endTime = getFormatTime(endTimeInput_h.getText().toString(),endTimeInput_m.getText().toString()); supplyCar= getSupplyCar(canSupplyCar.getText().toString()); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).create(); setTheOrder.show();
再來看這個錯誤,字面意思呢,就是說這個特定的child已經有了一個父布局,必須移除這個布局,才能繼續你的內容,經過一番查找,一個子類View,要使用必須依賴於父類View,如果要使用子類的View,必須先調用父類的removeView的方法才能保證子類的使用(不知道表述的對不對,錯了煩請大佬們指正)
好了,既然大概的思路有了,我們先得得到一個父類對象,我的解決辦法是,通過活動的onCreate方法裏面setContentView裏面那個布局,調用
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); LinearLayout parent = (LinearLayout) inflater.inflate(R.layout.order_layout, null);
這兩個方法得到父類對象,然後使用完這個Dialog之後,調用removeAllViews,在上面AlertDialog的兩個button裏面的最後,調用這個方法
final AlertDialog setTheOrder = new AlertDialog.Builder(Passenger.this) .setView(parent) .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { getLocation("湘潭",startInput.getText().toString(),0); getLocation("湘潭",endInput.getText().toString(),1); startPlace = startInput.getText().toString(); endPlace = endInput.getText().toString(); startTime = getFormatTime(startTimeInput_h.getText().toString(),startTimeInput_m.getText().toString()); endTime = getFormatTime(endTimeInput_h.getText().toString(),endTimeInput_m.getText().toString()); supplyCar = getSupplyCar(canSupplyCar.getText().toString()); parent.removeAllViews(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { parent.removeAllViews(); } }).create(); setTheOrder.show();
我這裏是規定了只能點這兩個按鈕才能結束這個Dialog,其實如果設置了點擊Dialog之外的屏幕區域也可以退出Dialog的話,在相應的方法裏面也要調用
The specified child already has a parent. You must call removeView的解決辦法