欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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"

推荐使用后两种方式


二、设置自定义标题栏

效果如图:
只有左边返回按钮:
Android自定义标题栏方法


左右两个按钮:
Android自定义标题栏方法


只有中间的Text:

Android自定义标题栏方法


Text加三个按钮:
Android自定义标题栏方法


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重复
改 名字
加的是_