国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 詳解Android開發中Fragment的使用

詳解Android開發中Fragment的使用

2019-12-31 14:39低調小一 JAVA教程

這篇文章主要介紹了詳解Android開發中Fragment的使用,包括Java代碼中調用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):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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都有自己的一套生命周期回調方法和處理自己的用戶輸入事件。對應的生命周期如下圖所示:

詳解Android開發中Fragment的使用

在Activity中加入Fragment
首先,需要確保Acitivity支持Fragment,因此Activity通常需要繼承自FragmentActivity。在Activity中添加Fragment通常有兩種方法:靜態的和動態的。
靜態方法
直接在Activity的XML布局文件中加入Fragment,如下所示:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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)。參考代碼如下:

?
1
2
3
4
5
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。示例代碼如下:

  1. import android.os.Bundle; 
  2. import android.support.v4.app.Fragment; 
  3.   
  4. public class TestFragment extends Fragment { 
  5.  public static TestFragment newInstance(int num, String title) {  
  6.   TestFragment fragment = new TestFragment(); 
  7.   Bundle args = new Bundle(); 
  8.   args.putInt("num", num); 
  9.   args.putString("title", title); 
  10.   fragment.setArguments(args); 
  11.   return fragment; 
  12.  } 
  13.   
  14.  @Override 
  15.  public void onCreate(Bundle savedInstanceState) { 
  16.   super.onCreate(savedInstanceState); 
  17.   
  18.   int num = getArguments().getInt("num", 0); 
  19.   String title = getArguments().getString("title"""); 
  20.  } 
  21.   
 

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

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

調用Fragment的方法
因為Activity可以獲取嵌入的Fragment的句柄,因此可以直接通過Fragment句柄調用該方法。

  1. public class TestFragment extends Fragment {  
  2.  public void doSomething(String param) { 
  3.   // do something in fragment 
  4.  } 

在Activity中,可以直接通過Fragment的對象句柄調用該方法:

  1. public class MainActivity extends FragmentActivity {  
  2.  @Override 
  3.  public void onCreate(Bundle savedInstanceState) { 
  4.   super.onCreate(savedInstanceState); 
  5.   TestFragment testFragment = new TestFragment(); 
  6.   testFragment.doSomething("some param"); 
  7.  } 

Fragment Listener
如果Fragment需要共享事件給Activity,則需要利用這個方法。Fragment中定義一個接口,并且由Activity來實現這個接口。在onAttach()方法中將實現了這個接口的Activity獲得到。
在Fragment中定義接口代碼如下:

  1. import android.support.v4.app.Fragment; 
  2.    
  3.  public class MyListFragment extends Fragment { 
  4.   // ... 
  5.   // Define the listener of the interface type 
  6.   // listener is the activity itself 
  7.   private OnItemSelectedListener listener; 
  8.    
  9.   // Define the events that the fragment will use to communicate 
  10.   public interface OnItemSelectedListener { 
  11.   public void onRssItemSelected(String link); 
  12.   } 
  13.    
  14.   // Store the listener (activity) that will have events fired once the fragment is attached  
  15.   @Override 
  16.   public void onAttach(Activity activity) { 
  17.   super.onAttach(activity); 
  18.    if (activity instanceof OnItemSelectedListener) { 
  19.    listener = (OnItemSelectedListener) activity; 
  20.    } else { 
  21.    throw new ClassCastException(activity.toString() 
  22.     + " must implement MyListFragment.OnItemSelectedListener"); 
  23.    } 
  24.   } 
  25.    
  26.   // Now we can fire the event when the user selects something in the fragment 
  27.   public void onSomeClick(View v) { 
  28.    listener.onRssItemSelected("some link"); 
  29.   } 
  30.  } 
 

在Activity中實現這個接口:

 
  1. import android.support.v4.app.FragmentActivity; 
  2.    
  3.  public class RssfeedActivity extends FragmentActivity implements 
  4.   MyListFragment.OnItemSelectedListener { 
  5.   DetailFragment fragment; 
  6.    
  7.   @Override 
  8.   protected void onCreate(Bundle savedInstanceState) { 
  9.    super.onCreate(savedInstanceState); 
  10.    setContentView(R.layout.activity_rssfeed); 
  11.    fragment = (DetailFragment) getSupportFragmentManager() 
  12.     .findFragmentById(R.id.detailFragment); 
  13.   } 
  14.    
  15.   // Now we can define the action to take in the activity when the fragment event fires  
  16.   @Override 
  17.   public void onRssItemSelected(String link) { 
  18.    if (fragment != null && fragment.isInLayout()) { 
  19.     fragment.setText(link); 
  20.    } 
  21.   } 
  22.  } 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99国产精品久久久 | av国产精品 | 久久久久亚洲精品 | 国产一区二区三区在线视频 | 91亚洲日本aⅴ精品一区二区 | 中国黄色一级视频 | 亚洲一区二区在线播放 | 日本精品久久 | 亚洲无线看 | 日日视频| 欧美jjzz| av在线免费网址 | 精产品自偷自拍 | 中文字幕 亚洲一区 | 在线欧美日韩 | 韩日中文字幕 | 日韩一二三区视频 | 在线免费看黄 | a免费视频 | 成人久久久 | 国产精品美女久久久久久免费 | 色综合天天综合网国产成人综合天 | 精品国产乱码久久久久久88av | 91精品欧美久久久久久动漫 | 福利网在线 | 久久久久久久av | 日韩一区二区三区在线 | 久久精品一区二区三区四区 | 极品一区 | 久久综合久久综合久久 | 亚洲综合色自拍一区 | 一级黄色片在线 | 色花av| 黄视频网站免费观看 | 亚洲精品中文字幕在线观看 | 中文字幕第33页 | 亚洲国产综合在线 | 动漫卡通精品一区二区三区介绍 | 精品久久一区二区三区 | www.久久久.com| 观看av |