程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 詳解Android開辟中Fragment的應用

詳解Android開辟中Fragment的應用

編輯:關於JAVA

詳解Android開辟中Fragment的應用。本站提示廣大學習愛好者:(詳解Android開辟中Fragment的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Android開辟中Fragment的應用正文


媒介
進修Java和Android快要一年的時光了,時代的結果應當就是自力完成了一個Android客戶端,而且包管了其在主線版本的穩固性。時代碰到了許多坑,也隨著師兄學到了許多Android常識。然則人老是要擁抱變更,不克不及讓本身太安適,固然有不捨,然則我曾經證實了本身的進修才能,下一步就是開端做Rom Porting了。這裡總結一下之前項目頂用到最多的Fragment。

Fragment簡介
Fragment可以懂得成Activity頂用戶界面的一個行動或許一部門,它必需被嵌套在Activity中。然則一個Fragment有它本身自力的xml結構文件,而且具有優越的封裝性,是以特別情形下Fragment可以很輕易用Activity來停止調換。

創立Fragment
創立一個Fragment和創立Activity相似,須要完成XML結構文件和Java Class。
XML結構文件和其他結構文件都一樣,例如以下所示的結構文件(fragment_layout.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 
   android:id="@+id/textView" 
   android:layout_width="wrap_content" 
   android:layout_height="wrap_content" 
   android:text="@string/testview" /> 
  
  <Button 
   android:id="@+id/button" 
   android:layout_width="wrap_content" 
   android:layout_height="wrap_content" 
   android:text="@string/button" /> 
  
 </LinearLayout> 

Java代碼中,普通情形下可以依據須要完成Fragment以下幾個性命周期辦法:
1. onAttach():當Fragment依靠於activity時被挪用,可以在該辦法中獲得activity句柄,從而完成Fragment和activity之間的通訊。
2. onCreate():對Fragment做初始化。
3. onCreateView():在第一次為Fragment繪制用戶界面時體系會挪用此辦法。
4. onActivityCreated():在宿主Activity onCreate函數履行完成以後被挪用,可以在這個辦法裡停止Fragment本身的widget實例化和營業邏輯處置。
5. onDestoryView():當Fragment開端被燒毀時挪用。
6. onStart():當Fragment可見時被挪用。
還有很多其他用以把持Fragment性命周期中各個階段的回調函數,年夜家可自行Google進修。

Fragment性命周期
每個Fragment都有本身的一套性命周期回調辦法和處置本身的用戶輸出事宜。對應的性命周期以下圖所示:

在Activity中參加Fragment
起首,須要確保Acitivity支撐Fragment,是以Activity平日須要繼續自FragmentActivity。在Activity中添加Fragment平日有兩種辦法:靜態的和靜態的。
靜態辦法
直接在Activity的XML結構文件中參加Fragment,以下所示:

 

 <?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:baselineAligned="false" 
  android:orientation="horizontal" > 
  
  <fragment 
   android:id="@+id/first" 
   android:name="com.example.FristFragment" 
   android:layout_width="0dp" 
   android:layout_height="match_parent" 
   android:layout_weight="1" /> 
  
  <fragment 
   android:id="@+id/second" 
   android:name="com.example.SecondFragment" 
   android:layout_width="0dp" 
   android:layout_height="match_parent" 
   android:layout_weight="1" /> 
  
 </LinearLayout> 

<fragment>中的android:name 屬性指定了結構中實例化的fragment類
當體系創立Activity結構時,它實例化了結構文件中指定的每個Fragment,而且為它們挪用onCreateView()函數,以獲得每個fragment的結構。體系直接在<fragment>元素地位拔出fragment前往的view
留意:每一個fragment都須要一個獨一的標識,假如重啟activity,體系可用來恢復fragment(而且用來捕獲fragment的事務處置,例如移除)。為了Fragment供給ID有三種辦法:

  •     用android:id屬性供給一個獨一的標識
  •     用android:tag屬性供給一個獨一的字符串
  •     假如上述兩個屬性都沒有,體系會應用其容器視圖的ID

靜態辦法
應用FragmentTranscation。可使用FragmentTranscation的API來對Activity的Fragment停止操作(例如添加,移除,或許調換Fragment)。參考代碼以下:

 FragmentManager fragmentManager = getFragmentManager() 
 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
 ExampleFragment fragment = new ExampleFragment(); 
 fragmentTransaction.add(R.id.fragment_container, fragment); 
 fragmentTransaction.commit(); 

傳入add()函數的第一個參數是Fragment被放置的ViewGroup,它由資本ID(resource ID)指定,第二個參數就是要添加的fragment。一旦經由過程FragmentTranscation做了更改,都應該應用commit()視變更失效。

Fragments通訊
Fragments之間不該該直接停止通訊,它們之間的交互應當經由過程宿主Activity停止。有三種Fragment和Acitivity交互的辦法:
1. Activity創立帶參數的Fragment。
2. Activity中堅持了Fragment的對象句柄,可經由過程句柄直接挪用該Fragment的public辦法。
3. Fragment可在onAttach函數中獲得界說的listener句柄。
創立帶參數的Fragment
在某些特定的情形下,Fragment能夠須要特定的參數來停止初始化。因為Fragment必需只要一個無參結構函數,是以可以斟酌應用靜態的newInstance辦法來創立帶參數的Fragment。示例代碼以下:

  

 import android.os.Bundle; 
 import android.support.v4.app.Fragment; 
  
 public class TestFragment extends Fragment { 
  public static TestFragment newInstance(int num, String title) { 
   TestFragment fragment = new TestFragment(); 
   Bundle args = new Bundle(); 
   args.putInt("num", num); 
   args.putString("title", title); 
   fragment.setArguments(args); 
   return fragment; 
  } 
  
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
   super.onCreate(savedInstanceState); 
  
   int num = getArguments().getInt("num", 0); 
   String title = getArguments().getString("title", ""); 
  } 
  
 } 

你可以在Activity裡,簡略的加載一個帶參數的Fragment:

 FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
 TestFragment fragment = TestFragment.newInstance(5, "fragment title"); 
 ft.replace(R.id.placeholder, fragment); 
 ft.commit(); 

挪用Fragment的辦法
由於Activity可以獲得嵌入的Fragment的句柄,是以可以直接經由過程Fragment句柄挪用該辦法。

 public class TestFragment extends Fragment { 
  public void doSomething(String param) { 
   // do something in fragment 
  } 
 } 

在Activity中,可以直接經由過程Fragment的對象句柄挪用該辦法:

 public class MainActivity extends FragmentActivity { 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
   super.onCreate(savedInstanceState); 
   TestFragment testFragment = new TestFragment(); 
   testFragment.doSomething("some param"); 
  } 
 } 

Fragment Listener
假如Fragment須要同享事宜給Activity,則須要應用這個辦法。Fragment中界說一個接口,而且由Activity來完成這個接口。在onAttach()辦法中將完成了這個接口的Activity取得到。
在Fragment中界說接口代碼以下:

   

import android.support.v4.app.Fragment; 
  
 public class MyListFragment extends Fragment { 
  // ... 
  // Define the listener of the interface type 
  // listener is the activity itself 
  private OnItemSelectedListener listener; 
  
  // Define the events that the fragment will use to communicate 
  public interface OnItemSelectedListener { 
  public void onRssItemSelected(String link); 
  } 
  
  // Store the listener (activity) that will have events fired once the fragment is attached 
  @Override 
  public void onAttach(Activity activity) { 
  super.onAttach(activity); 
   if (activity instanceof OnItemSelectedListener) { 
   listener = (OnItemSelectedListener) activity; 
   } else { 
   throw new ClassCastException(activity.toString() 
    + " must implement MyListFragment.OnItemSelectedListener"); 
   } 
  } 
  
  // Now we can fire the event when the user selects something in the fragment 
  public void onSomeClick(View v) { 
   listener.onRssItemSelected("some link"); 
  } 
 } 

在Activity中完成這個接口:

   

import android.support.v4.app.FragmentActivity; 
  
 public class RssfeedActivity extends FragmentActivity implements 
  MyListFragment.OnItemSelectedListener { 
  DetailFragment fragment; 
  
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
   super.onCreate(savedInstanceState); 
   setContentView(R.layout.activity_rssfeed); 
   fragment = (DetailFragment) getSupportFragmentManager() 
    .findFragmentById(R.id.detailFragment); 
  } 
  
  // Now we can define the action to take in the activity when the fragment event fires 
  @Override 
  public void onRssItemSelected(String link) { 
   if (fragment != null && fragment.isInLayout()) { 
    fragment.setText(link); 
   } 
  } 
 } 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved