在onCreateView中如何获取Android布局的高度和宽度

4

我正在编写程序创建视图,没有使用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();
    }

也许更好的问题是 Display getSize 给你什么?我知道它是 getRealSize 减去某些东西,但具体是什么呢?显然不是操作栏加导航栏。我认为它只是其中之一。 - steveh
1个回答

3

我认为我已经理解了。

我认为getSize返回的是实际大小减去导航栏的大小,所以我需要减去操作栏的大小。

现在我这样做:

@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.getSize(size);
            int width = size.x;
            int height = size.y;

            TypedValue tv = new TypedValue();
            int actionBarHeight=0;
            if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
            {
                actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
            }

            height -= actionBarHeight;

            //Log.d("MainActivity", "onCreateView tabNo="+tabNo +" display width="+width+" height="+height+" rotation="+rotation);

            switch(tabNo){
            case 1:
                return onCreateViewScoreFragment(context, width, height);
            case 2:
                return onCreateViewFilesFragment(context, inflater, width>height);
            default:
                return onCreateViewSettingsFragment(context, inflater, width>height);
            }
        } 

它在我的平板电脑上运行正常,但我对其他设备不能百分之百确认,我需要等待并听取客户的反馈意见。


它对我来说几乎起作用了。我只需要使用getResources().getDimensionPixelSize(getResources().getIdentifier("status_bar_height", "dimen", "android"))减去顶部状态栏的高度即可。 - RobinDeCroon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接