10

すべてのデータがビューに読み込まれるまで、方向をブロックしたいだけです。そこで、次のコードについて考えましたが、機能しません。

private class task extends AsyncTask<String, Void, String> {

   protected String doInBackground(String... params) {
      ...
   }

   protected void onPostExecute(String result) {
      ...
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
   }

   protected void onPreExecute() {
      ...
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
   }
}

これらの2行を実行するSENSORNOSENSOR、理由がわからないまま、画面が自動的に水平になります。それが起こっているのでしょうか?

編集: 私は次の行を入れて現在の方向を確認し、次の結果を出しました:

   protected void onPreExecute() {
        if (getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE) {
            Log.e("TAG","LANDSCAPE");
        }else{
            Log.e("TAG","PORTRAIT");
        }
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
   }

Logcatの結果:

LANDSCAPE

しかし、2行(SetRequestedOrientation)を削除すると、logcatでこれを取得できますか?

PORTRAIT
4

3 に答える 3

6

と交換setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);するだけsetRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

そして、何が起こるか教えてください。

エントリーレベルの場合

 protected void onPreExecute() {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
}

出口レベルで

 protected void onPostExecute(String result) {
      ...
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
   }

アップデート:

有線の動作(あなたの場合)が、を使用して現在の方向を取得できる方法は、

int currentOrientation = getResources().getConfiguration().orientation; 

次に、この向きをonPreExecute()..に設定します。

好き、

protected void onPreExecute() {
  ...
  int currentOrientation = getResources().getConfiguration().orientation; 
   if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
   }
   else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
   }
}

単純.. :-)

于 2013-02-05T10:08:03.147 に答える
0

おそらくバグですが、おそらくより良い方法は、作成されているアクティビティについて心配する必要がないように方向をロックすることです...またはさらに良い方法です。

アクティビティのマニフェストでこれを使用します。

android:configChanges="orientation|screenSize|screenLayout"

その後、アクティビティはローテーションで再作成されません(HoneyComb / 3.0以降、アクティビティはローテーションで再作成されません)。

オーバーライドするだけです:

onConfigurationChanged(Configuration newConfig){
  //Handle new orientation
}

そうすれば、操作中に電話の回転が停止した理由をユーザーに混乱させる必要はありません。


また、ライフサイクル非同期タスクが必要な場合は、 Robospiceを確認する価値があります。

于 2013-02-05T10:12:06.513 に答える
0

これを行っているのは、アクティビティの破棄と再作成中に非同期タスクが強制終了されていることがわかったためです。私は正しいですか?

これを処理する正しい方法は、タスクの実行中に方向をロックしないことです。setRequestedOrientationアプローチが機能しないことがバグであることに同意しません。むしろ、アクティビティの方向をロックしてから非同期タスクからロックを解除するというアイデアはサポートされていません。

非同期タスクをアクティビティライフサイクルとの関連付けを解除することで、非同期タスクが強制終了されないようにする方法について、詳細に説明しました。私が提供したソリューションを振り返ると、サービスが実行されていることを確認するためのより良い方法(プロセス間制御とバインドされたサービス)を発見しましたが、包括的な原則が適用されます。非同期タスクを認識android.app.Serviceしない方向でホストし、非同期タスクがサービスとのみ通信できるようにし、サービスがそれにバインドされているアクティビティとのみ通信できるようにします。

これはより標準的なアプローチだと思います。

于 2013-02-05T10:30:21.857 に答える