欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

Android學(xué)習(xí)筆記十四.深入理解fragment(二)之《圖書詳 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

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)案例查看更多