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

Android中BaseActivity自定义标题栏

程序员文章站 2024-02-18 23:49:46
再做一个项目的时候,要求标题栏的标题再中间,样式,字体大小都要自定义。左边一个返回按钮,一个关闭按钮,右边定义一个提交按钮,有时候显示有时候隐藏。因为原生的title标题是...

再做一个项目的时候,要求标题栏的标题再中间,样式,字体大小都要自定义。左边一个返回按钮,一个关闭按钮,右边定义一个提交按钮,有时候显示有时候隐藏。因为原生的title标题是再左边的,然后去给titlebar设置自定义view的时候,也会不尽人意,标题不是再正中间的,标题栏太高等问题。

我们要求的是这样的,右边的按钮可以显示或者隐藏。

Android中BaseActivity自定义标题栏 

于是就决定自己写一个baseactivity,所有的都去继承这个基类,然后自己去定义标题栏的样式就可以就可以了。
下面来讲一下这个界面是怎么实现的:

首先定义一个类baseactivity:

public class baseactivity extends appcompatactivity implements view.onclicklistener{

  private textview mtitletextview;//标题
  private textview close_tv;//
  protected textview commint_tv;
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    getwindow().requestfeature(window.feature_no_title);
    //将界面加入到栈中,方便管理
    myapplication.getinstance().addactivity(this);
    initviews();
  }


  private void initviews() {
    super.setcontentview(r.layout.activity_abstract_title);
    mtitletextview = (textview) findviewbyid(r.id.action_bar_title_tv);
    mcontentlayout = (framelayout) findviewbyid(r.id.layout_content);
     close_tv = ((textview) findviewbyid(r.id.action_bar_close_tv));
    imageview back_ic = (imageview) findviewbyid(r.id.action_bar_back_iv);
     commint_tv = (textview) findviewbyid(r.id.action_bar_comint_tv);
     back_ic.setonclicklistener(this);
    mtitletextview.setonclicklistener(this);
  }

  // 返回键返回事件
  @override
  public boolean onkeydown(int keycode, keyevent event) {
    if (keyevent.keycode_back == keycode) {
      onbackpressed();
    }
    return super.onkeydown(keycode, event);
  }

  public boolean ontouchevent(motionevent event) {
    if(null != this.getcurrentfocus()){
      /**
       * 点击空白位置 隐藏软键盘
       */
      inputmethodmanager minputmethodmanager = (inputmethodmanager) getsystemservice(input_method_service);
      return minputmethodmanager.hidesoftinputfromwindow(this.getcurrentfocus().getwindowtoken(), 0);
    }
    return super .ontouchevent(event);
  }

  /**
   * 显示关闭按钮
   */
  public void showclosebt(){
    if (close_tv!=null){
      close_tv.setvisibility(view.visible);
      close_tv.setonclicklistener(this);
    }
  }
  /**
   * 显示提交按钮按钮
   */

  public void showcommintbt(string s){
    if (commint_tv!=null){
      commint_tv.setvisibility(view.visible);
      commint_tv.setonclicklistener(this);
      commint_tv.settext(s);
    }
  }


  /**
   * 返回按钮点击后触发
   */
  protected void onleftbackward() {
    onbackpressed();
  }

  /**
   * 右边提交按钮点击后触发
   */
  protected void onrightforward() {

  }
  /**
   * 提交关闭按钮点击后触发
   */
  protected void onleftcloseword(){
    intent intent = new intent(this, mainactivity.class);
    intent.putextra("tabpos", 2);
    startactivity(intent);
    finish();
  }
  //设置标题内容
  @override
  public void settitle(int titleid) {
    mtitletextview.settext(titleid);
  }

  //设置标题内容
  @override
  public void settitle(charsequence title) {
    mtitletextview.settext(title);
  }

//点击标题时出发的事件操作
  public void ontitle() {

  }

  //取出framelayout并调用父类removeallviews()方法
  @override
  public void setcontentview(int layoutresid) {
    mcontentlayout.removeallviews();
    view.inflate(this, layoutresid, mcontentlayout);
    oncontentchanged();
  }

  @override
  public void setcontentview(view view){
    mcontentlayout.removeallviews();
    mcontentlayout.addview(view);
    oncontentchanged();
  }

  @override
  public void onclick(view v) {
    switch (v.getid()) {
      case r.id.action_bar_back_iv:
        onleftbackward();
        break;
      case r.id.action_bar_comint_tv:
        onrightforward();
        break;
      case r.id.action_bar_close_tv:
        onleftcloseword();
      case r.id.action_bar_title_tv:
        ontitle();
      default:
        break;
    }
  }

}

这样的话别的activity去继承baseactivity的时候,只需要去设置是否显示某个按钮即可,标题栏各个按钮的点击事件不需要去设置,直接重写
onleftbackward();onrightforward();onrightforward();ontitle();
然后对应各自的方法就可以了。

下面给出布局文件activity_abstract_title.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="match_parent"
  android:orientation="vertical" >
  <!-- title -->
  <include layout="@layout/actionbar_layout" />
  <framelayout
    android:id="@+id/layout_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff" >
  </framelayout>

</linearlayout>

actionbar_layout.xml文件

<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/layout_titlebar"
  android:layout_width="match_parent"
  android:layout_height="40dp"
  android:background="#2b2b2b">

  <textview
    android:id="@+id/action_bar_title_tv"
    android:layout_width="180dp"
    android:layout_height="match_parent"
    android:ellipsize="marquee"
    android:gravity="center_horizontal|center"
    android:lines="1"
    android:textcolor="#fff"
    android:focusable="true"
    android:marqueerepeatlimit="marquee_forever"
    android:layout_centerinparent="true"
    android:focusableintouchmode="true"
    android:scrollhorizontally="true"
    android:textsize="18sp" />

  <imageview
    android:contentdescription="@string/cancel"
    android:id="@+id/action_bar_back_iv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centervertical="true"
    android:padding="10dp"
    android:textsize="15sp"
    android:textstyle="bold"
    android:textcolor="#fff"
    android:src="@drawable/arrow_left" />

  <textview
    android:layout_toendof="@id/action_bar_back_iv"
    android:text="@string/action_bar_close"
    android:id="@+id/action_bar_close_tv"
    android:textcolor="#fff"
    android:visibility="invisible"
    android:textsize="15sp"
    android:textstyle="bold"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:padding="10dp"/>
  <textview
    android:visibility="invisible"
    android:padding="10dp"
    android:layout_alignparentend="true"
    android:text="@string/action_bar_commint"
    android:id="@+id/action_bar_comint_tv"
    android:textsize="15sp"
    android:textcolor="#fff"
    android:textstyle="bold"
    android:layout_marginend="3dp"
    android:layout_width="wrap_content"
    android:layout_height="match_parent" />
</relativelayout>

下面是一个简单的应用:

public class demoactivity extends mybaseactivity {

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    settitle("appbaseactivity");//设置标题
    showclosebt();//显示关闭按钮,默认时隐藏的

  }


    //如果返回按钮有其他操作的话可以重写
  @override
  protected void onleftbackward() {
    super.onleftbackward();
    //里面写事件就可以
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。