最近一直比较忙,入职新公司2个月,一直忙着娃娃机的项目,所以就一直没有更新文章,今天刚刚好比较空闲,所以就有空写点东西,就把项目里边用的baseactivity拿出来说下。
谷歌写的toolbar比较好,所以我们其实是没有必要自己去写个布局来替代toolbar,但是toolbar的封装又不是很好用,我封装
的主要有一下几个方面。
1.更改状态栏颜色。
2. 自定义activity进入或者退出动画。
3.设置toolbar的颜色。
4.设置toolbar的返回按键是否显示。
5.设置toolbar的标题。
6.设置toolbar的右边按钮。
7.设置是否全屏。
8.设置返回按钮的图标。
9.监听toolbar右边的按钮
10.封装点击空白处隐藏键盘。
代码:
import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import comlow.livestar.flowchat.R; import comlow.livestar.flowchat.fragment.MessageEvent; public abstract class BaseActivity extends AppCompatActivity { private static final String TAG = "BaseActivity"; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); showFullScreen(); setContentView(R.layout.activity_base); EventBus.getDefault().register(this); initcontent(); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); initToolbar(); onActivityStart(); } private void showFullScreen() { if (isShowFullScreen()){ requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); }else { } } @Subscribe(threadMode = ThreadMode.MAIN) public void messageEventBus(MessageEvent event){ observerEvenbusMessage(event); } /* * 处理evenbus的事件 * */ public void observerEvenbusMessage(MessageEvent event) { } private void initcontent() { RelativeLayout content= (RelativeLayout) findViewById(R.id.contentlauout); content.addView(View.inflate(this,setLayout(),null)); } private void initToolbar() { //设置返回按钮的颜色 app:theme="@style/toolBar" Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (isShowFullScreen()){ toolbar.setVisibility(View.GONE); } ImageView imageView= (ImageView) findViewById(R.id.iv_right_image); imageView.setImageResource(setRightImage()); imageView.setVisibility(showRigthImage()); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { rightImageClick(); } }); if (toolbar!=null){ toolbar.setTitle(""); TextView toolbar_title = (TextView) findViewById(R.id.toolbar_title); if (toolbar_title!=null){ toolbar_title.setText(setToolBarTitle()); } setSupportActionBar(toolbar); if (isShowBackIcon()){ getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowCustomEnabled(true); toolbar.setNavigationIcon(setBackIcon()); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); //finish当前activity int animator1 = getInAnimator(); int animator2 = getOutAnimator(); overridePendingTransition(R.anim.slide_left_in, R.anim.slide_right_out); } }); } } } /** * 以下是必须实现的方法 * setLayout 设置布局 * onActivityStart 用于activity初始化 * setToolBarTitle 设置标题 * */ protected abstract int setLayout(); protected abstract void onActivityStart(); protected abstract String setToolBarTitle(); //处理后退键的情况 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ this.finish(); //finish当前activity int animator1=getInAnimator(); int animator2=getOutAnimator(); overridePendingTransition(animator1, animator2); return true; } return super.onKeyDown(keyCode, event); } /*跳转页面*/ public void JumpActivityWithAnimator(Class> cls ){ Intent intent =new Intent(BaseActivity.this, cls); startActivity(intent); overridePendingTransition(R.anim.slide_right_in, R.anim.slide_left_out); } /*跳转页面 并且销毁自己*/ public void JumpActivityWithAnimatorandFinishedSelf(Class> cls ){ Intent intent =new Intent(BaseActivity.this, cls); startActivity(intent); finish(); overridePendingTransition(R.anim.slide_right_in, R.anim.slide_left_out); } /** * * 以下是封装的方法,可以实现或者不实现,如果不实现,就使用默认的 * * getOutAnimator 退出动画 * setcolor 设置标题栏颜色 * getInAnimator 进入动画 * setBackIcon() 设置返回按钮的图片 * setRightImage() 设置右边图片 * rightImageClick() 监听右边按键 * showRigthImage() 是否显示右边图片 * isShowBackIcon() 设置是否显示左边按钮 * isShowFullScreen 是否显示全屏 * */ public int getOutAnimator() { return R.anim.slide_right_out; } public int setcolor() { return R.color.babyBlueColor; } public int getInAnimator() { return R.anim.slide_left_in; } public int setBackIcon() { return R.drawable.ic_return_32dp; } public int setRightImage() { return R.drawable.tab_icon_chat; } public boolean isShowBackIcon() { return true; } public void rightImageClick() { } public int showRigthImage() { return View.VISIBLE; } /*是否显示全屏*/ public boolean isShowFullScreen() { return false; } @Override protected void onStart() { super.onStart(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // View decorView = getWindow().getDecorView(); // int visibility = View.SYSTEM_UI_FLAG_FULLSCREEN;// 全屏设置 // int visibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;// 表示允许应用的主题内容占用状态栏的空间 // decorView.setSystemUiVisibility(visibility); getWindow().setStatusBarColor(getResources().getColor(setcolor()));// 通知栏颜色 } } /** * 显示一个Toast * * @param msg 吐司内容 */ protected void baseToast(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } /** * 显示一个log * * @param msg 内容 */ protected void baseLog(String logoname,String msg) { Log.d(logoname, msg+""); } /** * 动态设置ListView的高度 * @param listView */ public void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目 View listItem = listAdapter.getView(i, null, listView); // 计算子项View 的宽高 listItem.measure(0, 0); // 统计所有子项的总高度 totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } @Override 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); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }
使用方法:
1.自己创建activity继承BaseActivity
2.自己设置需要的内容。
3.由于是继承来自appcompactActivity,所以不能toolbar重叠,必须要设置一个所以不能toolbar重叠,必须要设置一个主题。
主题:
<style name="AppTheme.NoActionBar" > <item name="windowActionBar">falseitem> <item name="windowNoTitle">trueitem> style>4.在清单文件中使用主题。
<activity android:name=".activity.VideoViewActivity" android:theme="@style/AppTheme.NoActionBar" />
特别简单,暂时是我项目里边用的,后面想到其他的内容再加进去,好了,就这么多了。
布局代码:
xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_base" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true" > <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:elevation="6dp"> <TextView android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="我是标题" android:textColor="@color/white" android:textSize="16sp" /> <ImageView android:id="@+id/iv_right_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center|right" android:src="@drawable/tab_icon_chat" android:layout_marginRight="8dp" android:visibility="visible"/> android.support.v7.widget.Toolbar> <FrameLayout android:layout_weight="1" android:id="@+id/contentlauout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal">FrameLayout> LinearLayout>