0

ダイアログを表示するAsyncTaskがあります。デバイスを回転させたときにこれが消えないようにしたいと思います。

私の解決策は、それをApplicationクラスに格納することです。そうすれば、アクティビティが停止しても停止しません。アクティビティが終了したら、ダイアログを閉じるだけです。再開すると、ダイアログを表示するだけです。

これは機能しているようです。デバイスを回転させると、ダイアログが消えて、新しいアクティビティで再表示されます。唯一の問題は、回転後、ダイアログがアニメーション化されなくなることです。さらに奇妙なのは、元の方向に再回転すると、アニメーションが停止した場所から続行されることです。

なぜこうなった?この問題を解決するにはどうすればよいですか?カタール

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;
}
4

2 に答える 2

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");

            }


        }

これを追加するとオリエンテーションを処理できます。これを追加しなかった場合は、オリエンテーションを変更するとアクティビティが再作成されます。これを追加すると、アクティビティは再作成されませんが、現在の状態は前のオリエンテーションと同じになります。

ご不明な点がございましたら、コメント欄でお気軽にお問い合わせください:)

于 2012-11-14T08:53:37.883 に答える
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>
于 2012-11-14T12:42:37.607 に答える