在我的应用中,我必须提供添加,移动,调整大小和删除某些视图的功能,就像启动器一样。它一直工作到现在,但现在我想要一些这些视图来显示实时流式传输的视频(如网络摄像头)。
我想在更改屏幕方向时不要重新缓冲视频,所以我尝试使用android:configChanges =“orientation | screenSize”属性。
它适用于大多数情况但是......问题是我必须在屏幕方向改变时或在onResume函数中获得新的大小。它有点棘手,它并不总是有效(例如,如果我处于横向模式,我接到一个电话,Android会自动切换到纵向模式,当我回到我的应用程序时,它会保留在纵向但是给我一个横屏大小...)。
我试图同时使用addOnLayoutChangeListener和getViewTreeObserver()。addOnGlobalLayoutListener,两者都失败了。
我想在其他几种情况下它可能是错误的,所以我认为完美的行为是拥有正常行为(例如,如果方向改变,则在onResume中销毁并重新创建我的活动),并手动调整我的视图大小只有当方向发生变化时。
所以我的问题是:
你觉得尝试做这个行为是个好主意吗?
销毁和重新创建活动的最佳方法是什么?如果方向改变了,只需在onResume上调用onDestroy / onCreate?或者手动将我的所有指针设置为null,并且要非常小心内存泄漏......
提前谢谢
答案 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 !
}