记录一下我的Android项目里的基类的的基本设计
2017-06-06 18:16
411 查看
BaseActivity基类里面的UI设计通常有以下一个部分:1.title的控制 2.加载的控制 3.主体内容的显示 4.没网或是没数据时的异常显示
另外还有Activity跳转的控制。
先看看我的基类的xml布局:
BaseActivity
公共的Title common_title_bar.xml
TitleBar
common_loading.xml
drawable/common_toast_bg.xml
style里添加
转的环形圈圈 drawable/progress_circle_shape.xml
我们的类集成BaseActivity,方便之处列举:
1.设置标题
2.请求网络数据时控制loading
3.Activity管理 。BaseActivity里实现了,子类不用做什么
AppManager实现Activity堆栈管理
4.Activity跳转工具类,带有动画
right_in.xml
right_out.xml
down_in.xml
down_out.xml
要保证Activity切换动画一致,需要在我们点击按钮,前进,后退Activity的地方都是用这个工具类,实体键Back 来finishActivity也要有我们规定的动画
所以在BaseActivity里面重写了onBackPressed:
另外还有Activity跳转的控制。
先看看我的基类的xml布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root_view" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:orientation="vertical"> <com.jingubank.main.view.TitleBar android:id="@+id/base_fragment_title_bar" android:layout_width="match_parent" android:layout_height="wrap_content" /> <include android:id="@+id/base_fragment_net_error" layout="@layout/common_neterror" android:visibility="gone" /> <include android:id="@+id/base_fragment_empty" layout="@layout/common_empty" android:visibility="gone" /> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/base_fragment_content" android:layout_width="match_parent" android:layout_height="match_parent" /> <include android:id="@+id/base_fragment_loading" layout="@layout/common_loading_pro" android:visibility="gone" /> </FrameLayout> </LinearLayout>
BaseActivity
package com.example.main.base; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; import com.example.main.R; import com.example.main.common.app.AppManager; import com.example.main.finance.other.ChackGesturePswActivity; import com.example.main.utils.ActivityAnim; import com.example.main.utils.NetWorkUtils; import com.example.main.utils.ResourcesUtils; import com.example.main.utils.StatusBarUtil; import com.example.main.view.TitleBar; public abstract class BaseActivity extends AppCompatActivity { protected Context mContext; private InputMethodManager manager = null; protected BaseApplication application; protected TitleBar viewTitleBar; private FrameLayout viewContent; private LinearLayout viewEmpty, viewNetError; private View viewLoading; private int viewContentId;//viewPageLayoutId protected View rootView; private TextView base_neterror_tv; private TextView base_empty_tv; long currentTime = 0; @Override protected void onDestroy() { super.onDestroy(); AppManager.getAppManager().removeActivity(this); } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.mContext = this; this.viewContentId = onCreateViewId(); try { getExras(); } catch (Exception e) { e.printStackTrace(); } setContentView(R.layout.base_page_title); initViewPage(); setListener(); titleBarSet(viewTitleBar); if (NetWorkUtils.isConnected(mContext)) { viewContent.setVisibility(View.VISIBLE); } else { showViewNetError(true, null); } AppManager.getAppManager().addActivity(this);//推入栈中 } /** * 设置广播接收,区别操作 */ protected int whereId; @Override public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { return super.onCreateView(parent, name, context, attrs); } @Override public View onCreateView(String name, Context context, AttributeSet attrs) { return super.onCreateView(name, context, attrs); } @Override public void setContentView(int layoutResID) { super.setContentView(layoutResID); setStatusBar(); } /** * 设置状态栏 */ protected void setStatusBar() { StatusBarUtil.setColor(this, getResources().getColor(R.color.transparent)); } @Override public void onResume() { super.onResume(); fromNetGetData(); } @Override public void onPause() { super.onPause(); } /** * 设置标题栏 * * @param titleBar */ protected abstract void titleBarSet(TitleBar titleBar); /** * 设置页面布局 * * @return */ protected abstract int onCreateViewId(); /** * 设置页面布局实例化 * * @return */ protected abstract void onCreateViewContent(View view); /** * 请求网络数据 */ protected abstract void fromNetGetData(); /** * 本地传参 */ protected abstract void getExras(); /** * 监听事件 */ protected abstract void setListener(); /** * 加载框,是否显示 * * @param show */ protected void showViewLoading(boolean show) { if (show) { viewLoading.setVisibility(View.VISIBLE); } else { viewLoading.setVisibility(View.GONE); } } /** * 空数据,是否显示 * * @param show */ protected void showEmptyView(boolean show) { if (show) { viewEmpty.setVisibility(View.VISIBLE); } else { viewEmpty.setVisibility(View.GONE); } } /** * 网络错误,是否显示 * * @param show */ protected void showViewNetError(boolean show, View.OnClickListener onClickListener) { if (show) { viewNetError.setOnClickListener(onClickListener); viewNetError.setVisibility(View.VISIBLE); } else { viewNetError.setVisibility(View.GONE); } } /** * 初始化页面内容 */ private void initViewPage() { try { viewTitleBar = (TitleBar) findViewById(R.id.base_fragment_title_bar); viewEmpty = (LinearLayout) findViewById(R.id.base_fragment_empty); viewNetError = (LinearLayout) findViewById(R.id.base_fragment_net_error); viewContent = (FrameLayout) findViewById(R.id.base_fragment_content); viewLoading = findViewById(R.id.base_fragment_loading); base_neterror_tv = (TextView) findViewById(R.id.base_neterror_tv); base_empty_tv = (TextView) findViewById(R.id.base_empty_tv); View viewPage = View.inflate(mContext, viewContentId, null); rootView = findViewById(R.id.root_view); viewContent.addView(viewPage); onCreateViewContent(viewPage); viewEmpty.setVisibility(View.GONE); viewNetError.setVisibility(View.GONE); } catch (Exception e) { showViewLoading(false); e.printStackTrace(); } } @Override public boolean onTouchEvent(MotionEvent event) { /** * 点击空白处隐藏软键盘 */ if (event.getAction() == MotionEvent.ACTION_DOWN) { if (getCurrentFocus() != null && getCurrentFocus().getWindowToken() != null) { if (manager == null) { manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); } manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } return super.onTouchEvent(event); } @Override public BaseApplication getApplicationContext() { return (BaseApplication) super.getApplicationContext(); } @Override public void onBackPressed() { ActivityAnim.finshActivity(this); } }
公共的Title common_title_bar.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="51dp" android:background="@color/cffffff" android:orientation="vertical"> <RelativeLayout android:id="@+id/title_search_layout" android:layout_width="match_parent" android:layout_height="50dp" android:paddingLeft="11dp" android:paddingRight="13dp" android:visibility="gone"> <TextView android:id="@+id/title_bar1_left" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:drawableLeft="@mipmap/icon_location" android:gravity="center_vertical" android:minWidth="15dp" android:scaleType="centerInside" android:text="全国" android:textSize="14sp" /> <FrameLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="5dp" android:layout_toLeftOf="@+id/title_bar1_right" android:layout_toRightOf="@+id/title_bar1_left"> <EditText android:id="@+id/title_bar1_edt" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="5dp" android:layout_marginTop="5dp" android:background="@drawable/bg_search_shape_white" android:drawableLeft="@mipmap/search_icon_find" android:drawablePadding="5dp" android:enabled="true" android:gravity="center_vertical" android:hint="搜索商品" android:maxLines="1" android:paddingLeft="15dp" android:paddingRight="25dp" android:textSize="14sp" /> <ImageView android:id="@+id/title_bar1_clear" android:layout_width="25dp" android:layout_height="25dp" android:layout_gravity="center_vertical|right" android:layout_marginRight="5dp" android:src="@mipmap/icon_close" /> </FrameLayout> <TextView android:id="@+id/title_bar1_right" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:gravity="center" android:minWidth="50dp" android:paddingLeft="5dp" android:paddingRight="5dp" android:text="取消" android:textColor="#000000" android:textSize="14sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:paddingLeft="15dp" android:paddingRight="15dp"> <TextView android:id="@+id/title_bar_back" android:layout_width="110dp" android:layout_height="40dp" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:drawableLeft="@drawable/ic_title_back" android:ellipsize="end" android:gravity="center_vertical" android:minWidth="45dp" android:singleLine="true" android:visibility="visible" /> <TextView android:id="@+id/title_bar_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginLeft="70dp" android:layout_marginRight="70dp" android:gravity="center" android:text="@string/app_name_lib" android:textColor="#000000" android:textSize="16sp" /> <LinearLayout android:id="@+id/title_bar_right" android:layout_width="wrap_content" android:layout_height="45dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:gravity="center_vertical" android:minWidth="45dp" android:orientation="horizontal"> <TextView android:id="@+id/title_bar_set" android:layout_width="wrap_content" android:layout_height="match_parent" android:drawableRight="@mipmap/title_icon_add" android:gravity="center" android:minWidth="50dp" android:paddingRight="7dp" android:text="" android:textColor="#000000" android:textSize="14sp" /> <TextView android:id="@+id/title_bar_edt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:minWidth="50dp" android:text="编辑" android:textColor="#000000" android:textSize="14sp" /> </LinearLayout> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_alignParentBottom="true" android:layout_gravity="bottom" android:background="#e3e3e3" /> </LinearLayout>
TitleBar
package com.example.main.view; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.example.main.R; public class TitleBar extends LinearLayout implements View.OnClickListener { /** * 文字标题栏 */ private TextView viewTxtName, viewTxtBack; private TextView viewTxtSet, viewTxtEdt; /** * 搜索栏,UI控件 */ private TextView v1TvLeft,v1TvRight; private ImageView v1ImgClear; private EditText v1EdtSearch; public TitleBar(Context context) { this(context, null); } public TitleBar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TitleBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } /** * 初始化文字标题栏 */ private void initView() { setOrientation(LinearLayout.VERTICAL); View.inflate(getContext(), R.layout.common_title_bar, this); viewTxtName = (TextView) findViewById(R.id.title_bar_name); viewTxtBack = (TextView) findViewById(R.id.title_bar_back); viewTxtSet = (TextView) findViewById(R.id.title_bar_set); viewTxtEdt = (TextView) findViewById(R.id.title_bar_edt); viewTxtBack.setOnClickListener(this); viewTxtSet.setOnClickListener(this); viewTxtEdt.setOnClickListener(this); viewTxtSet.setVisibility(View.GONE); viewTxtEdt.setVisibility(View.GONE); } public final static int clickBack = 1;//返回 public final static int clickEdt = 2; public final static int clickSet = 3; public final static int click1Edt= 4; public final static int click1Left = 5; public final static int click1Right = 6; public final int click1Clear = 7; public enum TitleType { set, back, edt; } @Override public void onClick(View v) { int i = v.getId(); if (i == R.id.title_bar_back) { if (titleBarClickImpl != null) { titleBarClickImpl.titleOnClick(clickBack); } } else if (i == R.id.title_bar_set) { if (titleBarClickImpl != null) { titleBarClickImpl.titleOnClick(clickSet); } } else if (i == R.id.title_bar_edt) { if (getTitleBarClickImpl() != null) { titleBarClickImpl.titleOnClick(clickEdt); } } else if (i == R.id.title_bar1_left) { if (getTitleBarClickImpl() != null) { titleBarClickImpl.titleOnClick(click1Left); } } else if (i == R.id.title_bar1_clear) { if (v1EdtSearch!=null){ v1EdtSearch.setText(""); } // titleBarClickImpl.titleOnClick(click1Clear); }else if (i == R.id.title_bar1_edt) { if (getTitleBarClickImpl() != null) { titleBarClickImpl.titleOnClick(click1Edt); } } else if (i == R.id.title_bar1_right) { if (getTitleBarClickImpl() != null) { titleBarClickImpl.titleOnClick(click1Right); } } } TitleBarClick titleBarClickImpl; public TitleBarClick getTitleBarClickImpl() { return titleBarClickImpl; } public void setTitleBarClickImpl(TitleBarClick titleBarClickImpl) { this.titleBarClickImpl = titleBarClickImpl; } /** * 标题栏,点击事件监听接口 */ public interface TitleBarClick { /** * @param titleType 1:Back,2:edt,3:set,4:搜索,5位置,6搜索取消 */ void titleOnClick(int titleType); } /** * 设置原返回键图标,及文字 0不设置图标 */ public void setLeftView(int drwId,String name){ setTextDrwName(viewTxtBack,drwId); viewTxtBack.setText(textDealWithStr(name)); } /** * 设置原设置键图标,及文字 0不设置图标 */ public void setRightSet(int drwId,String name){ setTextDrwNameRight(viewTxtSet,drwId); viewTxtSet.setText(textDealWithStr(name)); } /** * 设置原设置键图标,及文字 0不设置图标 */ public void setRightSetColor(String name,int resId){ viewTxtSet.setText(textDealWithStr(name)); setTextDrwNameRight(viewTxtSet,0); viewTxtSet.setTextColor(getResources().getColor(resId)); } /** * 设置原编辑键图标,及文字 0不设置图标 */ public void setRightEdit(int drwId,String name){ setTextDrwNameRight(viewTxtEdt,drwId); viewTxtEdt.setText(textDealWithStr(name)); } private void setTextDrwName(TextView textView,int drawId){ Drawable drawable=null; if (drawId!=0){ drawable=getResources().getDrawable(drawId); drawable.setBounds( 0, 0,drawable.getMinimumWidth(),drawable.getMinimumHeight()); } textView.setCompoundDrawables(drawable, null, null, null); } //设置右侧 private void setTextDrwNameRight(TextView textView,int drawId){ Drawable drawable=null; if (drawId==101){ textView.setTextColor(Color.parseColor("#C39F8A")); }else if(drawId!=101&&drawId!=0){ drawable=getResources().getDrawable(drawId); drawable.setBounds( 0, 0,drawable.getMinimumWidth(),drawable.getMinimumHeight()); } textView.setCompoundDrawables(null, null,drawable, null); } public void setTitleName(String name) { viewTxtName.setText(textDealWithStr(name)); } /** * 设置搜索标题栏,显示搜索栏 * * @param clickEdt 是否可编辑 */ public void setSearchTitle(boolean clickEdt, boolean showRight, boolean showLeft) { View viewSearch = findViewById(R.id.title_search_layout); viewSearch.setVisibility(View.VISIBLE); v1EdtSearch = (EditText) findViewById(R.id.title_bar1_edt); v1ImgClear= (ImageView) findViewById(R.id.title_bar1_clear); v1ImgClear.setVisibility(View.GONE); v1ImgClear.setOnClickListener(this); v1TvRight = (TextView) findViewById(R.id.title_bar1_right); if (showRight) { v1TvRight.setVisibility(View.VISIBLE); v1TvRight.setOnClickListener(this); } else { v1TvRight.setVisibility(View.GONE); } v1TvLeft = (TextView) findViewById(R.id.title_bar1_left); if (showLeft) { v1TvLeft.setVisibility(View.VISIBLE); v1TvLeft.setOnClickListener(this); } else { v1TvLeft.setVisibility(View.GONE); } if (clickEdt) { v1EdtSearch.setEnabled(true); } else { v1EdtSearch.setEnabled(true); v1EdtSearch.setOnClickListener(this); } } /** * 设置输入框监听观察者 * @param textWatcher */ public void setSearchEdtView(TextWatcher textWatcher,String hint){ if (v1EdtSearch!=null) { v1EdtSearch.addTextChangedListener(textWatcher); // v1EdtSearch.setHint(hint); } } /** * 选取搜搜内容 * @return */ public String getSearchTxt(){ if (v1EdtSearch!=null) { return v1EdtSearch.getText().toString(); }else{ return ""; } } /** * 设置搜索框内容是否可清除 图标 * @param show */ public void setSearchClear(boolean show){ if (v1ImgClear!=null) { if (show){ v1ImgClear.setVisibility(View.VISIBLE); }else{ v1ImgClear.setVisibility(View.GONE); } } } /** * 设置搜索显示内容 * @param search */ public void setSearchText(String search){ if (v1EdtSearch!=null) { v1EdtSearch.setText(search); } } /** * 设置搜索标题栏,左侧定位按钮显示 * @param name * @param drawableId */ public void setSearchLeftTv(String name,int drawableId) { if (v1TvLeft == null) { v1TvLeft = (TextView) findViewById(R.id.title_bar1_left); } v1TvLeft.setVisibility(View.VISIBLE); setTextDrwName(v1TvLeft,drawableId); v1TvLeft.setText(textDealWithStr(name)); } /** * 设置搜索标题栏,右侧定位按钮显示 * @param name * @param drawableId 0不显示图标 */ public void setSearchRightTv(String name,int drawableId) { if (v1TvRight == null) { v1TvRight = (TextView) findViewById(R.id.title_bar1_right); } v1TvRight.setVisibility(View.VISIBLE); setTextDrwName(v1TvRight,drawableId); v1TvRight.setText(textDealWithStr(name)); } /** * @param nameId */ public void setTitleName(int nameId) { viewTxtName.setText(nameId); } public void setTitleBackName(String name) { viewTxtBack.setText(textDealWithStr(name)); } public void setTitleEdtName(String name) { viewTxtEdt.setText(textDealWithStr(name)); } //处理字符串 不是null private String textDealWithStr(String name){ return TextUtils.isEmpty(name)?"":name; } /** * 普通文字标题栏 * @param back 是否显示返回键 * @param edt 是否显示编辑键 * @param set 是否显示设置键 */ public void setShowIcon(boolean back, boolean edt, boolean set) { if (back) { viewTxtBack.setVisibility(View.VISIBLE); } else { viewTxtBack.setVisibility(View.GONE); } if (edt) { viewTxtEdt.setVisibility(View.VISIBLE); } else { viewTxtEdt.setVisibility(View.GONE); } if (set) { viewTxtSet.setVisibility(View.VISIBLE); } else { viewTxtSet.setVisibility(View.GONE); } } }
common_loading.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:background="@color/transparent" android:gravity="center" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/common_toast_bg" android:gravity="center" android:minWidth="110dp" android:orientation="vertical" android:padding="10dp"> <ProgressBar style="@style/mProgress_circle" android:layout_width="40dp" android:layout_height="40dp" /> <TextView android:id="@+id/loading_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:paddingTop="10dp" android:text="请稍后" android:textColor="@color/white" android:textSize="@dimen/textsize_9" /> </LinearLayout> </LinearLayout>
drawable/common_toast_bg.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#303030" /> <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" /> </shape>
style里添加
<!--旋转进度条--> <style name="mProgress_circle"> <item name="android:indeterminateDrawable">@drawable/progress_circle_shape</item> <item name="android:minWidth">25dp</item> <item name="android:minHeight">25dp</item> <item name="android:maxWidth">60dp</item> <item name="android:maxHeight">60dp</item> </style>
转的环形圈圈 drawable/progress_circle_shape.xml
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:pivotY="50%" android:toDegrees="360"> <shape android:innerRadiusRatio="3" android:shape="ring" android:thicknessRatio="10" android:useLevel="false"> <gradient android:centerColor="#C39F8A" android:centerY="0.50" android:endColor="#C39F8A" android:startColor="#FFFFFF" android:type="sweep" android:useLevel="false" /> </shape> </rotate>
我们的类集成BaseActivity,方便之处列举:
1.设置标题
@Override protected void titleBarSet(TitleBar titleBar) { titleBar.setTitleName("存管开户"); titleBar.setTitleBarClickImpl(new TitleBar.TitleBarClick() { @Override public void titleOnClick(int titleType) { switch (titleType) { case TitleBar.clickBack: SharePreferenceUtil.setValue(getApplicationContext(), UserConfig.HAS_KAIHU, true); ActivityAnim.finshActivity(FinanceKaiHuActivity.this); break; } } }); }
2.请求网络数据时控制loading
showViewLoading(true); showViewLoading(false);
3.Activity管理 。BaseActivity里实现了,子类不用做什么
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AppManager.getAppManager().addActivity(this);//推入栈中 }
@Override protected void onDestroy() { super.onDestroy(); AppManager.getAppManager().removeActivity(this); }
AppManager实现Activity堆栈管理
package com.jingubank.main.common.app; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningAppProcessInfo; import android.content.Context; import android.content.Intent; import com.jingubank.main.finance.index.IndexActivity; import java.util.List; import java.util.Stack; public class AppManager { public static Stack<Activity> activityStack; private static AppManager instance; private long exitTime = 0; public AppManager() { } public static AppManager getAppManager() { if (instance == null) { instance = new AppManager(); } return instance; } // 退出栈顶Activity,即结束指定的Activity public void finishActivity(Activity activity) { if (activity != null) { activity.finish(); activityStack.remove(activity); activity = null; } } // 获得当前栈顶Activity public Activity currentActivity() { Activity activity = null; if (null != activityStack && 0 != activityStack.size()) { activity = activityStack.lastElement(); } return activity; } // 将当前Activity推入栈中 public void addActivity(Activity activity) { if (activityStack == null) { activityStack = new Stack<Activity>(); } activityStack.add(activity); } // 将当前Activity移出栈中 public void removeActivity(Activity activity) { if (activity != null) { activityStack.remove(activity); } } // 除了某个Activity,退出栈中其它所有Activity public void popAllActivityExceptOne(Class<?> cls) { if (null == activityStack || activityStack.size() == 0) { return; } int len = activityStack.size(); for (int i = len - 1; i >= 0; i--) { Activity activity = activityStack.get(i); if (activity == null || (null != cls && activity.getClass().equals(cls))) { continue; } finishActivity(activity); } } // 退出栈中当前Activity public void popUpActivity(Class<?> cls) { if (null == activityStack || activityStack.size() == 0) { return; } int len = activityStack.size(); for (int i = len - 1; i >= 0; i--) { Activity activity = activityStack.get(i); if (activity == null) continue; if (activity.getClass().equals(cls)) { finishActivity(activity); break; } } } /** * 结束所有activity */ public void finishAllActivities() { for (Activity activity : activityStack) { activity.finish(); } activityStack.clear(); } public void gotoMainActivity(Context context) { popAllActivityExceptOne(IndexActivity.class); Intent intent = new Intent(); intent.setAction("GO_BACK_MAIN_PAGE"); context.sendBroadcast(intent); } public boolean isBackground(Context context) { ActivityManager activityManager = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager .getRunningAppProcesses(); for (RunningAppProcessInfo appProcess : appProcesses) { if (appProcess.processName.equals(context.getPackageName())) { if (appProcess.importance > RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE) { // Log.i("后台", appProcess.processName); return true; } else { // System.out.println("appProcess.importance==" + appProcess.importance); // Log.i("前台", appProcess.processName); return false; } } } return true; } }
4.Activity跳转工具类,带有动画
package com.example.main.utils; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import com.example.main.R; import java.util.Map; /** * Created by MLing on 14/12/12. */ public class ActivityAnim { private static Intent intent = null; /** * @param startactivity * @param finshActivity Activity间跳转 * 实现动画 */ public static void intentActivityForMap(Activity startactivity, Class<?> finshActivity, Map<String, String> map) { if (intent == null) { intent = new Intent(); } intent.setClass(startactivity, finshActivity); if (map != null) { //处理 for (String o : map.keySet()) { intent.putExtra(o, map.get(o)); } } startactivity.startActivity(intent); startactivity.overridePendingTransition(R.anim.left_in, R.anim.left_out); } /** * @param context * @param cls Activity间跳转 * 实现动画 */ public static void intentActivity(Context context, Class<?> cls) { if (intent == null) { intent = new Intent(); } if (cls != null) { intent.setClass(context, cls); } context.startActivity(intent); ((Activity) context).overridePendingTransition(R.anim.left_in, R.anim.left_out); } /** * Activity间跳转,加左右动画 * * @param context * @param cls 目标Activity * @param bundle 数据参数,没有参数null */ public static void intentActivity(Context context, Class<?> cls, Bundle bundle) { if (intent == null) { intent = new Intent(); } if (cls != null) { intent.setClass(context, cls); } if (bundle != null) { intent.putExtras(bundle); } context.startActivity(intent); ((Activity) context).overridePendingTransition(R.anim.left_in, R.anim.left_out); } public static void intentActivity(Activity startactivity, Intent intent) { if (intent == null) { return; } startactivity.startActivity(intent); startactivity.overridePendingTransition(R.anim.left_in, R.anim.left_out); } /** * 设置Activity返回接收数据 配套 setResult()使用 * * @param startactivity * @param intent */ public static void startActivityForResult(Activity startactivity, Intent intent, int intentCode) { if (intent == null) { return; } startactivity.startActivityForResult(intent, intentCode); startactivity.overridePendingTransition(R.anim.left_in, R.anim.left_out); } public static void setResult(Activity startactivity, Intent intent, int result) { if (intent == null) { return; } startactivity.setResult(result, intent); startactivity.finish(); startactivity.overridePendingTransition(R.anim.right_in, R.anim.right_out); } public static void startResultActivity(Activity startactivity, Class<?> finshActivity, Map<String, String> map, int requestCode) { if (intent == null) { intent = new Intent(); } intent.setClass(startactivity, finshActivity); if (map != null) { //处理 for (String o : map.keySet()) { intent.putExtra(o, map.get(o)); } } startactivity.startActivityForResult(intent, requestCode); startactivity.overridePendingTransition(R.anim.left_in, R.anim.left_out); } /** * @param finshActivity 结束当前activity的动画 */ public static void finshActivity(Activity finshActivity) { finshActivity.finish(); finshActivity.overridePendingTransition(R.anim.right_in, R.anim.right_out); } // /** // * @param finshActivity 结束当前程序的动画 // */ // public static void finshActivity(Activity finshActivity) { // finshActivity.finish(); // } /** * @param finshActivity 结束当前activity的动画 */ public static void homeActivity(Activity finshActivity) { finshActivity.finish(); finshActivity.overridePendingTransition(R.anim.left_in, R.anim.left_out); } /** * @param finshActivity 结束当前activity的动画 */ public static void popActivity(Activity finshActivity) { finshActivity.finish(); finshActivity.overridePendingTransition(R.anim.slide_in_from_bottom, R.anim.slide_out_to_bottom); } /** * 参数序列化 * * @param strings 参数 * @return 返回序列化之后的String[]数组 */ public String[] initPropertys(String... strings) { if (strings[0].equals("")) return new String[0]; return strings; } private static void intent(Intent intent, String[] key, String[] value) { for (int i = 0; i < key.length; i++) { intent.putExtra(key[i], value[i]); } } /** * @param startactivity * @param finshActivity Activity间跳转 * 实现动画 */ public static void intentActivityUp(Activity startactivity, Class<?> finshActivity, Map<String, String> map) { if (intent == null) { intent = new Intent(); } intent.setClass(startactivity, finshActivity); if (map != null) { //处理 for (String o : map.keySet()) { intent.putExtra(o, map.get(o)); } } startactivity.startActivity(intent); startactivity.overridePendingTransition(R.anim.down_in, R.anim.down_out); } /** * @param finshActivity 结束当前activity的动画 */ public static void finshActivityDowm(Activity finshActivity) { finshActivity.finish(); finshActivity.overridePendingTransition(R.anim.down_in, R.anim.down_out); } }
right_in.xml
<?xml version="1.0" encoding="utf-8"?> <set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="-100%" android:toXDelta="0" android:duration="200" /> </set>
right_out.xml
<?xml version="1.0" encoding="utf-8"?> <set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="100%" android:duration="200" /> </set>
down_in.xml
<?xml version="1.0" encoding="utf-8"?> <set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="100%" android:toYDelta="0" android:duration="400"/> </set>
down_out.xml
<?xml version="1.0" encoding="utf-8"?> <set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="0" android:toYDelta="-100%" android:duration="400"/> </set>
要保证Activity切换动画一致,需要在我们点击按钮,前进,后退Activity的地方都是用这个工具类,实体键Back 来finishActivity也要有我们规定的动画
所以在BaseActivity里面重写了onBackPressed:
@Override public void onBackPressed() { ActivityAnim.finshActivity(this); }
相关文章推荐
- android 新建项目基类设计
- 个人项目中比较好的设计, 整理记录一下
- android 新建项目基类设计
- Android 开源(记录一下自己的github开源小项目)
- Android用户界面设计:基本按钮
- 学extjs已经了解基本了,可以进行项目开发,把总结的一些小点列出来一下 --转载
- Android 开发网站,记录一下
- helloPe的android项目实战之连连看—设计篇
- 记录一下我的android程序之路
- 基于Android平台的开源项目PlanBetter设计篇之一 核心功能
- Mark 一下,10个android开源项目
- SharpStreaming项目开发纪实:构建基本的服务器及客户端应用(五)——总体结构设计(客户端)
- android学习笔记3-android项目基本目录与文件
- Android开发视频教程之二十八(项目详细设计)
- 记录一下开源DLNA协议栈(cyberlink for java)在android平台实现的Media Renderer为什么发现不了
- 项目开发感悟记录二:设计文档
- android实验三 简单聊天记录的设计与实现
- SharpStreaming项目开发纪实:构建基本的服务器及客户端应用(四)——总体结构设计(服务器端)
- Android应用开发记录-Android歌词秀(5)完善一下,像一个产品了
- Android开源项目记录