Android 基礎(三)

來源:互聯網
上載者:User

標籤:date   簡單   ide   stc   androi   uuid   資料類型   回退   dao   

學習到fragment UI Fragment管理器

建立一個Fragment的xml介面,再在java代碼中,實現fragment的生命週期:

public class CrimeFragment extends Fragment{
    private Crime mCrime;
    private EditText mTitleFieId;

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        mCrime=new Crime();
    }

建立和配置Fragment試圖是在這一個fragment生命週期方法完成的:

public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)

該方法為執行個體化Fragment視圖的布局,然後將執行個體化的View返回給託管的acrivity。

LayoutInflater及ViewGroup是執行個體化布局的必要參數,Bundle用來儲存恢複資料

在onCreateView(...)方法中:fragment的試圖使直接通過調用LayoutInflater,inflate(...)方法並傳入布局的資源ID產生的。

第二個參數是視圖的父視圖,需要父視圖來正確配置組件。

第三個參數告知布局產生器是否將產生的試圖添加給父視圖。

fragment中監聽器方法的設定和activity中完全一樣。建立實現TextWatcher監聽器介面的匿名內部類
TextWatcher有三種方法,現在只需要關注其中的onTextChanged(..)方法。在其方法中,調用CharSequence(代表使用者輸入)的toString方法
該方法用來最後返回用來設定Crime標題的字串。

 mTitleFieId.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }
            public  void onTextChanged(CharSequence s,int start,int before,int count){
                mCrime.setmTitle(s.toString());

            }

            @Override
            public void afterTextChanged(Editable s) {

            }

fragment事務被用來添加、移除、附加、分離或替換fragment隊列中的fragment。

是使用fragment在運行時組裝和重裝使用者介面的關鍵。FragmentManager管理著fragment交易回復棧。


android:layout_weight 屬性的工作原理:
告知LinearLayout如何布置安排子組件,雖然給組件設定了同樣的值後,但卻不意味著它們在螢幕上佔據同樣的寬度。在決定子組件視圖的寬度時,線性

布局使用的是layout_width和layout_weight參數的混合值


2016/11/28
圖書館: 第九章 使用RecyclerView顯示列表

單例是特殊的java類,在建立單例時,一個單例類僅允許建立一個執行個體,
Android從記憶體裡移除應用時,單例對象也就不複存在了

List<E>是一個支援存放指定資料類型對象的java有序數組類,它具有擷取,新增和刪除數組中元素的方法。

常見的List實現是1.ArrayList  LinkedList、Voctor  

Android 在聲明變數的時候,建議使用list介面類型

ArrayList 和LinkedList和Voctor的區別:

1.ArrayList是實現了基於動態數組的資料結構,LinkedList基於鏈表的資料結構。
2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指標。
3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。

Vector和ArrayList幾乎是完全相同的,唯一的區別在於Vector是同步類(synchronized).
因此,開銷就比ArrayList要大.正常情況下,大多數的Java程式員使用ArrayList而不是Vector,
因為同步完全可以由程式員自己來控制。


RecyclerView、Adapter、ViewHolder

RecyclerView是ViewGoup的子類,每一個視圖為一個View對象,RecyclerView自身不會建立視圖,建立的是一個ViewHodler,而ViewHolder

引用著一個個ItemView

Adapter是一個控制器對象
作用:
1.建立必要的ViewHodler  2.綁定ViewHoder至模型層資料  

ViewHolder的作用:
是一個持有人的類,裡面沒有方法,只有屬性,作用為一個零售的儲存空間,把getView方法
中每次返回的View存起來,能夠下次再用,優點:不必每次都到布局檔案中去拿View,提高了效率 Fragment Argument: fragment有兩種方法擷取intent中的資料,一種簡單直接,另一種為fragment argument

fragment argument:
每個fragment執行個體都可附帶一個Bundle對象。該bundle包含有索引值對,我們可以像附加extra到Activity的intent中那樣使用它們。一個索引值對即一個argument

建立Fragment argument,首先需要建立bundle對象,然後使用Bundle中的"put"方法,將argument添加到bundle中

附加argument 給fragment:
附加fragment bundle給fragment,需要調用Fragment.SetArgument(Bundle)方法,必須在建立在Fragment之後,添加給Activity前完成:
1.添加名字為newInstance()的靜態方法,而且為滿足fragment建立argument,activity可以傳入任何需要的參數給newInstanc()方法
    public static CrimeFragment newInstance(UUID crimeId){        Bundle args=new Bundle();        args.putSerializable(ARG_CRIME_ID,crimeId);        CrimeFragment fragment=new CrimeFragment();        fragment.setArguments(args);        return  fragment;

 

 

ViewPager:

ViewPager與PagerAdapter間的配合,  PagerAdapter的子類FragmentStatePagerAdapter提供了兩個方法:
getCount()和getItem(int)

FragmentStatePagerAdapter與FragmentPagerAdapter  :

FragmentPagerAdapter是另外一種可用的PagerAdapter  其用法與FragmentStatePagerAdapter方法基本一致  不同在於:
卸載不需要的Fragment時,各自採用的處理方法不同:
FragmentStatePagerAdapter會銷毀不需要的Fragment,事務提交之後,fragmentManager中的fragment會被徹底移除
FragmentStatePagerAdaoter類中的state表明:在銷毀fragment時,可在onSaveInstanceState(Bundle)方法中儲存fragment的Bundle資訊
切換回來時,儲存的執行個體狀態可用來恢複成新的fragment

FragementPagerAdapter:
在銷毀不需要的fragment時, fragment會調用事務的detach(Fragment)方法來處理,而非remove(Fragment)方法,  
FragmentPagerAdapter只是銷毀了fragment的視圖,fragment執行個體還保留在fragmentManager中  
所以FragmentPagerAdapter建立的fragment永遠不會被銷毀


ViewPager的工作原理:

PagerAdapter要比Adapter,因為要處理更多的視圖管理工作,
PagerAdapter不使用可返回的onBindViewHolder(...)方法:
1.public object instantiateItem(ViewGroup container,int position):告訴pager adapter建立指定位置的清單項目視圖,然後將其添加給ViewGroup視圖容器
2.public void destroyItem(ViewGroup container,int position,Object object): 告知pager adapter銷毀已建視圖
3.piblic abstract boolean isViewFromObject(View view,Object object)    

instantiateItem(ViewGroup ,position)方法不是立即建立Fragment,PagerAdapter可自行決定何時建立視圖
會調用isViewFromObject(View,Object)方法  Object為返回的對象   

public boolean isViewFromObject(View view,Object object){
return ((Fragment)object).getView()==view;
}


對話方塊    

Android 中有三種可以用於對話方塊的按鈕:
positive按鈕、 negative按鈕、neutral按鈕  當使用者點擊position按鈕的時候,接受對話方塊展現訊息,如果同一個對話方塊上放置有多個按鈕,按鈕的類型
與命名決定著它們在對話方塊上顯示的位置

要將DialogFragment添加到FragmentManager管理並放置到螢幕上,可調用fragment執行個體:
public void show(FragmentManager manager,String tag)
public void show(FragmentTransaction transaction,String tag)


當建立的Fragment被銷毀和重建後,作業系統也會關聯它們,調用一下Fragment方法可建立這種關聯:
public void setTargetFragment(Fragment fragment,int requestCode):
該方法有兩個參數:目標fragment以及類似於傳入startActivityForResult(...)方法的請求代碼。需要時,目標fragment使用請求代碼確認是哪個fragment在回收資料


Activity.OnActivityResult(..)方法是ActivityManager在子activity銷毀後調用的父activity方法,處理activity間的資料返回時,會自動調用Activity
.OnActivityResult(...)方法

1.編寫需要使用者大量輸入、以及要求更多空間顯示輸入的應用,並且要讓應用同事支援手機和平板裝置時,使用OnActivityResult(...)方法返回資料給目標
fragment是比較方便的

2.手機螢幕空間有限,因此通常需要使用activity託管全屏的fragment介面,來顯示使用者輸入要求,該子activity會由父activity的fragment以調用startActivityForResult(..)方法的
方式啟動。子activity被銷毀後,父activity會接受到onActivityResult(...)方法的調用請求,並將之轉寄給啟動子activity的fragment



使用AppCompat庫
完全整合AppCompat庫:
1.添加AppCompat依賴項
2.使用一種AppCompat主題
3.確保所有的activity都是AppCompatActivity子類
4.讓activity類繼承AppCompatActivity類

主題設定:1.Theme.AppCompat:黑色主題  2.Theme.AppCompat.Light:淺色主題  3.Theme.AppComPat.DarkActionBar: 帶黑色工具列的淺色主題

Fragment.onCreateOptionMenu(Menu,MenuInflater)方法是由FragmentManager負責調用的。當activity接收作業系統的onCreateOptionMenu(..)方法回調請求時,我們需要告知fragment
其管理的fragment應接收onCreateOptionsMenu(...)方法的調用指令,需調用以下方法:

public void setHasOptionsMenu(boolean hasMenu)

點點擊菜單中的功能表項目時,fragment會接收到onOptionsItemSelected(MenuItem)方法的回調請求。傳入該方法的參數是一個描述使用者選擇的MenuItem執行個體

public boolean onOptionsItemSelected(MenuItem item){        switch(item.getItemId()){            case R.id.menu_item_new_crime:                Crime crime=new Crime();                CrimeLab.get(getActivity()).addCrime(crime);                Intent intent=CrimePagerActivity.newIntent(getActivity(),crime.getmId());                startActivity(intent);                return true;            case R.id.menu_item_show_subtitle:                mSubtitleVisible=!mSubtitleVisible;                getActivity().invalidateOptionsMenu();                updateSubtitle();                return true;            //如果功能表項目ID不存在,超類版本方法會被調用            default:                return super.onOptionsItemSelected(item);        }    }

 



菜單通常包含多個功能表項目,通過檢查功能表項目ID,可確定被選定的是哪個功能表項目,然後做出相應的響應,此ID通常是菜單定義檔案中賦予功能表項目資源的資源ID

MenuItem subtitleItem=menu.findItem(R.id.menu_item_show_subtitle);        if (mSubtitleVisible){            subtitleItem.setTitle(R.string.hide_subtitle);        }else {            subtitleItem.setTitle(R.string.show_subtitle);        }

 


Android中遇見層級導航帶來的問題:導航回退到的目標activity會被完全重建,既然父activity是全新activity,執行個體變數值以及儲存的執行個體狀態顯示會
徹底丟失
在向上導航時保證子標題的可見狀態有兩種辦法:

 if (savedInstanceState!=null){            mSubtitleVisible=savedInstanceState.getBoolean(SAVED_SUBTITLE_VISIBLE);        }

 

 

    public void onSaveInstanceState(Bundle outState){        super.onSaveInstanceState(outState);        outState.putBoolean(SAVED_SUBTITLE_VISIBLE,mSubtitleVisible);    }

 


1.覆蓋向上導航的機制:在CrimePagerActivity的finish方法直接退到一個activity介面,但這隻能退回一個層級。但實際開發的時候應用裡需要多層級導航

2.啟動CrimePagerActivity時,把子標題的狀態作為extra資訊傳給它,在CrimePagerActivity中覆蓋getParentActivityIntent()方法,用附加extra
資訊的intent重建CrimeListActivity

Android 基礎(三)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.