9

動画の全画面表示用のボタンで動画を再生するアプリを作成する必要があります。このボタンは、ビデオディスプレイの横向きと縦向きを手動で切り替えるために使用されます。自動回転を検出したくありません。したがって、マニフェストファイルは次のように設定されます。

<activity
    android:name=".VideoActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden"/>

使用しました

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);またsetRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);

向きを手動で設定します。動作しますが、アクティビティを再開します-onCreate()が呼び出されたことがわかりました。そのため、ビデオの再生が予期せず最初から再開されます。onConfigurationChanged()自動回転検出方式のようにスムーズにすることはできません。

では、アクティビティを再開せずに手動で画面の向きを変更するにはどうすればよいですか?

ありがとうございました。

4

6 に答える 6

6

マナウルの向きを変更する場合:

<activity
    android:name=".VideoDetails"
    android:configChanges="orientation"/>

public class VideoDetails extends Activity {
    ...
    onStart() {
        setRequestedOrientation(orientation);
    }
    onConfigurationChanged(Configuration newConfig){
        // do stuff for orientation change.
    }
    onClick() {
        setRequestedOrientation(orientation);
    }
}

自動方向検出の場合:

<activity
    android:name=".VideoDetails"
    android:configChanges="orientation"/>

public class VideoDetails extends Activity {
    ...
    onConfigurationChanged(Configuration newConfig){
        // do stuff for orientation change.
    }
}
于 2013-05-29T04:09:53.757 に答える
2

http://developer.android.com/guide/topics/resources/runtime-changes.html「構成変更の処理」という見出しの下にあるリンクを確認できます。

<activity android:name=".MyActivity"
      android:configChanges="orientation|keyboardHidden"
      android:label="@string/app_name">

現在、これらの構成の1つが変更されても、MyActivityは再起動しません。代わりに、MyActivityはonConfigurationChanged()への呼び出しを受け取ります。このメソッドには、新しいデバイス構成を指定するConfigurationオブジェクトが渡されます。

 android:configChanges="orientation|screenSize" (andorid 3.2 and above screen size also changes. add this)

ビデオが10分だとします。ビデオは5分まで再生され、向きが変わります。5分まで再生されたことがわかります。

ビデオの実際の進行状況をonSaveInstanceState()に保存し、保存したデータをバンドルからonRestoreInstanceState()に取得できます。その後、進行状況データを使用して、またはデータが保存されていない場合は最初から再生を開始できます。

向きが変わると、アクティビティは破棄されて再作成されます。データを保存して保持したい場合は、以下のようにして大量のデータを保存できます

 @Override
 public Object onRetainNonConfigurationInstance() {
 final MyDataObject data = collectMyLoadedData();
 return data;
 }


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

final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
if (data == null) {
    data = loadMyData();
}

}

小さなデータセットの場合

 @Override
 public void onSaveInstanceState(Bundle savedInstanceState) {
 super.onSaveInstanceState(savedInstanceState);
 // Save UI state changes to the savedInstanceState.
 // This bundle will be passed to onCreate if the process is
 // killed and restarted.
 savedInstanceState.putString("NICK_NAME", Name);//save nick name
 }

 @Override
 public void onRestoreInstanceState(Bundle savedInstanceState) {
 super.onRestoreInstanceState(savedInstanceState);
 // Restore UI state from the savedInstanceState.
 // This bundle has also been passed to onCreate.
 Name = savedInstanceState.getString("NICK_NAME");//restore nick name
 }

向きを確認するには

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

// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
    Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}

AndroidのVideoView。この場合、ビデオもサーバーからストリーミングされます。受け入れられた回答を確認してください(一般的な回答)。私が提案したのとまったく同じです。

于 2013-03-26T08:35:52.797 に答える
1

マニフェストノードにandroid:configChangesノードを追加することから始めますActivity's

android:configChanges="keyboardHidden|orientation"

詳細については、このリンクを確認してください

于 2013-03-26T08:30:23.680 に答える
0

タグを追加します

"android:configChanges="keyboard|keyboardHidden|orientation|screenSize|navigation" for your activity in Manifest.xml,

そして、メソッドをオーバーライドします

public void onConfigurationChanged(Configuration newConfig) {}

方向変更チェックでレイアウトを変更する必要がある場合は、これ を方向変更でレイアウトを置き換えてください

于 2013-03-26T09:06:47.443 に答える
0

向きを変えた後にアプリを再起動することは避けられません。

アクティビティが最初に再生を再開しないように、アプリケーションのビデオステータスに関連する変数を保持します。

このコードは、この回答をテストするために作成したサンプルアプリからのものです。

public class MyApplication extends Application {
int counter;
@Override
public void onCreate() {
    super.onCreate();
    counter = 0;
    }
}   

マニフェストにアプリケーションを追加します

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:name="com.example.orientationchange.MyApplication" >
    <activity
 ...

withingアクティビティを使用する:

public class MainActivity extends Activity {

TextView output;
MyApplication app ;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    app = (MyApplication) getApplication();
    setContentView(R.layout.activity_main);
    output = (TextView) findViewById(R.id.output);
    //A counter thread used to test the solution.
    new CounterTask().execute( 100 );
}
 ...

これで、ローテーションはステータス変数をクリーンアップしません。

または、設定を使用して、状態を保持するためのコードを多用するソリューションを使用することもできます。プリファレンスは、アプリのある使用から別の使用への状態も記憶します。アプリケーションの状態は、アプリのonDestroy()でクリーンアップされます。

于 2013-03-26T20:38:04.637 に答える
0

私は非常に長い間解決策を探していました、そして私にとってはマニフェストの向きをロックされたものとして定義することに取り組みました:

<activity
    android:name=".VideoActivity"
    android:screenOrientation="locked"
    android:configChanges="keyboardHidden"/>

これにより、 setRequestedOrientation()を呼び出しても、アクティビティが再作成されるのを防ぎます。

于 2019-01-20T13:46:15.913 に答える