android——fragment詳解

來源:互聯網
上載者:User

標籤:

在android開發過程中,如果使用到了導覽列。那麼不可避免的就需要使用fragment來處理介面。閑著沒事,就詳解一下Framgent的使用方法吧。

難得寫一次。本人

shoneworn 

shonewron

shoneworn 

重要事情說三遍。

1.Fragment 的生命週期

情境示範 : 切換到該Fragment
11-29 14:26:35.095: D/AppListFragment(7649): onAttach
11-29 14:26:35.095: D/AppListFragment(7649): onCreate
11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
11-29 14:26:35.120: D/AppListFragment(7649): onStart
11-29 14:26:35.120: D/AppListFragment(7649): onResume
螢幕滅掉:
11-29 14:27:35.185: D/AppListFragment(7649): onPause
11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
11-29 14:27:35.205: D/AppListFragment(7649): onStop

螢幕解鎖
11-29 14:33:13.240: D/AppListFragment(7649): onStart
11-29 14:33:13.275: D/AppListFragment(7649): onResume

切換到其他Fragment:
11-29 14:33:33.655: D/AppListFragment(7649): onPause
11-29 14:33:33.655: D/AppListFragment(7649): onStop
11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView

切換回本身的Fragment:
11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart
11-29 14:33:55.825: D/AppListFragment(7649): onResume
回到案頭
11-29 14:34:26.590: D/AppListFragment(7649): onPause
11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState
11-29 14:34:26.880: D/AppListFragment(7649): onStop
回到應用
11-29 14:36:51.940: D/AppListFragment(7649): onStart
11-29 14:36:51.940: D/AppListFragment(7649): onResume

退出應用
11-29 14:37:03.020: D/AppListFragment(7649): onPause
11-29 14:37:03.155: D/AppListFragment(7649): onStop
11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
11-29 14:37:03.165: D/AppListFragment(7649): onDestroy
11-29 14:37:03.165: D/AppListFragment(7649): onDetach

可以看出,和activity還是有差別的。

2.fragment的使用

fragment使用的時候,合理的選擇容器是很重要的。如果容器選擇不對。那麼就可能達不到自己想要的效果。

由於fragment在viewgroup中是作為一個view來顯示的。也就是只能作為一部分。所以,如果fragment不能覆蓋整個螢幕,就會出現原來的view和新的view一起顯示的景象。下面是用我線性布局來做為容器來放fragment。先看看出現的什麼效果吧

點擊textview1 後建立新的fragment2 。每次點擊後,fragment2沒有去沾滿螢幕。而是不停的向下依次排列。在點擊返回鍵後,又一次的回退,將fragment2 pop出棧。

布局檔案:

fragment1.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/container"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView        android:id="@+id/textView1"        android:layout_width="match_parent"        android:layout_height="40dp"        android:background="#32dfda"        android:gravity="center"        android:text="TextView1"        android:textSize="18sp" />    <TextView        android:id="@+id/textView2"        android:layout_width="match_parent"        android:layout_height="40dp"        android:background="#36df0a"        android:gravity="center"        android:text="TextView1"        android:textSize="18sp" />    <TextView        android:id="@+id/textView3"        android:layout_width="match_parent"        android:layout_height="40dp"        android:background="#82dfda"        android:gravity="center"        android:text="TextView1"        android:textSize="18sp" /></LinearLayout>

fragment1.java 代碼:

package com.ailin.accm.activity;import com.ailin.accm.R;import android.content.Context;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentTransaction;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.TextView;public class Fragment1 extends Fragment {    private Context context;    public Fragment1(Context context) {        this.context = context;    }        @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        View view  = inflater.inflate(R.layout.fragment1, null);        initView(view);        return view;    }    private void initView(View view) {        TextView tv1 = (TextView) view.findViewById(R.id.textView1);        tv1.setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {                                Fragment2 fg2 = new Fragment2(context);                FragmentTransaction fragmentTrans = getFragmentManager().beginTransaction();                fragmentTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);                fragmentTrans.add(R.id.container, fg2, "fg2");                fragmentTrans.addToBackStack(null);                fragmentTrans.commit();            }        });            }    }

從上面可以看出,線上性布局container中,fragment2作為一個view,被依container依次給addview進去了。那麼,如果container換成相對布局呢?又會是什麼樣子?

 

可以看出,這個時候,在點擊textview1的話,fragment2,就會覆蓋fragment1.

PS:補充說明一下,container在添加fragment2 作為view的時候,會進行一次重繪。所以,在設定fragment2.xml的時候,最好使用相對布局RelativeLayout .否則,你的fragment在tab2中能正常顯示,但是,拿到fragment1中作為一個view添加上去了,是按照絕對大小來添加的。給大家看看效果吧。

fragment1 使用相對布局作為容器。 fragment2.xml 中使用線性布局。效果看。

 

但是如果fragment2.xml也換成了相對布局,效果就是第二幅圖那樣了。

鳴謝:http://blog.csdn.net/forever_crying/article/details/8238863/

借用了一下對方的圖。文章也寫的很好。

 

android——fragment詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.