## 抽取BaseActivity解放你的titlebar ##
2017-06-13 12:20
162 查看
当项目过大的时候 往往需要多个Activity 为了避免每次重复写的title 我们将其抽取出来
需要的XML布局
BaseActivity
3.简单的应用
效果如下
需要的XML布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/base_view" android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="true" android:fitsSystemWindows="true" android:orientation="vertical" > <RelativeLayout android:id="@+id/base_titlebar" android:layout_width="match_parent" android:layout_height="50dp" > <ImageButton android:id="@+id/base_back_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:padding="10dp" android:background="@null" android:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/base_menu_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:padding="10dp" android:gravity="center" android:layout_centerVertical="true" android:background="@null" android:text="设置" android:textSize="16sp" /> <TextView android:id="@+id/base_title_tv" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="标题" android:textColor="#ffffff" android:textSize="20sp" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_alignParentBottom="true" /> </RelativeLayout> <FrameLayout android:id="@+id/base_contentview" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </FrameLayout> </LinearLayout>
BaseActivity
public abstract class BaseActivity extends Activity{ public ViewGroup contentView; private TextView rightBtn; private View leftBtn; private TextView titltTv; private View titlebar; @SuppressLint("InlinedApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_base); setTranslucentStatus(); int titlebarResId = getTitlebarResId(); if (titlebarResId!=0) { LinearLayout view=(LinearLayout) findViewById(R.id.base_view); view.removeViewAt(0); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,50); ViewGroup titleView=(ViewGroup) View.inflate(this, titlebarResId, null); view.addView(titleView, 0,lp); view.setBackgroundDrawable(titleView.getBackground()); titlebar=titleView; }else { titlebar=findViewById(R.id.base_titlebar); leftBtn = findViewById(R.id.base_back_btn); leftBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onClickLeft(); } }); rightBtn = (TextView) findViewById(R.id.base_menu_btn); rightBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onClickRight(); } }); titltTv=(TextView) findViewById(R.id.base_title_tv); } contentView=(ViewGroup) findViewById(R.id.base_contentview); contentView.addView(View.inflate(this, getContentView(), null)); setRightBtnVisible(false); } @Override public void overridePendingTransition(int enterAnim, int exitAnim) { super.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } /** * 设置状态栏背景状态 */ private void setTranslucentStatus() { //判断当前SDK版本号,如果是4.4以上,就是支持沉浸式状态栏的 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } } /** * 点击左侧按钮 * 默认是退出 */ protected void onClickLeft() { finish(); } /** * 点击右侧按钮 * 默认什么都不做 */ protected void onClickRight() { } /** * 设置左侧按钮显示与隐藏 * @param visible */ public void setLeftBtnVisible(Boolean visible) { if (leftBtn!=null) { if (visible) { leftBtn.setVisibility(View.VISIBLE); }else{ leftBtn.setVisibility(View.GONE); } } } /** * 设置右侧按钮显示与隐藏 * @param visible */ public void setRightBtnVisible(Boolean visible) { if (rightBtn!=null) { if (visible) { rightBtn.setVisibility(View.VISIBLE); }else{ rightBtn.setVisibility(View.GONE); } } } /** * 获取自定义标题栏 * 如果子类复写并返回不等于0的布局文件,将会覆盖默认标题 * 返回0 将会采用默认标题 * @return */ protected int getTitlebarResId() { return 0; } /** * 设置中间标题 * @param title */ public void setTitle(String title){ if (titltTv!=null) { if (titltTv!=null) { titltTv.setText(title); } } } /** * 设置右边你按钮文字属性 * @param title */ public void setRtTitle(String title){ if (rightBtn!=null) { rightBtn.setText(title); } } public View getTitleBar(){ return titlebar; } /** * 获取中间内容显示区 * @return */ protected abstract int getContentView(); }
3.简单的应用
public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("主页"); setRtTitle("设置"); setRightBtnVisible(true); } @Override protected int getContentView() { return R.layout.activity_main;//任意非空布局 } @Override protected void onClickRight() { Toast.makeText(this, "设置", 0).show();; } }
效果如下
相关文章推荐
- AndroidGUI25:定制Activity的标题栏(Titlebar)
- 自定义Activity的标题栏(Titlebar)
- Android开发:定制Activity的标题栏(Titlebar)
- Android开发:定制Activity的标题栏(Titlebar)
- Android 自定义Activity基类与TitleBar
- AndroidGUI25:定制Activity的标题栏(Titlebar)
- AndroidGUI25:定制Activity的标题栏(Titlebar)
- Android 自定义Activity的标题栏(Titlebar)
- 继承与BaseActivity的抽取
- Android短信(baseactivity抽取相同代码块,复用代码,减少工作量)短信管家4
- Activity设置全屏并且无title bar
- 自定义Activity的标题栏(Titlebar)
- android 建立的activity不自带titlebar,并且用TimePicker和DataPicker中XML文件显示的和手机屏幕上不一致
- 定制Activity的标题栏(Titlebar)
- 解决activity加上Theme.Translucent.NoTitleBar 页面跳转显示桌面
- 解决activity加上Theme.Translucent.NoTitleBar 页面跳转显示桌面
- AndroidGUI25:定制Activity的标题栏(Titlebar)(转载)
- 为什么在AndroidManifest.xml中Activity的theme用不了Theme.Light.NoTitleBar?
- 抽取ButterKnife到BaseActivity
- 自定义Activity标题栏(Title bar)和窗体显示状态操作(requestWindowFeature()的应用)