電子市場總結(一)

電子市場項目總結(一)

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需要兩個設置:


  1. Activity繼承自AppCompatActivity
  2. 主題風格設置爲

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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章