Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 學習之 Fragment(一)

Android 學習之 Fragment(一)

編輯:關於Android編程

Android為什麼引入碎片Fragment?

現在形形色色的Android設備,屏幕尺寸各有不同,同樣的布局,可能在不同的設備上有著不同的效果,比如在手機上顯示很完美,到了大屏的平板上也許就拉伸的很難看了,所以Android引入碎片這個概念,就是讓一個APP能夠兼容不同屏幕大小的Android設備,一個apk可以在各種設備上完美的使用,聽起來很nice了。在布局中,Fragement實際上是Activity的一部分,目的就是讓程序更加合理和充分的利用屏幕的空間,也可以動態的去選擇不同的碎片來適應整個屏幕, 聽起來是不是很省心省力, 下面就來體驗一下.

1. 碎片的簡單用法

這裡主要是體驗一下如何使用碎片了,首先碎片要對應一個布局,布局用來干什麼, 應該是來確定這個碎片要放什麼,如何擺放,碎片可以理解成一個裝修房子的設計圖,我的主屏幕當然是房子了,我可以劃定一塊區域專門用來放碎片,比如主臥,我可以設計好幾種不同的裝修風格,當然我也可以把整個房子全部弄成碎片...

那麼,這裡我們將一個屏幕分成2個碎片,一個左碎片,一個右碎片,他們的布局文件為 左碎片一個Button,右碎片一個TextView

left_fragment.xml

 


right_fragment.xml

 

 




    

有了房間的裝修圖,進一步需要按照裝修圖進行裝修,將其變成現實... 這裡需要寫一個Fragment的子類,並且重寫onCreateView函數,在Activity引用Fragment的時候會調用這個函數進行加載,在這個函數裡我們就會把對應的碎片布局加載進來變成現實哈

 

LeftFragment.java

 

public class LeftFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.left_fragment,container,false);
        return view;
    }
}

RightFragment.java

 

 

public class RightFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.right_fragment,container,false);
        return view;
    }
}

Activity.xml

 

 




    
    <framelayout android:id="@+id/right_layout" android:layout_height="match_parent" android:layout_width="match_parent">
        
    </framelayout>


這裡左邊有一個Fragment,右邊又有一個FrameLayout的布局,裡面放著一個fragment!使用fragment標簽來添加碎片,這裡有個class就是添加碎片的類名了...

 

其實這樣已經完成了碎片的使用,看圖:

\
 

2.動態加載碎片

上面簡單的把碎片顯示出來了,這根本沒有達到我們的目的.那如何在運行時動態的加載呢? 比如說我的房間我住了幾年不喜歡了,想換一種裝修風格,怎麼辦,拆了重新換,雖然在現實生活中很難,但是在Android的世界裡,想換就換,比如說這裡在有一個其他的Fragment布局,我想點一下按鈕,就換到另外一個Fragment,先寫一個Another的布局

another_right_fragment.xml

 




    

同樣也是創建一個AnotherRightFragment class

 

 

public class AnotherRightFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View view = inflater.inflate(R.layout.another_right_fragment, container,false);
        return view;
    }
}

在主函數中實現點擊按鈕,進行切換碎片

 

 

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button b = (Button) findViewById(R.id.left_frag_button);
        b.setOnClickListener(this);
    }

    public void onClick(View v){

        switch (v.getId()){
            case R.id.left_frag_button:
            //1.創建待添加的碎片實例  
            AnotherRightFragment fragment = new AnotherRightFragment();  
            //2.獲取到FragmentManager,在活動中可以直接調用getFragmentManager()方法得到  
            FragmentManager fragmentManager = getFragmentManager();  
            //3.開啟一個事務,通過調用beginTransaction()方法開啟  
            FragmentTransaction transaction = fragmentManager.beginTransaction();  
            //4.向容器內添加碎片,一般使用replace()方法實現,需要傳入容器的id和待添加的碎片實例  
            transaction.replace(R.id.right_layout, fragment);  
            //5.提交事務,調用commit()方法來完成  
            transaction.commit();  
            default:
                break;
        }

    }

}
這裡要引用一個FragmentManager來開啟一個事務,利用事務來完成碎片的replace!事務屬於數據庫的一個名詞,可能需要到學習的時候再來詳細的介紹了,這個地方目前可以先記住,先看下點擊按鈕後的效果圖:

 

\

 

3.在碎片中模擬返回棧

從上面的動態加載碎片功能中,我們按下返回鍵的時候就退出了,並沒有之前Activity 棧的感覺,那麼能不能實現那樣的效果呢? 即我們在按返回鍵的時候就直接返回到上一個fragment,這個其實是比較容易實現的,一個API 就搞定了,就是FragmentTransaction中的addTobackStack方法, 這個可以自己體驗一下!

 

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button b = (Button) findViewById(R.id.left_frag_button);
        b.setOnClickListener(this);
    }

    public void onClick(View v){

        switch (v.getId()){
            case R.id.left_frag_button:
                AnotherRightFragment another = new AnotherRightFragment();
                FragmentManager manager = getFragmentManager();
                FragmentTransaction trans = manager.beginTransaction();
                trans.replace(R.id.right_layout,another);
                trans.addToBackStack(null);
                trans.commit();
                break;
            default:
                break;
        }

    }

}

4.動態加載布局的技巧

這個地方其實實際的功能就是我們設計2套方案,讓系統自己去選,選擇一個適應的方案,我們在設計一個顯示單頁的layout,一個顯示雙頁的layout,在使用大屏的平板設備時自動選擇雙頁顯示,在使用手機時就選擇單頁顯示!要完成這個功能就需要使用到限定符了,其實這就是一個界限來,來劃分屏幕的大小分辨率等!

這裡根據屏幕大小的特征限定符,新建一個large的layout,方法如下圖

\

 

新建之後會在activity_main中出現2個xml文件,其中一個後面會有large的標示,代表這個是提供給超大屏幕設備的資源。2個xml文件的內容如下

activity_main.xml

 




    


 

activity_main.xml(large)

 



    

    


OK, 分別在手機和平板上運行一下,看看效果,手機的效果如下,加載了普通的xml

 

\

平板的效果如下,加載了large的xml

\

 

總結:

以上內容主要介紹了Fragment的使用,從簡單的嘗試到動態加載來適應不同的設備。下面還會有一篇文章專門介紹一下碎片的生命周期,以及碎片與Activity之間的通訊,以及一個小的實例。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved