2013-04-23 131 views
0

在我的应用程序中,我必须提供添加,移动,调整大小和删除一些视图的能力,就像启动器一样。它直到现在都运行良好,但现在我希望其中一些视图能够实时显示视频(如网络摄像头)。如何正确处理android:configChanges =“orientation | screenSize”

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

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

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

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

所以我的问题是:

  • 你是否认为这是一个好主意,试图做得到这个行为?

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

预先感谢您

+0

我很遗憾没有你的问题的答案,但是甚至不考虑手动调用系统生命周期回调。在'onResume()'中调用'onCreate()'是一个非常糟糕的主意。此外,在理想的世界中,您只需通过“NonConfigurationInstance”调用将玩家对象从被销毁的活动传递给新出生的对象。但是,我似乎记得,对于视频来说可能会有困难。 – 2013-04-23 11:28:05

+0

感谢您的回答。我已经尝试通过NonConfigurationInstance传递媒体播放器,但是...我们并不处于理想的世界,并且MediaPlayer似乎不可能:/ – 2013-04-23 13:43:10

+0

是的,这就是我所记得的。不过,它几乎可以与其他所有产品配合使用。 ;)无论如何,我不确定你的实际问题是什么。什么不适合你? - 关于很多事情,通常认为应该在'onCreate()'中完成它们,当它们应该在'onResume()'中完成时。 ;) – 2013-04-23 13:51:45

回答

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,使用setter和新增功能:

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

    // Do your stuff with the GOOD size ! 
}