Android自定义标题栏方法
程序员文章站
2022-04-02 10:06:14
Android自定义 TopBar(标题栏)
一、 先 设置为 notitlebar的界面形式
第一种方式:Activity.java的代码中
requestWindowFe...
Android自定义 TopBar(标题栏)
一、 先 设置为 notitlebar的界面形式
第一种方式:Activity.java的代码中requestWindowFeature(Window.FEATURE_NO_TITLE);
不显示程序的标题栏 继承Activity才可以生效
并且要在setContentView之前
第二种方式:
设置 Theme为
然后 Manifest.xml中
若只想针对某个 Activity 则只要在对应 activity 标签中
第三种方式:
在style.xml文件里定义
manifest.xml中
android:theme="@style/notitle"
推荐使用后两种方式
二、设置自定义标题栏
效果如图:
只有左边返回按钮:
左右两个按钮:
只有中间的Text:
Text加三个按钮:
1 自定义一个文件 atts.xml
在里面自定义一个 styleable 属性
设置左右按钮背景图 中间标题的字体内容 大小 颜色
2 自定义一个 布局文件 topbar.xml
它的context即为下面在Utils文件夹下创建的 TopBar.java文件
3 创建TopBar.java文件:
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.biniu.bottomnavigationbardemo.R;
/**
* java类 与自定义的 topbar.xml绑定
* 用于 设置按钮监听 按钮可见性
*/
public class TopBar extends RelativeLayout {
private Button leftButton, rightButton;
private TextView titleTextView;
private OnLeftAndRightClickListener listener;//监听点击事件
//设置监听器
public void setOnLeftAndRightClickListener(OnLeftAndRightClickListener listener) {
this.listener = listener;
}
//设置左边按钮的可见性
public void setLeftButtonVisibility(boolean flag){
if(flag)
leftButton.setVisibility(View.VISIBLE);
else
leftButton.setVisibility(View.GONE);
}
//设置右边按钮的可见性
public void setRightButtonVisibility(boolean flag){
if(flag)
rightButton.setVisibility(View.VISIBLE);
else
rightButton.setVisibility(View.GONE);
}
//按钮点击接口
public interface OnLeftAndRightClickListener {
public void onLeftButtonClick();
public void onRightButtonClick();
}
public TopBar(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.topbar, this);
leftButton = (Button) findViewById(R.id.leftButton);
rightButton = (Button) findViewById(R.id.rightButton);
titleTextView = (TextView) findViewById(R.id.titleTextView);
leftButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.onLeftButtonClick();//点击回调
}
});
rightButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.onRightButtonClick();//点击回调
}
});
//获得自定义属性并赋值
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TopBar);
int leftBtnBackground = typedArray.getResourceId(R.styleable.TopBar_leftBackground, 0);
int rightBtnBackground = typedArray.getResourceId(R.styleable.TopBar_rightBackground, 0);
String titleText = typedArray.getString(R.styleable.TopBar_customTitleText);
float titleTextSize = typedArray.getDimension(R.styleable.TopBar_customTitleTextSize, 0);
int titleTextColor = typedArray.getColor(R.styleable.TopBar_customTitleTextColor,0x38ad5a);
typedArray.recycle();//释放资源
leftButton.setBackgroundResource(leftBtnBackground);
rightButton.setBackgroundResource(rightBtnBackground);
titleTextView.setText(titleText);
titleTextView.setTextSize(titleTextSize);
titleTextView.setTextColor(titleTextColor);
}
}
4 在需要调用标题栏的xml加入控件
5 在相应的java文件中 设置按钮点击事件
如在fragment中:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_fragment2, null, false);
TopBar topBar= (TopBar) view.findViewById(R.id.topbar);
topBar.setOnLeftAndRightClickListener(new TopBar.OnLeftAndRightClickListener() {
@Override
public void onLeftButtonClick() {
Toast.makeText(getActivity(),"left",Toast.LENGTH_SHORT).show();
}
@Override
public void onRightButtonClick() {
Toast.makeText(getActivity(),"right",Toast.LENGTH_SHORT).show();
}
});
return view;
}
在Activity中:
TopBar topBar= (TopBar) findViewById(R.id.topbar);
topBar.setOnLeftAndRightClickListener(new TopBar.OnLeftAndRightClickListener() {
@Override
public void onLeftButtonClick() {
Toast.makeText(getApplicationContext(),"left",Toast.LENGTH_SHORT).show();
}
@Override
public void onRightButtonClick() {
Toast.makeText(getApplicationContext(),"right",Toast.LENGTH_SHORT).show();
}
});
topBar.setLeftButtonVisibility(false);
原理:本身就是可点击的 只是没有显示按钮图标 没有做点击事件而已
加多一个Button介于右边Button的左边
在上方的基础上,加如下的内容完善即可
attrs中加:
topbar.xml中加:
topbar.java中加:
private Button rightButton2;
//设置右边第二个按钮的可见性
public void setRightButton2Visibility(boolean flag){
if(flag)
rightButton2.setVisibility(View.VISIBLE);
else
rightButton2.setVisibility(View.GONE);
}
//按钮点击接口
public interface OnLeftAndRightClickListener {
public void onLeftButtonClick();
public void onRightButtonClick();
// 加这个
public void onRightButton2Click();
}
//TopBar 构造方法中:
rightButton2 = (Button) findViewById(R.id.rightButton2);
rightButton2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.onRightButton2Click();//点击回调
}
});
int rightBtnBackground2 = typedArray.getResourceId(R.styleable.TopBar_rightBackground2, 0);
rightButton2.setBackgroundResource(rightBtnBackground2);
还要在使用了标题栏的java文件中:
给原本TopBar加一个接口
@Override
public void onRightButton2Click() {
}
直接运行根据message去找出错位置然后 alt+Enter加也可
在要加 三个按钮的标题栏中的
custom:rightBackground2="@mipmap/base_search2x"
添加第二个右边按钮的点击事件:
@Override
public void onRightButton2Click() {
// 写事件即可
}
加左边的按钮原理同上 加其他内容原理也同上
待完善:没有设置左右button的text的方法 所以只能弄一个图片设置text 可以自定义去加上
问题:
1 若textColor重复
改 名字
加的是_