细数android 自定义activity的title 中的坑(自定义title整个过程)
2013-10-24 13:16
393 查看
会使用搜索引擎的童鞋都知道搜一下怎么实现
然后出来一大堆相同的结果,就是下面这一段代码
他们给你什么答案了么?没有,别用国内搜索引擎了,博客都TM是转载的,那些SB博主们,赶紧滚粗
下面我就给你们论论这之中会有哪些坑:
1.
这句话必须放在setConentView之前,大家都知道,因此这句话就像在AndroidManifest.xml中进行配置一样,设置了之后你就不能设置requestWindowFeature(Window.FEATURE_NO_TITLE),因为他们之间是互斥的。
2.
能够自定义标题栏,但是怎么更改自己放进去布局里面的内容呢?
这个实际上很简答, 只要findViewById(R.layout.title中的某个View的id)就能获取到控件了,拿它来做相应的操作就行了
3.
你要动态隐藏和显示标题栏怎么办呢?
你会搜到好多这样的结果:
((ViewGroup)getWindow().
findViewById(com.android.internal.R.id.title_container)).setVisibility(View.GONE);
出于好心,我告诉你,这个方法是获取不到这个layout的,因为,com.android.internal.R.id.title_container是受限的,所以你获取到的是null
所以说,要获取到正确的title_container的话,就只能用反射了,代码如下
调用这个函数来获取titleContainer的id吧,然后你就知道怎么获取到这个ViewGroup了
4.
前面我只是说这个titleContainer是ViewGroup,但是,具体一点,它是一个FrameLayout
并且
是将R.layout.title这个布局inflate之后add到titleContainer中去的
因此,没有特殊情况不要多次调用上面这个函数,不然就会出现titleContainer里面出现两个children的情况,但是你操纵的永远是底层那个,使你得不到你想要的界面那效果了
通过上面4个坑的分析,若是你已经明白了我想表达的意思,我想你已经明白了如何在你的项目中使用title_container了
然后出来一大堆相同的结果,就是下面这一段代码
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(view); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);
他们给你什么答案了么?没有,别用国内搜索引擎了,博客都TM是转载的,那些SB博主们,赶紧滚粗
下面我就给你们论论这之中会有哪些坑:
1.
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
这句话必须放在setConentView之前,大家都知道,因此这句话就像在AndroidManifest.xml中进行配置一样,设置了之后你就不能设置requestWindowFeature(Window.FEATURE_NO_TITLE),因为他们之间是互斥的。
2.
能够自定义标题栏,但是怎么更改自己放进去布局里面的内容呢?
这个实际上很简答, 只要findViewById(R.layout.title中的某个View的id)就能获取到控件了,拿它来做相应的操作就行了
3.
你要动态隐藏和显示标题栏怎么办呢?
你会搜到好多这样的结果:
((ViewGroup)getWindow().
findViewById(com.android.internal.R.id.title_container)).setVisibility(View.GONE);
出于好心,我告诉你,这个方法是获取不到这个layout的,因为,com.android.internal.R.id.title_container是受限的,所以你获取到的是null
所以说,要获取到正确的title_container的话,就只能用反射了,代码如下
public static Object reflactFiled(String className, String filedName){ Object result = null; try { result = Class.forName(className).getField(filedName).get(null); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return result; }
调用这个函数来获取titleContainer的id吧,然后你就知道怎么获取到这个ViewGroup了
protected int getTitleContainerId(){ Object obj = Utils.reflactFiled("com.android.internal.R$id", "title_container"); if(obj != null){ return (Integer) obj; } else{ return -1; } }
4.
前面我只是说这个titleContainer是ViewGroup,但是,具体一点,它是一个FrameLayout
并且
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);
是将R.layout.title这个布局inflate之后add到titleContainer中去的
因此,没有特殊情况不要多次调用上面这个函数,不然就会出现titleContainer里面出现两个children的情况,但是你操纵的永远是底层那个,使你得不到你想要的界面那效果了
通过上面4个坑的分析,若是你已经明白了我想表达的意思,我想你已经明白了如何在你的项目中使用title_container了
相关文章推荐
- Android 获取屏幕尺寸与密度
- Pro Android学习笔记(四二):Fragment(7):切换效果
- android开发在adapter中使用反射添加元素
- android字体闪烁动画(线程)
- Android的AndroidManifest.xml android:process元素说明
- android_WallpaperService和Launcher
- android常见bug汇总
- Window环境下搭建android NDK开发环境
- pjsip使用最新源码编译 for android
- Android布局的layout_weight属性
- Android PackageInstaller 安装和卸载
- Android layout_gravity和gravity区别
- 在Android中查看和管理sqlite数据库
- 【Android基础入门〖18〗】新浪微博项目总结
- android虚拟按键
- android 调用 系统视频播放器方法
- Android JSON的应用
- Android源码混淆脚本proguard
- Android(Java):Android的状态栏通知(Notification)
- android 中全屏或取消标题栏