知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
Android學(xué)習(xí)筆記十四.深入理解fragment(二)之《圖書詳
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):39
深刻懂得fragment(二)
之《圖書詳情》拭魅戰(zhàn)
經(jīng)由過程上一篇博文《深刻懂得fragment一》,我們進修了Android-Fragment的核心常識點。如今在此基本上,應(yīng)用Fragment技巧開辟一款實用于大年夜屏幕手機/平板的查找圖書詳情的應(yīng)用軟件。該項目重要在于兩方面,一是Activity、Fragment的源碼實現(xiàn);二是,構(gòu)造界面資本文件的實現(xiàn)。
[img]http://img.blog.csdn.net/20150104174910282?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
1.res/../BookListFragment.java:
自定義類,持續(xù)于ListFragment,無需實現(xiàn)OnCreateView()辦法,用于Activity右邊顯示列表fragment。
(1)定義Callbacks接口:定義一個回調(diào)接口Callback,用于實現(xiàn)該Fragment與它地點的Activity交互;
(2)實現(xiàn)onCreate(Bundle savedInstanceState)辦法:經(jīng)由過程Adapter所供給的多個列表項,設(shè)置Fragment列表顯示的列表項;
(3)實現(xiàn)onAttach(Activity activity)辦法:將Fragment添加并顯示到Acitvity中,并將傳入的activity對象強迫類型轉(zhuǎn)化為 Callbacks接口對象,以便調(diào)用接口公共辦法onItemSelected(Integer id)響應(yīng)用戶單擊的某列表項;
(4)實現(xiàn)ListFragment的onListItemClick(ListView l, View v, int position, long id)辦法:
當(dāng)用戶點擊Acitivity中的某項列表時,onListItemClick辦法被激發(fā)。在這個辦法中調(diào)用接口的onItemSelected來竽暌閨activity共享事宜。onItemSelected()傳入的參數(shù)id是列表的被選中的行ID,另一個fragment(B)( BookDetailFragment )用這個ID來大年夜法度榜樣的ContentProvider中取得標(biāo)題標(biāo)內(nèi)容。
package com.example.android_fragment_1; import android.app.Activity; import android.app.ListFragment; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; public class BookListFragment extends ListFragment { //1.定義一個回調(diào)接口Callback,用于實現(xiàn)該Fragment與它地點的Activity交互(留意:該接口的實現(xiàn)須要在Activit中) private Callbacks mCallbacks; //Callbacks接口對象 public interface Callbacks { public void onItemSelected(Integer id); //參數(shù)為Map集合的鍵 } //2.onCreate辦法中為該ListFragment設(shè)置Adapter,讓該ListFragment顯示該Adapter所供給的多個列表項 @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setListAdapter(new ArrayAdapter<BookContent.Book>(getActivity(),// android.R.layout.simple_list_item_activated_1, android.R.id.text1, BookContent.ITEMS)); // } //3.調(diào)用該辦法將Fragment添加并顯示到Acitvity中 @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); //a.如不雅Activity中沒有實現(xiàn)Callbacks接口,拋出異常 if(!(activity instanceof Callbacks)) { throw new IllegalStateException("異常:BookListFragment地點的Activity必須實現(xiàn)Callback接口!"); } //把該Activity當(dāng)成Callbacks對象(就是這一句導(dǎo)致出現(xiàn)NullPointerException缺點) mCallbacks=(Callbacks)activity; } //4.當(dāng)該Fragment大年夜他所屬的Acitivity中被刪除時,調(diào)用該辦法 @Override public void onDetach() { super.onDetach(); mCallbacks=null; //將mCallbacks賦值為null } //5.當(dāng)用戶單擊某列表項時激發(fā)該回調(diào)辦法 @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); mCallbacks.onItemSelected(BookContent.ITEMS.get(position).id);//激發(fā)mCallbacks接口的onItemSelected辦法 } public void setActivateOnItemClick(boolean activateOnItemClick) { getListView().setChoiceMode(activateOnItemClick ? ListView.CHOICE_MODE_SINGLE:ListView.CHOICE_MODE_NONE); } }
2.res/../ BookDetailFragment.java:
onItemSelected()傳入的參數(shù)id是列表的被選中的行ID, BookDetailFragment 用這個ID來大年夜法度榜樣的ContentProvider中取得標(biāo)題標(biāo)內(nèi)容。
(1)實現(xiàn)onCreate(Bundle savedInstanceState)辦法:
獲取啟動該Fragment時傳入的ITEM_ID參數(shù)并根據(jù)該ID獲取BookContent的ITEM_MAP中的圖手札息
(2)實現(xiàn)onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)辦法:
a.為圖書詳情Fragment加載一個界面構(gòu)造文件,為兩個文本框;
b.根據(jù)傳入的參數(shù)ID來更新View容器,使文本框顯示不合的內(nèi)容;
package com.example.android_fragment_1; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /*功能: * 應(yīng)用Fragment將會顯示加載一份簡單的界面構(gòu)造文件,并根據(jù)傳入的參數(shù)來更新 * 界面組件*/ public class BookDetailFragment extends Fragment { public static final String ITEM_ID="item_id"; BookContent.Book book; //保存該Fragment顯示的book對象 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //如不雅啟動該Fragment時包含了ITEM_ID參數(shù),個中 Map containsKey(String Key) 斷定key有沒有對應(yīng)的value值; 有,則返回true 沒有,則返回false //大年夜Bundle對象中獲取傳入的參數(shù)(鍵值對) if(getArguments().containsKey(ITEM_ID)) { book=BookContent.ITEM_MAP.get(getArguments().getInt(ITEM_ID)); //獲取啟動該Fragment時傳入的ITEM_ID參數(shù)并根據(jù)該ID獲取BookContent的ITEM_MAP中的圖手札息? } } //2.重寫該辦法:該辦法返回的View將作為Fragment顯示的組件 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //a.加載/res/layout/目次下的fragment_book_detail.xml構(gòu)造文件,返回一個view目標(biāo)使該fragment的構(gòu)造顯示在Activity中 View view=inflater.inflate(R.layout.fragment_book_detail, //指明當(dāng)前fragment的資本文件 container, //父容器控件 false); //注解是否連接該構(gòu)造和其父容器控件(這里體系已經(jīng)插入了構(gòu)造到父容器中) /*將圖手札息中的標(biāo)題、屬性顯示在容器的兩個文本框中*/ if(book!=null) { //b.讓book_title文本框顯示book對象的title屬性 ((TextView) view.findViewById(R.id.book_title)).setText(book.title); //c.讓book_desc文本框顯示book對象的desc屬性 ((TextView) view.findViewById(R.id.book_desc)).setText(book.desc); } return view; } }
個中界面資本構(gòu)造文件為/res/layout/fragment_book_detail.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- 定義一個TextView來顯示圖書標(biāo)題 -->
<TextView
style="?android:attr/textAppearanceLarge"
android:id="@+id/book_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"/>
<!-- 定義一個TextView來顯示圖書描述 -->
<TextView
style="?android:attr/textAppearanceLarge"
android:id="@+id/book_desc"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"/>
</LinearLayout>
3.res/../SelectBookActivity.java:
應(yīng)用法度榜樣主Acitivity
(1)加載activity要顯示的構(gòu)造文件(two panes)
(2)實現(xiàn)Callbacks接口的onItemSelected(Integer id)辦法:
Activity大年夜FragmentA獲取傳入的ID,用來啟動FragmentB。
package com.example.android_fragment_1; import android.app.Activity; import android.os.Bundle; public class SelectBookActivity extends Activity implements BookListFragment.Callbacks { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //1.加載Activity本身的構(gòu)造資本/res/layout/main.xml并顯示(two panes) setContentView(R.layout.activity_book_twopane); } //2.實現(xiàn)Callbacks接口必須實現(xiàn)的辦法,用于實現(xiàn)該Fragment與它地點的Activity交互(即選擇點擊哪個列表項,向Fragment傳入?yún)?shù)id)//更新Activity右邊內(nèi)容 @Override public void onItemSelected(Integer id) { //a.創(chuàng)建Bundle,預(yù)備向Fragment傳入?yún)?shù) Bundle arguments=new Bundle(); arguments.putInt(BookDetailFragment.ITEM_ID, id); //裝入值id到"item_id"鍵 //b.創(chuàng)建BookDetailFragment對象,并項Fragment傳入?yún)?shù) BookDetailFragment fragment=new BookDetailFragment(); fragment.setArguments(arguments); //c.應(yīng)用fragment調(diào)換book_detail_container容器當(dāng)前顯示的Fragment getFragmentManager().beginTransaction() .WordStr(R.id.book_detail_container, fragment) .commit(); /*注釋:這一句等價于.... * FragmentManager Manager=getFragmentManager(); * FragmentTransaction Transaction=Manager.beginTransaction(); * Transaction.WordStr(R.id.book_detail_container, Manager); * Transaction.commit(); * */ } }
個中界面資本構(gòu)造文件為/res/layout/activity_book_twopane.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 定義一個水等分列的LinearLayout,并指定應(yīng)用中等分隔條 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:divider="?android:attr/dividerHorizontal"
android:showDividers="middle">
<!-- 應(yīng)用資本文件方法:添加一個fragment到Activity中 -->
<fragment
android:name="com.example.android_fragment_1.BookListFragment"
android:id="@+id/book_list"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="1"/>
<!-- 添加一個FrameLayout容器,用于顯示圖書具體信息 -->
<FrameLayout
android:id="@+id/book_detail_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"/>
</LinearLayout>
<!--解釋:這個構(gòu)造文件就定義了Activity的顯示界面:
左邊將會顯示一個ListFragment,右邊只是一個FrameLayout容器
個中FrameLayout容器將會動態(tài)更新個中顯示的Fragment -->
4.res/../BookContent.java:
用于模仿體系的數(shù)據(jù)模型
(1)List集合為左邊f(xié)ragment供給圖書(標(biāo)題)列表項數(shù)據(jù)
public static List<Book> ITEMS=new ArrayList<Book>();
對于List集合來說,book為(1,"猖狂Android教材","小我評價:這本書很好,就是有點厚!"2...3...)
(2)Map集合為右邊f(xié)ragment供給圖書詳情(標(biāo)題、屬性)數(shù)據(jù)
public static Map<Integer,Book> ITEM_MAP =new HashMap<Integer,Book>();
對應(yīng)Map集合來說,鍵book.id<--->值(1.......2.......3......)
package com.example.android_fragment_1; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class BookContent { //1.定義一個內(nèi)部類,作為體系的營業(yè)對象 public static class Book { public Integer id; //Map鍵 public String title; public String desc; public Book(Integer id,String title,String desc)//構(gòu)造函數(shù),初始化圖書詳情的"map鍵,標(biāo)題,內(nèi)容" { this.id=id; this.title=title; this.desc=desc; } public String toString() { return title; } } //2.應(yīng)用List集合記錄體系所包含的Book對象ITEMS,應(yīng)用它調(diào)用其add(對象)辦法項List集合中添加列表項 public static List<Book> ITEMS=new ArrayList<Book>(); //3.應(yīng)用Map集合記錄體系所包含的Book對象ITEM_MAP,應(yīng)用它調(diào)用put(Key,Value)辦法向Map集合中添加列表項 public static Map<Integer,Book> ITEM_MAP =new HashMap<Integer,Book>(); static{ //應(yīng)用靜態(tài)初始化代碼,將Book對象添加到List集合、Map集合中 addItem(new Book(1,"猖狂Android教材","小我評價:這本書很好,就是有點厚!")); addItem(new Book(2,"數(shù)學(xué)之美","小我評價:來自天然語音的使者")); addItem(new Book(3,"大年夜話數(shù)據(jù)構(gòu)造","小我評價:不知道如何,據(jù)說很不錯")); } private static void addItem(Book book) { // TODO Auto-generated method stub ITEMS.add(book); //添加List集合中列表項 ITEM_MAP.put(book.id,book);//添加Map集合中列表項 } }
/*注釋:
* static{},稱為static代碼塊,也叫靜態(tài)代碼塊。是在類中自力于類成員的static語句塊,可以有多個且地位可以隨便放。
* 它不屬于任何的辦法體內(nèi),JVM加載類時會履行這些靜態(tài)的代碼塊,如不雅有多個則按先后次序履行且每個代碼塊智會被履行依次。
* 比如,我們可以應(yīng)用靜態(tài)代碼塊可以對一些statci變量進行賦值*/
[img]http://img.blog.csdn.net/20150104175040109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
相關(guān)案例查看更多
相關(guān)閱讀
- 云南微信小程序開發(fā)
- 區(qū)塊鏈
- 云南網(wǎng)站建設(shè)快速優(yōu)化
- 手機網(wǎng)站建設(shè)
- 云南網(wǎng)站建設(shè)公司哪家好
- 搜索排名
- 國內(nèi)知名網(wǎng)站建設(shè)公司排名
- 百度小程序開發(fā)公司
- 網(wǎng)絡(luò)營銷
- 網(wǎng)絡(luò)公司電話
- 網(wǎng)站建設(shè)報價
- 網(wǎng)站沒排名
- 云南網(wǎng)站建設(shè)哪家強
- 昆明網(wǎng)站開發(fā)
- 網(wǎng)站建設(shè)需要多少錢
- 汽車報廢回收管理系統(tǒng)
- web前端
- 網(wǎng)站建設(shè)招商
- 網(wǎng)站排名
- 做小程序被騙
- 用戶登錄
- 小程序技術(shù)
- 小程序公司
- 河南小程序制作
- 云南網(wǎng)絡(luò)營銷
- 云南做網(wǎng)站
- web開發(fā)技術(shù)
- 昆明小程序設(shè)計
- 商標(biāo)注冊
- 網(wǎng)絡(luò)公司