如何正确处理android:configChanges =“orientation | screenSize”

时间:2013-04-23 11:21:58

标签: android video-streaming screen-orientation

在我的应用中,我必须提供添加,移动,调整大小和删除某些视图的功能,就像启动器一样。它一直工作到现在,但现在我想要一些这些视图来显示实时流式传输的视频(如网络摄像头)。

我想在更改屏幕方向时不要重新缓冲视频,所以我尝试使用android:configChanges =“orientation | screenSize”属性。

它适用于大多数情况但是......问题是我必须在屏幕方向改变时或在onResume函数中获得新的大小。它有点棘手,它并不总是有效(例如,如果我处于横向模式,我接到一个电话,Android会自动切换到纵向模式,当我回到我的应用程序时,它会保留在纵向但是给我一个横屏大小...)。

我试图同时使用addOnLayoutChangeListener和getViewTreeObserver()。addOnGlobalLayoutListener,两者都失败了。

我想在其他几种情况下它可能是错误的,所以我认为完美的行为是拥有正常行为(例如,如果方向改变,则在onResume中销毁并重新创建我的活动),并手动调整我的视图大小只有当方向发生变化时。

所以我的问题是:

  • 你觉得尝试做这个行为是个好主意吗?

  • 销毁和重新创建活动的最佳方法是什么?如果方向改变了,只需在onResume上调用onDestroy / onCreate?或者手动将我的所有指针设置为null,并且要非常小心内存泄漏......

提前谢谢

2 个答案:

答案 0 :(得分:0)

查看此链接可能有助于处理android中的配置更改 - http://developer.android.com/guide/topics/resources/runtime-changes.html

答案 1 :(得分:0)

好吧,我通过创建自己的布局类并在onDraw函数中获取大小来解决它。 有点矫枉过正,但这是我找到的唯一解决方案。

感谢@Sharad Mhaske和@Class Stacker的时间!

编辑:我juste意识到我没有提到我通过设置他们的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());
        }
    }
    // ------------------------------------------------------------------------------------------
}

现在在活动中,juste实现OnSizeChangedListener,使用setter并添加函数:

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

    // Do your stuff with the GOOD size !
}