1,去掉标题栏
1)方法一:在清单文件中修改主题
activity或application标签中:
android:theme=”@android:style/Theme.Light.NoTitleBar
2)方法二:使用style
在清单文件(manifest.xml)里面:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme_NoTitleBar" >//这句
在style.xml中添加:
<!-- 没有标题栏 -->
<style name="Theme_NoTitleBar">
<item name="android:windowNoTitle">true</item>
</style>
3)Android Studio方法
在Android Studio中用以上的方法无法去掉标题栏。
原因:这里的Activity类继承的是AppCompatActivity,这个是属于support v7附加包的类。而eclipse使用的则是v4包,继承的是Activity类。
解决方案:
①(不推荐方案):修改父类Acticity,将AppComPatActiviry替换为Activiry,问题解决
②修改AndroidManiFest.xml文件,将< activity>中的Theme属性替换如下:
android:theme="@style/Theme.AppCompat.NoActionBar">
③换requestWindowFeature(Window.FEATURE_NO_TITLE);
//v7包下去除标题栏代码:
getSupportActionBar().hide();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
2,自定义标题栏
实现的自定义的标题栏,中间是TextView,用来写标题。然后左边一个按钮右边一个按钮。点击下载源码
1)首先,重写一个类TitleBarView,自定义标题栏样式。
package com.luo.view;
import com.example.layout_demo.R;
import com.luo.util.SystemMethod;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class TitleBarView extends RelativeLayout {
private Context mContext;
private Button btn_Left;
private Button btn_Right;
private TextView tv_center;
public TitleBarView(Context context) {
super(context);
mContext = context;
initView();
}
public TitleBarView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
initView();
}
private void initView() {
LayoutInflater.from(mContext).inflate(R.layout.common_title_bar, this);
btn_Left = (Button) findViewById(R.id.title_btn_left);
btn_Right = (Button) findViewById(R.id.title_btn_right);
tv_center = (TextView) findViewById(R.id.title_txt);
}
public void setCommonTitle(int LeftVisibility, int centerVisibility, int rightVisibility) {
btn_Left.setVisibility(LeftVisibility);
btn_Right.setVisibility(rightVisibility);
tv_center.setVisibility(centerVisibility);
}
/**
* 左按钮文字
*
* @param txtRes
*/
public void setbtn_LeftText(int txtRes) {
btn_Left.setText(txtRes);
}
/**
* 右按钮文字
*
* @param txtRes
*/
public void setbtn_RightText(int txtRes) {
btn_Right.setText(txtRes);
}
/**
* 左按钮是图片
*
* @param icon
*/
public void setbtn_LeftDrawble(int icon) {
Drawable img = mContext.getResources().getDrawable(icon);
int height = SystemMethod.dip2px(mContext, 30);
int width = img.getIntrinsicWidth() * height / img.getIntrinsicHeight();
img.setBounds(0, 0, width, height);
btn_Left.setCompoundDrawables(img, null, null, null);
}
/**
* 右按钮是图片
*
* @param icon
*/
public void setbtn_RightDrawble(int icon) {
Drawable img = mContext.getResources().getDrawable(icon);
int height = SystemMethod.dip2px(mContext, 30);
// .getIntrinsicWidth():获取Drawable image对象的宽度
int width = img.getIntrinsicWidth() * height / img.getIntrinsicHeight();
/*
* setBounds(x,y,width,height); x:组件在容器X轴上的起点 y:组件在容器Y轴上的起点 width:组件的长度
* height:组件的高度
*/
img.setBounds(0, 0, width, height);
btn_Right.setCompoundDrawables(img, null, null, null);
}
/**
* 中间标题文字
*
* @param txtRes
*/
public void setTitleText(String txtRes) {
tv_center.setText(txtRes);
}
public void setbtn_LeftOnclickListener(OnClickListener listener) {
btn_Left.setOnClickListener(listener);
}
public void setbtn_RightOnclickListener(OnClickListener listener) {
btn_Right.setOnClickListener(listener);
}
public void destoryView() {
btn_Left.setText(null);
btn_Right.setText(null);
tv_center.setText(null);
}
}
对应common_title_bar.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/dark_orange"
android:orientation="vertical">
<TextView
android:id="@+id/title_top"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="@null"/>
<RelativeLayout
android:id="@+id/title_bar"
android:layout_height="50dp"
android:layout_width="match_parent">
<Button
android:id="@+id/title_btn_left"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:textColor="@color/blue"
android:textSize="16sp"
android:background="@color/dark_orange"/>
<TextView
android:id="@+id/title_txt"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_centerInParent="true"
android:gravity="center"
android:textSize="@dimen/textSize"
android:textColor="@color/blue"
android:textStyle="bold"/>
<Button
android:id="@+id/title_btn_right"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:background="@color/dark_orange"/>
</RelativeLayout>
</LinearLayout>
2)用的时候,调用自定义函数setTitle()设置:
private void setTitle() {
mTitleBarView = (TitleBarView) findViewById(R.id.act_main_titleBar);
mTitleBarView.setCommonTitle(View.VISIBLE, View.VISIBLE, View.VISIBLE);
mTitleBarView.setbtn_RightDrawble(R.drawable.icon_message);
mTitleBarView.setbtn_LeftDrawble(R.drawable.icon_qr_code);
mTitleBarView.setTitleText("淘宝搜索框");
mTitleBarView.setbtn_RightOnclickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast("我是右按钮");
}
});
mTitleBarView.setbtn_LeftOnclickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast("我是左按钮");
}
});
}
3,Translucent Bars(透明栏,沉浸式顶栏)
即顶栏透明,由app填充。
用户体验更好,更美观。
点击下载源码
1)在对应的activity的.xml文件中,添加TextView用来填充透明的顶栏。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/dark_orange"
android:orientation="vertical">
<TextView
android:id="@+id/title_top"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="@null"/>
</LinearLayout>
2)activity的onCreate()中,调用setTopTitle()函数。
/**
* 设置Translucent Bars
*/
private void setTopTitle(){
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//设置状态栏填充
TextView tv_title_top = (TextView) findViewById(R.id.title_top);
tv_title_top.setHeight( SystemMethod.getStatusHeight(this));
}
其中的getStatusHeight是一个获取状态栏高度的函数。
/**
* 获得状态栏高度
* @param context
* @return
*/
public static int getStatusHeight(Context context) {
int statusHeight = -1;
try {
Class clazz = Class.forName("com.android.internal.R$dimen");
Object object = clazz.newInstance();
int height = Integer.parseInt(clazz.getField("status_bar_height").get(object).toString());
statusHeight = context.getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
return statusHeight;
}
问题:以上方法可能导致状态栏高度设定的比实际高度高。
改进方案如下:
public static void setSystemStatusHeight(Context context, View view){
LinearLayout.LayoutParams sp_params = new LinearLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
sp_params.height = SystemMethod.getStatusHeight(context);
view.setLayoutParams(sp_params);
view.setVisibility(View.VISIBLE);
}