电子市场项目总结(一)
1. 自定义Application
为什么自定义Application
1.使用XUtils3.0 需要在Application中初始化
x.Ext.init(this);
2.抽取Context对象共全局使用,并获取Application所在的线程id(主线程ID,非进程),和全局的Handler对象。
在onCreate中去获取这些:
mContext = getApplicationContext(); mTid = Process.myTid(); mHandler = new Handler();
2. 自定义UIUtils
1.为什么要自定义UIUtils?
自定义UIUtils将那些常用的方法都封装起来,方便使用
2.定义了哪些
//--------------------------单位转换-----------------------
// dp转px
public static int dip2px(float dip) {
float density = getResources().getDisplayMetrics().density;
return (int) (dip * density + 0.5f);
}
// px转dp
public static int px2dip(float px) {
float density = getResources().getDisplayMetrics().density;
return (int) (px / density + 0.5f);
}
//----------------------普通的管理器获取-----------------------
// 获取资源管理器
public static Resources getResources() {
return MyApplication.getContext().getResources();
}
// 获取全局Handler
public static Handler getHandler() {
return MyApplication.getHandler();
}
// 获取主线程的ID
public static int getMainTid() {
return MyApplication.getTid();
}
// 获取资源asset管理器
public static AssetManager getAssets() {
return getResources().getAssets();
}
//------------------运行一个子线线程---------------------------
// 运行一个runnable
public static void runOnUiThread(Runnable runnable) {
// 先检测是否在主线程被调用
if (isMainThread()) {
runnable.run();
}else{
getHandler().post(runnable);
}
}
// 是否运行在主线程
public static boolean isMainThread() {
return getMainTid() == Process.myTid();
}
3. 主界面的构建 MainActivity
构建成什么样的主界面?
使用V4包下的DrawerLayout作为根布局,呈现侧边栏的形式,内容使用Indicate和Viewpager组成
视图如下:
如何构建的Activity
采用继承自AppCompatActivity的Activity同时使用了 Theme.AppCompat.Light.DarkActionBar主题
使用DrawerLayout、PagerTab和ViewPager结合
因为使用的自定义控件PagerTab需要一个继承自ActionBarActivity的对象,
AppCompatActivity是V7包下ActionBarActivity的替代者,其采用的ToolBar也是ActionBar的替代者。
使用到的技术点
1.Xutils3.0的使用 View注入
x.view().inject(this);
区别于2.0的ViewInject.inject(this);
从使用者的角度看,xutils3.0让工具变得全局化,不需要在使用之前再new一个出来,例如BitmapUtil的改变
2.使用FragmentPagerAdapter在viewpager中填充Fragment
class MyFragmentPagerAdapter extends FragmentPagerAdapter {
// 1.需要一个FragmentManager管理器,这个管理器应当是supportFragmentManager因为他可以版本兼容
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
// 2.获取item对象,采用工厂模式生产出对应的且唯一的Fragment
public Fragment getItem(int position) {
BaseFragment fragment = FragmentFactory.getFragment(position);
fragment.loading();
return fragment;
}
// 3.使用Indicator时大都需要adapter中提供获取标题的方式,以便指示器自动获取标题
@Override
public CharSequence getPageTitle(int position) {
return mStringArray[position];
}
// 4.获取整个fragment的全部个数
public int getCount() {
return mStringArray.length;
}
// 5.默认返回的是POSITION_UNCHANGE,他表示该item不会重新加载
// 对于多页面的展示,同时我们需要页面去刷新,在此我们返回的是position_none
public int getItemPosition(Object object) {
return POSITION_NONE;
}
// 6.返回POSITION_NONE是一种刷新fragment的方法,但是其造成资源浪费,因为每次都要将页面都重新加载,我们可以只加载有需要的页面,见下方链接
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, position);
}
}
ViewPager刷新单个页面的方法:http://lovelease.iteye.com/blog/2107296
在此我们需要了解 “FragmentPagerAdapter与FragmentStatePagerAdapter使用详解与区别”,详情可以看看详解:http://blog.csdn.net/hknock/article/details/46741573
3.使用简单工厂模式来获取fragment
将fragment存储在集合中,根据viewpager中的position来获取对应的fragment,同时需要保证fragment的唯一性不被重复创建。
4.在viewpager的getViewTreeObserver中添加addOnGlobalLayoutListener监听,当页面整个布局构建完毕后,去设置当前的viewpager展示第一页
FragmentFactory.getFragment(0).loading();
5.将所使用的Fragment的进行封装,统一提供loading()方法进行加载。
ToolBar的使用
1.构建ToolBar
ActionBar已经被ToolBar所替代,如果一个普通的Activity没有继承AppCompatActivity使用方法详情见:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2006.html
事实上ToolBar与ActionBar不同,ToolBar是一个继承自View的控件,ActionBar则是继承自Object的抽象类。具体用法有待学习!
使用自带ToolBar的Activity需要两个设置:
- Activity继承自AppCompatActivity
- 主题风格设置为
Theme.AppCompat.Light.DarkActionBar”
@color/colorPrimary
@color/colorPrimaryDark
@color/colorAccent
2.DrawerLayout的使用
Drawerlayout的简单使用
对应布局文件中,将DrawerLayout作为根布局将主布局include进来,DrawerLayout中一定要有一个具有android:layout_gravity="left"
属性的控件,作为侧边栏布局。可以将一个FrameLayout设置为侧边栏然后include(NavigationMenuView可以用来做侧边栏,也是as推荐的方案)
3.DrawerLayout和ToolBar的结合(ActionBarDrawerToggle)
为了实现点击效果如下:
需要将ToolBar和DrawerLayout关联起来,具体代码如下:
ActionBar supportActionBar = getSupportActionBar();// 获取自带supportactionbar supportActionBar.setDisplayShowHomeEnabled(true); // 设置标题可点击 supportActionBar.setDisplayHomeAsUpEnabled(true); // 显示标题旁边的图片(默认是返回箭头图标) supportActionBar.setLogo(R.drawable.ic_drawer_am);// 设置了似乎会被下面的代码抵消 DrawerLayout dl_drawer_layout =(DrawerLayout) findViewById(R.id.dl_drawer_layout); // 找到自己的DrawerLayout mActionBarDrawerToggle = new ActionBarDrawerToggle(this, dl_drawer_layout, R.string.navigation_drawer_open, R.string.navigation_drawer_close); // 用于关联的开关 mActionBarDrawerToggle.syncState(); // 配置完毕后将开关进行关联 // 监听ActionBar的点击事件 public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); switch (itemId) { case android.R.id.home: // 通过开关来打开关闭侧边栏 mActionBarDrawerToggle.onOptionsItemSelected(item); break; } return super.onOptionsItemSelected(item); }