電子市場項目總結(一)
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); }