0

私のアプリでは、ランチャーのように、いくつかのビューを追加、移動、サイズ変更、および削除する機能を提供する必要があります。今までは問題なく機能していましたが、これらのビューの一部に、リアルタイムでストリーミングされるビデオを表示する必要があります (Web カメラのように)。

画面の向きを変更したときにビデオが再バッファリングされないようにしたいので、 android:configChanges="orientation|screenSize" 属性を使用しようとしています。

ほとんどの場合は機能しますが...問題は、画面の向きが変わったとき、または onResume 関数で新しいサイズを取得する必要があることです。少しトリッキーで、常に機能するとは限りません (たとえば、横向きモードで電話を受けると、Android は自動的に縦向きモードに切り替わり、アプリに戻ると縦向きのままになります)横長の画面サイズを教えてください…)。

addOnLayoutChangeListener と getViewTreeObserver().addOnGlobalLayoutListener の両方を使用しようとしましたが、どちらも失敗しました。

他のいくつかの状況ではバグがあるかもしれないと思うので、完璧な動作は通常の動作 (たとえば、向きが変わった場合に onResume でアクティビティを破棄して再作成する) であり、ビューのサイズを手動で変更するのは向き変更。

だから私の質問は:

  • この動作を試してみるのは良い考えだと思いますか?

  • アクティビティを破棄して再作成する最良の方法は何ですか? 向きが変わった場合、onResume で onDestroy/onCreate を呼び出すだけですか? または、すべてのポインタを手動で null に設定し、メモリ リークに十分注意してください…</p>

前もって感謝します

4

1 に答える 1

0

さて、私は独自のレイアウト クラスを作成し、その onDraw 関数でサイズを取得することで解決しました。少しやり過ぎですが、それが私が見つけた唯一の解決策です。

@Sharad Mhaske と @Class Stacker に感謝します。

編集: X と Y の位置、および幅と高さを設定することにより、コンテナー内にビューを手動で配置していることに言及していないことに気付きました。そのため、コンテナーは自動的にサイズ変更されますが、サイズは自動的に変更されません。

編集:これが私が現在使用しているコードの一部です:

public class TilesContainer extends FrameLayout {

    // ------------------------------------------------------------------------------------------
    // Public interface for on size change event :
    public static interface OnSizeChangedListener { void onSizeChanged(int width, int height); }
    // ------------------------------------------------------------------------------------------



    // ------------------------------------------------------------------------------------------
    // Private attributes :
    private int _width = -1;
    private int _height = -1;
    private OnSizeChangedListener _listener = null;
    // ------------------------------------------------------------------------------------------



    // ------------------------------------------------------------------------------------------
    // Constructors :
    public TilesContainer(Context context, AttributeSet attrs, int defStyle) {

        super(context, attrs, defStyle);
        this.setWillNotDraw(false);
    }

    public TilesContainer(Context context, AttributeSet attrs) {

        super(context, attrs);
        this.setWillNotDraw(false);
    }

    public TilesContainer(Context context) {

        super(context);
        this.setWillNotDraw(false);
    }
    // ------------------------------------------------------------------------------------------


    // ------------------------------------------------------------------------------------------
    // Setters :
    public void setOnSizeChangedListener(OnSizeChangedListener listener) { _listener = listener; }
    // ------------------------------------------------------------------------------------------



    // ------------------------------------------------------------------------------------------
    // onDraw overload :
    @Override
    protected void onDraw(Canvas canvas) {

        // Call super :
        super.onDraw(canvas);

        // If there is a listener and if the size changed :
        if(_listener != null && (_width != this.getWidth() || _height != this.getHeight()) ) {

            _width = this.getWidth();
            _height = this.getHeight();
            _listener.onSizeChanged(this.getWidth(), this.getHeight());
        }
    }
    // ------------------------------------------------------------------------------------------
}

アクティビティで、OnSizeChangedListener を実装し、セッターを使用して関数を追加します。

@Override
public void onSizeChanged(int width, int height) {

    // Do your stuff with the GOOD size !
}
于 2013-04-23T16:13:39.490 に答える