我有一個非全屏活動(系統通知欄是可見的)。爲了創建我的視圖層次結構,我需要知道我的活動佔用的屏幕大小(即系統通知欄大小減少的顯示大小)。我如何確定在onCreate
方法內?如何確定啓動時的非全屏活動窗口大小?
回答
這不是在已知的onCreate()。你應該做的是正確地參與視圖層次結構佈局過程。你不要在onCreate()中做你的佈局,你可以在佈局管理器的視圖層次結構中進行佈局。如果你有一些你不能用標準佈局管理器來實現的特殊佈局,那麼編寫你自己的佈局非常容易 - 只需實現一個ViewGroup子類,它在onMeasure()和onLayout()中做適當的事情。
這是唯一正確的方法,因爲如果可用顯示大小發生變化,您的onCreate()將不會再次運行,但視圖層次結構將通過其佈局過程來確定放置其視圖的正確新位置。屏幕尺寸可能會隨着你的變化而變化的原因是多種多樣的 - 例如,在Xoom平板電腦上插入HDMI輸出時,它使系統條更大,以便當它將顯示器映射到720p屏幕底部的應用程序不會被切斷。
例如,下面是實現的FrameLayout一個簡單版本的佈局管理器:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
int childRight = getPaddingLeft()
+ child.getMeasuredWidth() - getPaddingRight();
int childBottom = getPaddingTop()
+ child.getMeasuredHeight() - getPaddingBottom();
child.layout(getPaddingLeft(), getPaddingTop(), childRight, childBottom);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int count = getChildCount();
int maxHeight = 0;
int maxWidth = 0;
int measuredChildState = 0;
// Find rightmost and bottom-most child
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.getVisibility() != GONE) {
measureChild(child, widthMeasureSpec, heightMeasureSpec);
maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
measuredChildState = combineMeasuredStates(measuredChildState,
child.getMeasuredState());
}
}
// Account for padding too
maxWidth += getPaddingLeft() + getPaddingRight();
maxHeight += getPaddingTop + mPaddingBottom();
// Check against our minimum height and width
maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
setMeasuredDimension(resolveSizeAndState(maxWidth,
widthMeasureSpec, measuredChildState),
resolveSizeAndState(maxHeight, heightMeasureSpec,
measuredChildState<<MEASURED_HEIGHT_STATE_SHIFT));
}
注意最後一行有實施測量開始API 11的最好方式,因爲它可以讓你傳播狀態比如「佈局不合適」,可用於確定對話框所需的大小。您可能不需要擔心這樣的事情,在這種情況下,您可以將其簡化爲,關於平臺的所有版本的作品形式:
setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec),
resolveSize(maxHeight, heightMeasureSpec));
還有一個稍微更復雜佈局的API演示:
我現在不能測試,但我相信
int h = getWindow().getAttributes().height;
int w = getWindow().getAttributes().width;
API文檔:
http://developer.android.com/reference/android/app/Activity.html#getWindow%28%29
http://developer.android.com/reference/android/view/Window.html#getAttributes%28%29
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html
http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#height
- 1. 非全屏活動
- 2. 如何啓動窗口作爲屏幕大小的函數?
- 3. 非全屏滾動活動
- 4. 如何從perl以定義的大小啓動firefox窗口?
- 5. Jquery dotdotdot只在窗口調整大小時才正確啓動
- 6. SDL:在非全屏模式下查找最大窗口大小
- 7. 如何確定OpenGL窗口是否爲活動窗口?
- 8. 啓用鎖定屏幕時如何啓動活動?
- 9. 點擊後小窗口打開即可開啓全選活動
- 10. 啓動Emacs窗口調整大小
- 11. TCP慢啓動窗口大小
- 12. 確定運行時的啓動活動
- 13. 如何在程序啓動時正確恢復Gtk窗口大小?
- 14. 全屏jQuery Cycle,調整窗口大小
- 15. 全屏啓動wifi設置活動
- 16. Android:如何設置活動窗口的絕對大小?
- 17. 如何做全屏活動?
- 18. 從Nougat中無響應的窗口小部件活動啓動的活動
- 19. iOS如何放大非全屏啓動圖像以將其顯示爲全屏啓動圖像
- 20. 如何使用Pyglet在Python中使gif動畫匹配全屏窗口大小?
- 21. 全屏活動設計和自動啓動新活動
- 22. Honeycomb中的非全屏活動?
- 23. 如何強制WPF啓動窗口到特定的屏幕?
- 24. 空氣:啓動時最大化窗口
- 25. 啓動Firefox時調整瀏覽器窗口的大小
- 26. 確定何時移動WPF窗口
- 27. ElasticSearch窗口滾動大小
- 28. 如何在打印屏幕時發現活動窗口
- 29. 如何調整屏幕窗口大小?
- 30. 如何在全屏應用程序啓動時隱藏系統覆蓋窗口?