2012-05-09 4 views
0

이 주제에는 많은 스레드가 있으며 모든 제안 사항으로 문제가 해결되지 않습니다. 이 상황은 백그라운드 서비스가 AlertDialog에 그래프로 표시되는 데이터를 제공하기 때문에 더 복잡합니다. 이 서비스는 LocalBroadcastManager를 사용하여 onCreateDialog 콜백을 포함하는 주 활동에 인 텐트를 전달합니다. 데이터가 매우 빠르게 전달됩니다.오리엔테이션 변경시 AlertDialog 크래시가 발생합니다.

onPause()에서 removeDialog를 호출하여 null로 컨텍스트를 설정 했으므로 스레드가 null 동안 호출하지 못하도록 시도했으며 onStart에서 브로드 캐스트 수신기 신호를 보내는 스레드에 새 컨텍스트를 전달했습니다. 로그 메시지는 호출되는 대화 상자의 제거를 표시합니다. 화면 방향이 변경되면 showDialog() 메서드가 이제 onCreateDialog() 콜백을 트리거합니다. 그 콜백이 신호를하면 대화 상자가 (supposidly) 제거 된 이후 기대하지만 난 아직도 그 무시 무시한 오류를

"java.lang.IllegalStateException를 얻을 같이 findViewById를()는 null를 돌려 : 지정된 아이는 이미 부모가. ""

(AlertDialog에서 'removeView'를 호출하는 방법에 대한 답을 찾을 수없고이 포럼의 아무도 다른 사람에게 답변을 찾을 수없는 항목입니다.) 그 중 하나!)

내가 생각할 수있는 유일한 것은 브로드 캐스트 이벤트가 잘못된 컨텍스트를 가진 대기열에있다. 아마도 방송 수신자로 향하는 모든 Intent를 지우는 방법이 있을까요?

다음은 onCreateDialog 코드입니다. 그래픽보기는 'waveForm.get (id)'에 있습니다. 그것은 멋지게 작동하고 그래프를 보여줍니다 (내가 원하는대로 계속적으로는 아니지만) 그러나 오리 엔테이션 변경에 따라 그것은 죽음입니다!

protected Dialog onCreateDialog(int id) 
{ 
    Log.d(TAG, "Alert Dialog 'onCreateDialog' method has been called with id " + id); 
    if(this.findViewById(id) != null) 
    { 
     Log.d(TAG, "Alert Dialog view exists!"); 
     return null; 
    } 

    switch(id) 
    { 
     case 0: 
     Builder bldr = new AlertDialog.Builder(this); 
     Dialog alert = bldr.setView(waveForm.get(id)).setNegativeButton("Dismiss " + id, 
       new DialogInterface.OnClickListener() 
       { 
        public void onClick(DialogInterface dialog, int id) 
        { 
         dialog.cancel(); 
        } 
       }).create(); 

     alert.getWindow().setLayout(LayoutParams.WRAP_CONTENT, waveForm.get(id).getCurrentHeight()); 
     return alert; 

     case 1: 
     Builder bldr1 = new AlertDialog.Builder(this); 
     Dialog alert1 = bldr1.setView(waveForm.get(id)).setNegativeButton("Dismiss " + id, 
       new DialogInterface.OnClickListener() 
       { 
        public void onClick(DialogInterface dialog, int id) 
        { 
         dialog.cancel(); 
        } 
       }).create(); 

     alert1.getWindow().setLayout(LayoutParams.WRAP_CONTENT, waveForm.get(id).getCurrentHeight()); 
     return alert1; 

     case 2: 
     Builder bldr2 = new AlertDialog.Builder(this); 
     Dialog alert2 = bldr2.setView(waveForm.get(id)).setNegativeButton("Dismiss " + id, 
       new DialogInterface.OnClickListener() 
       { 
        public void onClick(DialogInterface dialog, int id) 
        { 
         dialog.cancel(); 
        } 
       }).create(); 

     alert2.getWindow().setLayout(LayoutParams.WRAP_CONTENT, waveForm.get(id).getCurrentHeight()); 
     return alert2; 

    } 

    return null; 
} 

답변

0

코드를 게시 할 수 있습니까? 그것은 Dialog 자체가 아닌 Dialog에 첨부하는 View 일 것입니다. 첨부 된 경우 현재 부모에서보기를 제거하기 전에 대화 상자에보기를 추가하지 마십시오.

+0

onCreateDialog 코드를 추가했습니다. 뷰가 연결될 수 있도록 화면 방향을 변경할 때까지 작동합니다. 나는 세 개의 대화 상자를 모두 실행하고 하나는 다른 대화 상자 위에 얹어 놓습니다. –