0

構成の変更が発生したときにandroid:configChanges="keyboardHidden|orientation|screenSize"状態を失うことがないように、マニフェストで使用しようとしています。VideoViewこれは、構成で自分でレイアウトを選択する必要があることを意味します。私が抱えている問題はonCreate、ここで使用するビューを最初に初期化するときです。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getResources().getConfiguration().orientation ==
                Configuration.ORIENTATION_LANDSCAPE) {
            setContentView(R.layout.activity_make_photo_video_land);

        } else if (getResources().getConfiguration().orientation ==
                Configuration.ORIENTATION_PORTRAIT) {
            setContentView(R.layout.activity_make_photo_video);
        }
}

適切なレイアウトを選択します。しかし、次のように構成変更でレイアウトを調整する必要がある場合:

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

        if (getResources().getConfiguration().orientation ==
                Configuration.ORIENTATION_LANDSCAPE) {
            setContentView(R.layout.activity_make_photo_video_land);
        } else if (getResources().getConfiguration().orientation ==
                Configuration.ORIENTATION_PORTRAIT) {
            setContentView(R.layout.activity_make_photo_video);
        }


    }

レイアウトの同じインスタンスを使用するのではなく、再読み込みするため、VideoView黒くなります。その後、ボタンを押すことができません。

初期レイアウトを再利用する方法はありますか? このようなビューをsetContentView(R.layout.activity_make_photo_video_land);オブジェクトに設定しようとしましActivity activityたが、IDE では許可されませんActivity is incompatible with void。そのビューへの参照を取得できれば、それを再利用できるからです。または、私が見ていないこれを行う簡単な方法はありますか?

ありがとう。

ここに画像の説明を入力

4

2 に答える 2

1

あなたの問題に対する代替の簡単な解決策を提案しています:

1.レイアウト activity_make_photo_video_land を /res/layout-land/ フォルダに移動し、名前を activity_make_photo_video.xml に変更します

このようにして、向きが横向きに変わると、 activity_make_photo_video_land ビュー (名前を activity_make_photo_video に変更) が膨張します。

そのため、これらの機能を Java コードから手動で処理する必要はありません。

onCreate() を次のように変更します。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_make_photo_video_land);

}

あなたのアプリケーションは/res/layout//res/layout-land/両方のフォルダーに単一のレイアウト activity_make_photo_video を持ちます

更新

特に指定しない限り、構成の変更 (画面の向き、言語、入力デバイスなどの変更など) により、現在のアクティビティが破棄され、onPause()、onStop()、および onPause() の通常のアクティビティ ライフサイクル プロセスが実行されます。必要に応じて onDestroy()。アクティビティがフォアグラウンドにあるか、ユーザーに表示されていた場合、そのインスタンスで onDestroy() が呼び出されると、アクティビティの新しいインスタンスが作成されます。これには、前のインスタンスが onSaveInstanceState(Bundle) から生成した savedInstanceState が含まれます。

onSaveInstanceState(Bundle) をオーバーライドして、状態をここに保存します

詳細はこちら

これがうまくいくことを願っています

于 2015-04-01T04:26:07.360 に答える
1

@Kushal の提案のおかげで、構成の変更時に状態を保存するonSaveInstanceState(Bundle savedInstanceState)との 2 つの方法を調べました(これは私の問題の根本であり、使用は単なるハックのアイデアだったためです)。そこにいくつかのコードが見つかりました。これが私がしたことです:onRestoreInstanceState(Bundle savedInstanceState)VideoViewsetContentView

  1. 風景xmlと通常の があることを確認してくださいxml。同じ名前のmylayout-landlayoutフォルダーにそれぞれ。

  2. これらの 2 つのメソッドを次のようにオーバーライドします。

    private int position = 0;
    
    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // use onSaveInstanceState in order to store the video
        // playback position for orientation change
        savedInstanceState.putInt("Position",  videoView.getCurrentPosition());
        videoView.pause();
    }
    
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        // use onRestoreInstanceState in order to play the video playback
        // from the stored position
        position = savedInstanceState.getInt("Position");
        videoView.seekTo(position);
    }
    
  3. 私のマニフェストandroid:configChanges="keyboardHidden|orientation|screenSize"を取り出しました。

  4. メソッドを削除しましたonConfigurationChanged(Configuration newConfig)(#3がなくなったため、もう必要ありません)。

これでできた!いつでも向きを変えて、いつでもビデオを録画できました。ビデオの記録から戻ると、ビデオを失うことなく、横向きでも縦向きでも簡単に表示されます (画面が真っ暗になることはありませんでした)。

私が今抱えている唯一の問題は、OnTouchListener無効になっていることですが、それは別の問題です。

于 2015-04-01T05:57:54.737 に答える