Android 开发之基类(一)
2015-11-20 15:56
447 查看
不说太多,直接上代码,不懂再说,只是一些零碎代码做个记录,各位看官看得懂,我深表荣幸,看不懂我也没法。
每个Activity需要涉及到的调用方法,下面是FragmentActivity基类(基于Xutils的注解):
BaseActivity同理,这里就不做多解释,Dialog PopupWindow也需要在基类封装,这里不做累赘叙述,下面来看FragmentHelper(还可以扩展动画)类:
下面是GsonHelper泛型解析数据:
图片转String 工具类:
Http请求响应类封装解析:
封装可读性接口:
SharedPeference简单封装:
下面该是BaseFragment了:
有了一系列的基类可以帮助我们简化开发,下面是一个小的simple:
下面是一个基于xutils http模块重新打包封装后的一个post请求实例:
零零乱乱的一地思绪,总结出:开发需要Fragment系列:BaseFragmentActivity、BaseFragment、FragmentHelper,Activity系列:BaseActivity、BaseView、BaseDialogFragment、BasePopupWindow、(弹出视图通过BaseView获取View视图传入弹出视图例如BaseDialogFragment等)、BaseBean等待;还需要辅助工具类:CheckInputHelper、CacheHelper等。同时Http网络请求模块需要封装请求,图片注意缓存,那么写好这些东西,考虑清楚项目需求就可以进入开发了,当开发的app程序多了,就会发现很多通用功能,而且每个app的更新会让用户体验不好,我们就应该考虑插件化开发,模块化。我不知道我的技术目前还在什么阶段,但是我知道我还是个菜逼,哎,大腿难求!!
import com.huianrong.app.widget.toast.HuiToast; /** * Created by LanYan on 2015/11/17. */ public interface OnBaseListener { /** * Code set theme related properties, such as: remove the title bar, full screen mode. Simple: * //设置无标题 * requestWindowFeature(Window.FEATURE_NO_TITLE); * //设置全屏 * getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, * WindowManager.LayoutParams.FLAG_FULLSCREEN); * 代码设置主题相关属性,比如:去掉标题栏,全屏模式等。 */ void applyTheme(); /** * When the activity call the setContentView (int layout) method, this method is called to return to the layout * 当activity 调用setContentView(int layout) 方法时,调用此方法返回Layout * @return R.layout.xx */ int setContentViewId(); /** * initialization operation */ void initiazed(); /** * 短时间的提示 * Tips for a short period of time * @param content */ void shortToast(String content); /** * 长时间的提示 * Tips for a long period of time * @param content */ void longToast(String content); }
每个Activity需要涉及到的调用方法,下面是FragmentActivity基类(基于Xutils的注解):
import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.PersistableBundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTabHost; import android.support.v4.app.FragmentTransaction; import android.view.View; import android.widget.Toast; import com.huianrong.app.HuiApplication; import com.huianrong.app.Interfaces.OnBaseListener; import com.huianrong.app.helper.FragmentHelper; import com.huianrong.app.widget.toast.HuiToast; import com.lidroid.xutils.ViewUtils; import java.util.ArrayList; /** * Created by LanYan on 2015/11/17. */ public abstract class BaseFragmentActivity extends FragmentActivity implements OnBaseListener { @Override public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); applyTheme(); setContentView(setContentViewId()); ViewUtils.inject(this); HuiApplication.getInstance().addActivity(this); initiazed(); } @Override public void applyTheme() { } @Override public void initiazed() { } @Override public void shortToast(String content) { /*********ToastHelper略***********/ } @Override public void longToast(String content) { /*********ToastHelper略***********/ } /** * 显示指定的Fragment * According to the specified fragments * * @param framLayoutId * @param cls * @param <T> */ public <T extends Fragment> void replaceFragment(int framLayoutId, Class<T> cls) { FragmentHelper.getInstance().replaceFragment(this, framLayoutId, cls); } /** * 显示指定的Fragment * According to the specified fragments * * @param framLayoutId * @param cls * @param tag * @param <T> */ public <T extends Fragment> void replaceFragment(int framLayoutId, Class<T> cls, String tag) { FragmentHelper.getInstance().replaceFragment(this, framLayoutId, cls, null); } /** *添加Fragment集合并返回Fragment集合 * Add fragments set and return fragments * @param framLayoutId * @param clsList * @param <T> * @return */ public <T extends Fragment> ArrayList<Fragment> addFragmentList(int framLayoutId, Class<T>[] clsList) { return FragmentHelper.getInstance().addFragmentList(this,framLayoutId, clsList); } /** *添加Fragment集合并返回Fragment集合 * Add fragments set and return fragments * @param framLayoutId * @param clsList * @param tag * @param <T> * @return */ public <T extends Fragment> ArrayList<Fragment> addFragmentList(int framLayoutId, Class<T>[] clsList, String tag) { return FragmentHelper.getInstance().addFragmentList(this,framLayoutId, clsList, null); } /** * 显示指定的Fragment * According to the specified fragments */ public <T extends Fragment> void showFragment(int framLayoutId, int position, ArrayList<Fragment> mFragmentList) { FragmentHelper.getInstance().showFragment(this, framLayoutId,position,mFragmentList); } /** * 创建Handler实例 * Create a Handler instance */ public Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); decodeHandleMessage(msg); } }; /** * 处理Handler接收到的消息 * Processing Handler receives the message * * @param msg */ protected void decodeHandleMessage(Message msg) { } }
BaseActivity同理,这里就不做多解释,Dialog PopupWindow也需要在基类封装,这里不做累赘叙述,下面来看FragmentHelper(还可以扩展动画)类:
import android.app.Activity; import android.content.Context; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.View; import java.util.ArrayList; /** * Created by LanYan on 15/11/18. */ public class FragmentHelper { public static FragmentHelper instance; public FragmentHelper(){ } public static FragmentHelper getInstance(){ if(instance==null){ synchronized (FragmentHelper.class){ if(instance==null){ instance=new FragmentHelper(); } } } return instance; } /** * 显示指定的Fragment * According to the specified fragments * * @param framLayoutId * @param cls * @param <T> */ public <T extends Fragment> void replaceFragment(FragmentActivity mFragmentActivity,int framLayoutId, Class<T> cls) { replaceFragment(mFragmentActivity,framLayoutId, cls, null); } /** * 显示指定的Fragment * According to the specified fragments * * @param framLayoutId * @param cls * @param tag * @param <T> */ public <T extends Fragment> void replaceFragment(FragmentActivity mFragmentActivity,int framLayoutId, Class<T> cls, String tag) { FragmentManager mFragmentManager = mFragmentActivity.getSupportFragmentManager(); FragmentTransaction mTransaction = mFragmentManager.beginTransaction(); T t = null; try { t = cls.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } if (tag == null) { mTransaction.replace(framLayoutId, t, cls.getName()); } else { mTransaction.replace(framLayoutId, t, tag); } mTransaction.commit(); } public <T extends Fragment> ArrayList<Fragment> addFragmentList(FragmentActivity mFragmentActivity,int framLayoutId, Class<T>[] clsList) { return addFragmentList(mFragmentActivity,framLayoutId, clsList, null); } public <T extends Fragment> ArrayList<Fragment> addFragmentList(FragmentActivity mFragmentActivity,int framLayoutId, Class<T>[] clsList, String tag) { ArrayList<Fragment> mFragmentList = new ArrayList<>(); FragmentManager mFragmentManager = mFragmentActivity.getSupportFragmentManager(); FragmentTransaction mTransaction = mFragmentManager.beginTransaction(); for (int i = 0; i < clsList.length; i++) { T t = null; try { t = clsList[i].newInstance(); mTransaction.add(framLayoutId, t, tag == null ? clsList[i].getName() : tag); mFragmentList.add(t); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } mTransaction.commit(); return mFragmentList; } /** * 显示指定的Fragment * According to the specified fragments */ public <T extends Fragment> void showFragment(FragmentActivity mFragmentActivity,int framLayoutId, int position, ArrayList<Fragment> mFragmentList) { FragmentManager mFragmentManager = mFragmentActivity.getSupportFragmentManager(); FragmentTransaction mTransaction = mFragmentManager.beginTransaction(); for (int i = 0; i < mFragmentList.size(); i++) { if (i == position) { mTransaction.show(mFragmentList.get(i)); } else { mTransaction.hide(mFragmentList.get(i)); } } mTransaction.commit(); } }
下面是GsonHelper泛型解析数据:
import java.util.ArrayList; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonParser; public class GsonHelper { private static GsonHelper mInstance; private Gson mGson; public GsonHelper(){ mGson=new Gson(); } public static GsonHelper getInstance(){ if(mInstance==null){ synchronized (GsonHelper.class) { if(mInstance==null){ mInstance=new GsonHelper(); } } } return mInstance; } public <T> ArrayList<T> fromJsonList(String json, Class<T> cls) { ArrayList<T> mList = new ArrayList<T>(); JsonArray array = new JsonParser().parse(json).getAsJsonArray(); for(final JsonElement elem : array){ mList.add(mGson.fromJson(elem, cls)); } return mList; } public <T> T fromJsonObject(String json, Class<T> cls){ return mGson.fromJson(json, cls); } public <T> String toJson(Object mObject){ return mGson.toJson(mObject); } }
图片转String 工具类:
import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.Bitmap.CompressFormat; import android.util.Base64; /** * Created by LanYan on 2015/11/17. */ public class UploadImageHelper { private static UploadImageHelper instance; public UploadImageHelper() { } public static UploadImageHelper getInstance() { if (instance == null) { synchronized (UploadImageHelper.class) { if (instance == null) { instance = new UploadImageHelper(); } } } return instance; } /** * The picture file is transformed into a String * @param file * @return String */ public String getStringWithFile(File file) { InputStream in = null; byte[] data = null; try { in = new FileInputStream(file); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } return Base64.encodeToString(data, 0); } /** * The Bitmap is transformed into a String * @param bitmap * @return String */ public String getStringWithBitmap(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.PNG, 100, baos); byte[] appicon = baos.toByteArray(); return Base64.encodeToString(appicon, Base64.DEFAULT); } /** * According to the image path, the image is transformed into a String * @param url * @return String */ public String getStringWithImageUrl(String url) { Bitmap mBitmap=BitmapFactory.decodeFile(url); mBitmap=zipImage(mBitmap, 200, 200); ByteArrayOutputStream baos = new ByteArrayOutputStream(); mBitmap.compress(CompressFormat.PNG, 100, baos); byte[] appicon = baos.toByteArray(); return Base64.encodeToString(appicon, Base64.DEFAULT); } /** * The compressed image * @param bgimage * @param newWidth * @param newHeight * @return Bitmap */ public Bitmap zipImage(Bitmap bgimage, double newWidth, double newHeight) { float width = bgimage.getWidth(); float height = bgimage.getHeight(); Matrix matrix = new Matrix(); float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; matrix.postScale(scaleWidth, scaleHeight); Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width, (int) height, matrix, true); return bitmap; } }
Http请求响应类封装解析:
import java.io.Serializable; import java.util.ArrayList; import com.example.http.RespMessage; /** * Request response bean * Created by LanYan on 2015/11/17. */ public class ResponseBean extends RespMessage implements Serializable { /** * */ private static final long serialVersionUID = -3190468559588437672L; private boolean hasNext; public boolean isHasNext() { return hasNext; } public void setHasNext(boolean hasNext) { this.hasNext = hasNext; } public <T> T getResultObject(Class<T> cls) { return GsonHelper.getInstance().fromJsonObject(getData(), cls); } public <T> ArrayList<T> getResultList(Class<T> cls) { ArrayList<T> mList = GsonHelper.getInstance().fromJsonList(getData(), cls); setHasNext(hasNextPage(mList)); return mList; } public static long getSerialversionuid() { return serialVersionUID; } public boolean getStatus() { return "00000000".equals(getRespCode()) ? true : false; } public <T> boolean hasNextPage(ArrayList<T> mList) { if (mList == null || mList.size() < 10) { return false; } else { return true; } } }
封装可读性接口:
/** * Created by LanYan on 2015/11/17. */ public enum Iinterface { login( /** 登录*/ "login", /** 登录账户、密码 */ new String[]{ /**登录手机号(需要MD5)*/ "userName", /**登录密码*/ "password" }), loading( /**启动界面Loading初始数据*/ "", null ); private Iinterface(String requestUrl, String[] postKey) { this.postKey = postKey; this.requestUrl = requestUrl; } private String requestUrl; private String[] postKey = null; public static final int ipIndex=23; public static final String host = "http://192.168.3."+ipIndex+":8080/xxxx/"; public String[] getRequestpostKey() { return postKey; } public String getRequestUrl() { return host + requestUrl; } }
SharedPeference简单封装:
import java.util.ArrayList; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import com.huianrong.app.http.GsonHelper; @SuppressLint("CommitPrefEdits") public class SharedPeferenceManager { private static SharedPeferenceManager instance; private static Context mContext; public SharedPeferenceManager() { } public static SharedPeferenceManager getInstance(Context context) { mContext = context; if (instance == null) { synchronized (SharedPeferenceManager.class) { if (instance == null) { instance = new SharedPeferenceManager(); } } } return instance; } public <T> T readObject(String tableName, String key, Class<T> cls) { String json = null; json = getSharedPreference(tableName).getString(key, null); return json==null?null:GsonHelper.getInstance().fromJsonObject(json, cls); } public <T> ArrayList<T> readList(String tableName,String key, Class<T> cls) { String json = null; json = getSharedPreference(tableName).getString(key, null); return GsonHelper.getInstance().fromJsonList(json, cls); } public <T> void saveOrUpdateObject(String tableName, String key, T t) { addObject(tableName, key, t, null); } public <T> void saveOrUpdateList(String tableName, String key, ArrayList<T> mList) { addList(tableName, key, mList, null); } public <T> void addObject(String tableName, String key, T t, Class<T> cls) { SharedPreferences mSharedPreferences =getSharedPreference(tableName); Editor mEditor=getEditor(mSharedPreferences); if(cls==null){ mEditor.putString(key, GsonHelper.getInstance().toJson(t)); }else { String requestJson=mSharedPreferences.getString(key, null); ArrayList<T> mList=new ArrayList<T>(); if(requestJson!=null){ mList=GsonHelper.getInstance().fromJsonList(requestJson, cls); } mList.add(t); mEditor.putString(key, GsonHelper.getInstance().toJson(mList)); } mEditor.commit(); } public <T> void addList(String tableName, String key, ArrayList<T> list, Class<T> cls) { SharedPreferences mSharedPreferences =getSharedPreference(tableName); Editor mEditor=getEditor(mSharedPreferences); if(cls==null){ mEditor.putString(key, GsonHelper.getInstance().toJson(list)); }else { String requestJson=mSharedPreferences.getString(key, null); ArrayList<T> mList=new ArrayList<T>(); if(requestJson!=null){ mList=GsonHelper.getInstance().fromJsonList(requestJson, cls); } mList.addAll(list); mEditor.putString(key, GsonHelper.getInstance().toJson(mList)); } mEditor.commit(); } public SharedPreferences getSharedPreference(String tableName) { return mContext.getSharedPreferences(tableName, Activity.MODE_PRIVATE); } public Editor getEditor(String tableName) { return getSharedPreference(tableName).edit(); } public Editor getEditor(SharedPreferences mSharedPreferences) { return mSharedPreferences.edit(); } }
下面该是BaseFragment了:
import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import com.lidroid.xutils.ViewUtils; /** * Created by LanYan on 2015/11/17. */ public abstract class BaseFragment extends Fragment { View contentView; protected FragmentActivity activity; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(contentView==null){ contentView=inflater.inflate(setContentViewId(),null); ViewUtils.inject(this,contentView); initiazed(); } return contentView; } @Override public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { return super.onCreateAnimation(transit, enter, nextAnim); } /** * onCreateView>inflater.inflate(setContentViewId(),null); * @return R.layout.xx */ protected abstract int setContentViewId(); /** * Initiazetion options */ protected void initiazed(){ activity=(BaseFragmentActivity)getActivity(); } }
有了一系列的基类可以帮助我们简化开发,下面是一个小的simple:
import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.view.Window; import android.view.WindowManager; import com.huianrong.app.base.BaseFragmentActivity; import com.huianrong.app.fragment.LoadingFragment; public class SplashActivity extends BaseFragmentActivity { @Override public void applyTheme() { super.applyTheme(); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); } /** * When the activity call the setContentView (int layout) method, this method is called to return to the layout * 当activity 调用setContentView(int layout) 方法时,调用此方法返回Layout * * @return R.layout.xx */ @Override public int setContentViewId() { return R.layout.activity_splash; } @Override public void initiazed() { super.initiazed(); replaceFragment(R.id.splash_frameLayout,LoadingFragment.class); } }
下面是一个基于xutils http模块重新打包封装后的一个post请求实例:
InterfaceManager manager=InterfaceManager.getInstance(); manager.login(new String[]{"15828845121","12345"}, new HuiRequestCallBack() { @Override public void huiSuccess(ResponseBean response) { UserBean mUserBean=response.getResultObject(UserBean.class); } @Override public void huiFailure(Exception e, String message) { } });
零零乱乱的一地思绪,总结出:开发需要Fragment系列:BaseFragmentActivity、BaseFragment、FragmentHelper,Activity系列:BaseActivity、BaseView、BaseDialogFragment、BasePopupWindow、(弹出视图通过BaseView获取View视图传入弹出视图例如BaseDialogFragment等)、BaseBean等待;还需要辅助工具类:CheckInputHelper、CacheHelper等。同时Http网络请求模块需要封装请求,图片注意缓存,那么写好这些东西,考虑清楚项目需求就可以进入开发了,当开发的app程序多了,就会发现很多通用功能,而且每个app的更新会让用户体验不好,我们就应该考虑插件化开发,模块化。我不知道我的技术目前还在什么阶段,但是我知道我还是个菜逼,哎,大腿难求!!
相关文章推荐
- Android调用别的应用的Activity
- androidlog日志之 Klog (StackTraceElement)
- Android Support Library介绍
- Android控件之RatingBar
- Android通过XML来定义Menu
- Android通过XML来定义Menu
- Android通过XML来定义Menu
- Android 4K高清图片解码显示(3)Bitmap优化
- Android 图片和文字布局,RadioButton有些地方比GridView好用些吧
- Android Synchronized的易错点
- Android系统容量检测 —— Environment 和StatFs
- android studio 使用 SVN
- 模拟获取android root权限
- Android Ndk中C与JAVA之间的互相调用
- android 画图之setXfermode 处理两图相交叉的情况
- Android 中Canvas.drawText实现文字居中
- android studio 优秀插件
- android:拷贝sqlite数据库到本地sd卡
- Android 5.0 双卡信息管理分析
- Android 手动显示和隐藏软键盘 android 隐藏显示输入法键盘