2012-11-14 2 views
0

대화 상자를 표시하는 AsyncTask가 있습니다. 장치를 돌릴 때이 부분이 사라지지 않게하고 싶습니다.AsyncTask 및 대화 상자는 장치 회전에서 생존합니다.

내 솔루션은 Activity가 죽을 때 죽지 않는다는 것을 Application 클래스에 저장하는 것입니다. 액티비티가 종료되면 단순히 대화 상자를 닫습니다. 다시 시작하면 대화 상자가 표시됩니다.

이것이 작동하는 것 같습니다. 장치가 회전하면 대화 상자가 사라지고 새 작업으로 다시 나타납니다. 유일한 문제는 회전 후에 Dialog가 더 이상 움직이지 않는다는 것입니다. 원래의 방향으로 다시 회전하면 정지 된 지점에서부터 애니메이션이 계속 진행됩니다.

왜 이런 일이 발생합니까? 이 문제를 어떻게 해결할 수 있습니까? 캐톨

public class OrientationActivity extends Activity { 
    MyApplication application; 

    public class LongOperation extends AsyncTask<String, Void, String> { 
      private ProgressDialog dialog; 

      public LongOperation(Context context) { 
       dialog = new ProgressDialog(context); 
       dialog.setCanceledOnTouchOutside(false); 
      } 

      @Override 
      protected void onPreExecute() { 
       this.dialog.setMessage("Busy!"); 
       this.dialog.show(); 
      } 

      @Override 
      protected String doInBackground(String... params) { 
       while(true){ 

       } 
      }  

      @Override 
      protected void onPostExecute(String result) {       
       if(dialog != null && dialog.isShowing()) 
        dialog.dismiss(); 
      } 
    } 

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

     application = (MyApplication) getApplication(); 

     if(application.longOperation == null) { 
      application.longOperation = new LongOperation(this); 
      application.longOperation.execute(); 
     } 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

     application.longOperation.dialog.dismiss(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     application.longOperation.dialog.show(); 
    } 
} 

public class MyApplication extends Application 
{ 
    LongOperation longOperation = null; 
} 
+0

[Android에서 화면 회전시 대화 삭제 방지] (http://stackoverflow.com/questions/7557265/prevent-dialog-dismissal-on-screen-rotation-in-android) –

답변

0

좋아에 물어 주시기 경우 이전 방향을

와 같은 상태입니다. 이것이 모범 사례로 간주되는지 여부에 대한 의견을 환영합니다. 참고로, 이전 버전과의 호환성을 위해 v4 지원 라이브러리가 포함되어 있습니다.

내 활동

package ie.cathalcoffey.android.orientation; 

import android.content.Context; 
import android.content.res.Configuration; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.support.v4.app.FragmentActivity; 

public class OrientationActivity extends FragmentActivity implements FireMissilesDialogFragment.NoticeDialogListener{ 
    MyApplication application; 
    boolean rotated; 
    public class LongOperation extends AsyncTask<String, Void, String> { 
      private FireMissilesDialogFragment dialog; 

      public LongOperation(Context context) { 
       dialog = new FireMissilesDialogFragment(); 
       dialog.show(getSupportFragmentManager(), ""); 
      } 

      @Override 
      protected void onCancelled() { 
       if(dialog != null && dialog.isVisible()) 
        dialog.dismiss(); 
      } 

      @Override 
      protected void onPreExecute() { 
      } 

      @Override 
      protected String doInBackground(String... params) { 
       while(true){ 

        if(this.isCancelled()) 
         break; 

       } 

       return null; 
      }  

      @Override 
      protected void onPostExecute(String result) {       

      } 
    } 

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

     application = (MyApplication) getApplication(); 

     if(application.longOperation == null) { 
      application.longOperation = new LongOperation(this); 
      application.longOperation.execute(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 

     if(application.longOperation != null) 
     { 
      application.longOperation.cancel(true); 
      application.longOperation = null; 
     } 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
    } 

    @Override 
    public void onDialogPositiveClick(DialogFragment dialog) { 
     if(application.longOperation != null) 
     { 
      application.longOperation.cancel(true); 
      application.longOperation = null; 
     } 
    } 

    @Override 
    public void onDialogNegativeClick(DialogFragment dialog) { 
     if(application.longOperation != null) 
     { 
      application.longOperation.cancel(true); 
      application.longOperation = null; 
     } 
    } 
} 

내 DialogFragment

package ie.cathalcoffey.android.orientation; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 

public class FireMissilesDialogFragment extends DialogFragment { 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Use the Builder class for convenient dialog construction 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setMessage("Whatever") 
       .setPositiveButton("fire", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         mListener.onDialogPositiveClick(FireMissilesDialogFragment.this); 
        } 
       }) 
       .setNegativeButton("cancel", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         mListener.onDialogNegativeClick(FireMissilesDialogFragment.this); 
        } 
       }); 
     // Create the AlertDialog object and return it 
     return builder.create(); 
    } 

    /* The activity that creates an instance of this dialog fragment must 
    * implement this interface in order to receive event callbacks. 
    * Each method passes the DialogFragment in case the host needs to query it. */ 
    public interface NoticeDialogListener { 
     public void onDialogPositiveClick(DialogFragment dialog); 
     public void onDialogNegativeClick(DialogFragment dialog); 
    } 

    // Use this instance of the interface to deliver action events 
    NoticeDialogListener mListener; 

    // Override the Fragment.onAttach() method to instantiate the NoticeDialogListener 
    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     // Verify that the host activity implements the callback interface 
     try { 
      // Instantiate the NoticeDialogListener so we can send events to the host 
      mListener = (NoticeDialogListener) activity; 
     } catch (ClassCastException e) { 
      // The activity doesn't implement the interface, throw exception 
      throw new ClassCastException(activity.toString() 
        + " must implement NoticeDialogListener"); 
     } 
    } 
} 

내 응용 프로그램

package ie.cathalcoffey.android.orientation; 
import ie.cathalcoffey.android.orientation.OrientationActivity.LongOperation; 
import android.app.Application; 


public class MyApplication extends Application 
{ 
    LongOperation longOperation = null; 
} 

마지막으로 내 매니페스트

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="ie.cathalcoffey.android.orientation" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="15" /> 

    <application 
     android:name=".MyApplication" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".OrientationActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
0

당신의 onConfigurationChanged을 추가하려고 있나요?

@Override 
     public void onConfigurationChanged(Configuration newConfig) { 
      super.onConfigurationChanged(newConfig); 

      if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){ 

       Log.e("TAG","LANDSCAPE"); 

      }else{ 

       Log.e("TAG","PORTRAIT"); 

      } 


     } 

이 추가하면 당신이 방향을 처리 할 수있는 당신이 활동이 후 다시 만들어집니다 방향을 변경 한 경우이를 추가하지 않은 경우,이 활동이 다시 생성되지 않습니다 추가하지만 최신 상태로 유지됩니다 당신은 어떤 질문이 주석 :이 다음이 최고의 해결책이 나타납니다

+0

나는 당신을 생각하지 않는다. 내 질문을 매우 신중하게 읽었습니다. 귀하의 회신은 도움이되지 않았습니다. 오리엔테이션 변경을 감지하고 싶지 않습니다. 내가 게시 한 솔루션은 고정 된 애니메이션 부작용과 완전히 별개로 작동합니다. 내 질문은이 부작용에 관한 것입니다. –

+0

아, 죄송합니다. 다시 읽고 다시 생각해 보겠습니다. –

관련 문제