【问题标题】:DecorView child framelayout is different at devicesDecorView 子框架布局在设备上有所不同
【发布时间】:2012-08-24 12:35:53
【问题描述】:

我使用github.com/bk138/LibSlideMenu中类似的库

它在HTC device(ICS)Nexus 7(ICS) 以及其他Gingerbread 设备上运行良好。

但有些设备像Motorola atrix 和另一个HTC 设备。

所以我检查了代码。

View view  = act.findViewById(android.R.id.content);
Utils.Log("<SlideMenu> : VIEW : "+view);        
ViewParent viewParent = view.getParent();
Utils.Log("<SlideMenu> : VIEW : "+viewParent);  
LinearLayout linearLayout = (LinearLayout) viewParent;
Utils.Log("<SlideMenu> : VIEW : "+linearLayout);
content = linearLayout;

在这里,首先在所有设备上返回FrameLayout

但是第二件事在ICS设备和其他HTC 2.3设备上返回LinearLayout,有些设备返回DecorView

我参考这篇文章:DecorView Child FrameLayout

他们说我使用NoTitleBar 有问题,所以我显示标题栏但它不起作用。

另外,虽然我添加了NoTitleBar 属性,但有些设备确实工作得很好。

这真的很令人沮丧,因为设备有不同的结果。有人知道吗?

请帮助 :D 提前致谢。

【问题讨论】:

    标签: android android-framelayout


    【解决方案1】:

    我相信我们可以确定一些关于 PhoneWindow$DecorView 的事情(或者至少与为 android 开发的一样确定)。

    首先,DecorView 扩展了 FrameLayout,因此,我们可以放心地将其转换为父类 ViewGroup。也就是说,其次,我们也可以确信 DecorView 包含父类 View(s)(否则它会是一个相当无聊的 ViewGroup,不是吗)。

    这使我得出结论,应该从上到下而不是自下而上攻击这个问题,因为有问题的库代码正在尝试。

    例如这样的:

    ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
    View oldScreen = decorView.getChildAt(0);
    decorView.removeViewAt(0);
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    SlidingPanel slidingPanel = (SlidingPanel) inflater.inflate(R.layout.screen_slider, null);
    ((ViewGroup) slidingPanel.findViewById(R.id.anterior)).addView(oldScreen);
    decorView.addView(slidingPanel, 0);
    

    我最近实现了一个类似的基本 SlidingPanel 小部件,并按照上面的方法使用它。您可以在https://github.com/mubeta06/android/tree/master/SlidingFrame 找到它和更多示例用法。

    【讨论】:

    • 感谢您的回答。我没有机会尝试这段代码,但我以不同的方式解决了这个问题。无论如何,谢谢:)
    【解决方案2】:

    Android SDK 文档中没有任何内容指定 android.R.id.content 的布局类型,更不用说它的父级了。这可能会因 Android 操作系统版本、设备制造商更改或修改后的 ROM 更改而有所不同。大多数 SDK 开发人员甚至不应该接触android.R.id.content 的父级;没有人应该假设任何具体的事情。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 感谢您的评论,但我已经尝试过了。它仍然无法解决摩托罗拉 Atrix 的问题。如果我使用它,我可以避免崩溃,但是当我使用 show() 方法时,滑动菜单会覆盖原始视图。 (但是 hide() 方法效果很好。)
      【解决方案4】:

      查看我为LibSlideMenu 做的这个链接:

      private static ViewGroup parent;
      

      将所有FrameLayout.LayoutParams 转换为

      LayoutParams  parent = (ViewGroup) act.getWindow().getDecorView();
      

      【讨论】: