標籤: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 基礎(三)