Android中BaseActivity自定义标题栏

作者:lixuce1234 时间:2022-04-20 06:47:37 

再做一个项目的时候,要求标题栏的标题再中间,样式,字体大小都要自定义。左边一个返回按钮,一个关闭按钮,右边定义一个提交按钮,有时候显示有时候隐藏。因为原生的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();
   //里面写事件就可以
 }
}

标签:Android,BaseActivity,标题栏
0
投稿

猜你喜欢

  • Java计时新姿势StopWatch的使用方法详解

    2022-01-28 00:49:57
  • C#实现将浮点数表示的货币数量以汉字大写形式输出的方法

    2022-06-10 03:10:36
  • Java基础之反射

    2021-12-20 17:20:20
  • 详解@ConfigurationProperties实现原理与实战

    2023-11-24 05:19:26
  • Java 深入浅出分析Synchronized原理与Callable接口

    2021-11-26 10:27:17
  • Springboot引入hibernate配置自动建表并进行增删改查操作

    2021-08-30 06:17:02
  • Java流程控制语句之If选择结构

    2023-11-11 04:02:29
  • winform导出dataviewgrid数据为excel的方法

    2023-09-25 15:01:38
  • 浅谈C# 构造方法(函数)

    2021-11-23 08:01:49
  • Spring4整合Hibernate5详细步骤

    2022-03-15 16:53:07
  • Android中的常用尺寸单位(dp、sp)快速入门教程

    2023-09-19 08:59:08
  • Android高级xml布局之输入框EditText设计

    2022-09-24 14:25:56
  • 深入了解JAVA HASHMAP的死循环

    2023-11-28 00:32:12
  • 关于@RequestBody和@RequestParam注解的使用详解

    2023-01-20 09:08:20
  • SpringBoot中自定义注解实现参数非空校验的示例

    2022-04-12 10:55:55
  • Java获取上月份最后一天日期8位的示例代码

    2023-08-12 14:10:38
  • 深入学习java枚举的应用

    2022-10-27 19:56:34
  • Android开发之删除项目缓存的方法

    2021-07-22 17:15:45
  • spring boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面(推荐

    2023-07-28 17:39:16
  • Android播放assets文件里视频文件相关问题分析

    2021-08-10 20:04:41
  • asp之家 软件编程 m.aspxhome.com