我在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提前致谢。
答案 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();