利用Titlebar制作一个全局自定义标题栏
在styles.xml中定义主题
<style name="AppTheme">
<item name="android:windowActionBar">false</item>
<item name="android:windowTitleBackgroundStyle">@null</item>
<item name="android:windowTitleSize">50dp</item>
<item name="android:windowNoTitle">false</item>
</style>
AndroidManifest.xml中应用
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"> //应用主题
BaseActivity中共享自定义titleBar。顺序不能乱。
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.activity_mail);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar);
}
}
有时启动时会有系统默认Titlebar闪现一下,对于这个问题产生。
在系统运行一个application时,为了尽快响应用户,android首先会给用户 呈现一个app的“preview”窗口,这个界面甚至早于应用的实际进程。这个预览“preview”窗口中的信息就是从app的manifest文件 中获得的,所以一般app运行时总会显示一个具有app_name的titlebar,而不论我们在程序中如何定义我们的titlebar。
目前只找到以下解决办法:
方法一:
AndroidManifest.xml中应用一个无Titlebar的主题。待预览窗口启动后,Activity启动时,我们在把他替换回我们原来的主题。
增加主题继承我们原来主题,复写android:windowNoTitle为true
<style name="AppTheme.NoTitle" parent="AppTheme">
<item name="android:windowNoTitle">true</item>
</style>
AndroidManifest.xml中应用AppTheme.NoTitle
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme.NoTitle"> //应用NoTitleBar主题
来一招偷天换日
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.activity_mail);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar);
}
}
方法二:
既然刚开始会预先呈现一个预览窗口,那我刚开始给他一个0高度,到程序中在给它原来的高度,不就行了
<item name="android:windowTitleSize">0dp</item>
debug看了一下DecorView的结构基本是这样的
DecorView --> LinearLayout --> ViewStub (没看)
--> FrameLayout (Titlebar)
--> FrameLayout (content)
ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
ViewGroup layout = (ViewGroup) decorView.getChildAt(0);
ViewGroup title = (ViewGroup) layout.getChildAt(1);
ViewGroup.LayoutParams layoutParams = title.getLayoutParams();
layoutParams.height = 100;
尊重作者,转载请注明出处!
版权申明:本文版权归作者所有,未经授权,任何单位或个人不得以任何形式转载、摘编或利用其它方式使用本博客内容。作者保留追究相关法律责任的权利。如需使用博客内容,请与作者联系获得授权。感谢对本文的尊重与支持。
免责声明:本网站所载内容仅供参考,不构成任何专业建议。用户基于本网站内容作出的决策,风险自担。对于因使用本网站内容而产生的任何直接或间接损失,本网站不承担任何责任。请用户审慎判断,理性使用。