5

基本的には、ボタンを押すと、カメラ インテントを使用してデフォルトのカメラ アプリが開きます。写真が撮られると、必要なものが保存され、別のアクティビティにリダイレクトされます。

このアクティビティには、写真を正常にアップロードできる AsyncTask があります。それで、あなたが尋ねるかもしれない私の問題は何ですか。私の問題は、アクティビティが再作成されるため、ProgressDialog が一緒にリセットされることです。(アクティビティを実行し、aSyncTask を実行し、完了する前に終了し、アクティビティを再作成して asynctask をもう一度実行します。)

これは常に行われるわけではありません。電話の方向を横から縦に変更するため、これが行われると思います。(私はサムスンを持っています。カメラに行くと横向きに変わり、それを終えると縦向きに戻ります。)

私はすでに宿題をして、これらのものをマニフェストに追加しました:

android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait" >

アプリを縦向きに「ロック」したことを確認しましたが、アプリの向きが変わっていることがわかります。これが私のアクティビティが再作成される理由だと思います。

あらゆる種類のチェックを追加することを計画していましたが、アクティビティが再作成されない場合があるため、これはこの状況を処理する正しい方法ではないと思います。

私が話している小切手は、使用することです:

protected void onSaveInstanceState(Bundle outState) {
    outState.putString("started", "1");
}

とにかく、誰かが私を助けることができますか?自己破壊することなくアクティビティをロードしたいだけです。

PS: VM に問題はありません。VM はアクティビティを読み込み、再作成せずに終了します。

PPS: 追加のテストを行いました。Samsung でランドスケープ モードのままにしておくと動作します。したがって、向きの変更で私のアクティビティを破壊しているのは間違いなくカメラです。

4

3 に答える 3

9

私も同じ問題を抱えていました。こちらで説明されているように、API レベル 13 以降での画面サイズの変更もリッスンする必要があることがわかりました。https://stackoverflow.com/a/11483806

android:configChanges="orientation|screenSize"
于 2012-11-22T10:56:40.550 に答える
2

これを修正するには、マニフェスト ファイルで次を使用する必要がありました。

android:screenOrientation="portrait"    
android:launchMode="singleTop"    
android:configChanges="keyboardHidden|orientation|screenSize"
于 2013-07-22T09:18:01.710 に答える
0

進行状況ダイアログの表示と更新を処理するフラグメント アクティビティを作成してみてください

フラグメント アクティビティで、「setRetainInstance(true);」を確認して設定します。これにより、メイン アクティビティが作成/破棄されたときに破棄されないようになります。

asynctask を含め、イメージ キャプチャ プロセス全体をこのフラグメント内に配置することをお勧めします。AsyncTask の doInBackground() 内から親アクティビティのコンテキストを参照しないようにしてください。これを行って向きが変わると (つまり、アクティビティが破棄されると)、エラーがスローされます。

大まかな例を次に示します。

public class MyFragment extends FragmentActivity {

    private ProgressBar mProgressBar;
    private boolean mAsyncTaskActive = false;


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setRetainInstance(true);

        // grab reference to progress bar
        mProgressBar = (ProgressBar) getActivity().findViewById(R.id.my_progress_bar);


        // check to see if the async task is active and set the progress bar visibility accordingly
        if (mAsyncTaskActive) {
            mProgressBar.setVisibility(View.VISIBLE);
            mProgressBarText.setVisibility(View.VISIBLE);
        }


    }

    // this method is called from your main activity when the user does something (i.e. clicks a button)
    // make sure you have already instantiated the fragment

    public void startSomething() {
        if (mAsyncTaskActive == false) {
            mProgressBar.setVisibility(View.VISIBLE);
            new MyAsyncTask().execute();
            mAsyncTaskActive = true;
        }
    }

    private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
        Context applicationContext;



        @Override
        protected Void doInBackground(String... params) {
            // do stuff
            publishProgress(//some number);
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
        }



}

まだ慣れていない場合は、フラグメントの実装方法も確認する必要があります。Android 開発者ブログには、DialogFragments に関する良い記事があり、同じ原理です。http://android-developers.blogspot.com/2012/05/using-dialogfragments.html

于 2012-09-25T18:06:53.180 に答える