我正在编写程序创建视图,没有使用XML,需要获取我正在工作的区域的实际大小。我一直在使用以下代码:
public static class DummySectionFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (container == null) {
return null;
}
Context context = getActivity();
int tabNo = getArguments().getInt(ARG_SECTION_NUMBER);
Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
// check display size to figure out what image resolution will be loaded
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
Point size = new Point();
display.getRealSize(size);
display.getSize(size);
int width = size.x;
int height = size.y;
但这并没有考虑到所有其他的“装饰”,比如标题栏和导航栏。
文档说不要使用显示度量来获取大小,但我该如何在onCreateView中找到视图的大小呢?我尝试了container.getHeight(),但它返回0。
我想问题是视图还没有被创建,但必须有一个父级在onCreateView中知道视图的大小,对吧?
我应该如何找到它呢?
谢谢。
顺便说一下,这个方法可行:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (container == null) {
return null;
}
Context context = getActivity();
int tabNo = getArguments().getInt(ARG_SECTION_NUMBER);
Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
// check display size to figure out what image resolution will be loaded
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
Point size = new Point();
display.getRealSize(size);
display.getSize(size);
int width = size.x;
int height = size.y;
switch (metrics.densityDpi) {
case DisplayMetrics.DENSITY_XXHIGH: height -= 72; break;
case DisplayMetrics.DENSITY_XHIGH: height -= 64; break;
case DisplayMetrics.DENSITY_HIGH: height -= 48; break;
case DisplayMetrics.DENSITY_MEDIUM: height -= 32; break;
case DisplayMetrics.DENSITY_LOW: height -= 24; break;
default:
Log.e("onCreateView", "Unknown density");
}
}
但是这种做法似乎不够简洁。我猜测了xhigh和xxhigh的值,但实际数值我还没有找到。
另外,我需要补充说明的是,此视图是从MainActivity中的onTabSelected方法创建的,代码如下:
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
// When the given tab is selected, show the tab contents in the
// container view.
Fragment fragment = new DummySectionFragment();
Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, tab.getPosition() + 1);
fragment.setArguments(args);
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
}