细数android 自定义activity的title 中的坑(自定义title整个过程)

本文详细探讨了在Android中自定义Activity标题栏时可能遇到的问题,包括如何自定义布局、动态隐藏显示标题栏以及避免反射操作导致的坑。通过实例解析,帮助开发者理解并正确使用title_container进行界面定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

会使用搜索引擎的童鞋都知道搜一下怎么实现

然后出来一大堆相同的结果,就是下面这一段代码

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了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值