DecorView子framelayout在设备上有所不同

时间:2012-08-24 12:35:53

标签: android android-framelayout

我在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

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

我推荐这篇文章:DecorView Child FrameLayout

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

此外,即使我添加了NoTitleBar属性,某些设备也可以正常运行。

由于设备有不同的结果,这真的令人沮丧。有谁知道吗?

请帮助:D提前致谢。

4 个答案:

答案 0 :(得分:6)

我相信我们可以确定一些关于PhoneWindow $ DecorView的东西(或者至少可以确定为Android开发的东西)。

首先,DecorView扩展了FrameLayout,因此,我们可以放心地将其转换为父类ViewGroup。也就是说,其次,我们也可以确信DecorView包含父类View(否则它将是一个相当无聊的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找到它并进一步使用示例。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

答案 3 :(得分:0)

点击我为LibSlideMenu所做的链接:

private static ViewGroup parent;

将所有FrameLayout.LayoutParams转换为

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