Android開發---Fragment使用指南

"我們之所以成功,是因爲站在巨人的肩膀上!"

學習資料來源: http://blog.csdn.net/lmj623565791/article/details/37970961

下面正式開始Fragment使用講解:

一.準備工作
1.引入類庫(導包)
步驟:複製android-support-v4.jar包--->project視圖下--->工程--->app--->libs粘貼--->右鍵jar包--->Add as Library--->ok
導入成功!
注意:在android.os和support.v4包裏都有Fragment類,使用的時候注意統一,要用就一直用一個,否則會引起混亂和bug.


2.v4包的意義
兼容低版本.如果不考慮兼容安卓低版本,那麼不用導入該類庫.


3.快速識別v4包和不同包的Fragment
v4包的Fragment經常會有support的字樣


二.使用方法
(在此以仿微信TAB選項卡的Fragment方式舉例說明,首頁列表顯示PackageManager類取到的手機App信息):

---------------------------------效果演示----------------------------------



---------------------------------工程結構----------------------------------



1.Fragment佈局

(1)主佈局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!--top-->
    <include layout="@layout/top"></include>

    <!--center content-->
    <FrameLayout
        android:id="@+id/id_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"></FrameLayout>

    <!--bottom-->
    <include layout="@layout/bottom"></include>
    
</LinearLayout>

(2)Fragment嵌套ListView佈局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.administrator.fragment_practice.fragment.WeixinFragment">

    <ListView
        android:id="@+id/lv_1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"></ListView>

</LinearLayout>

(3)底部佈局

<?xml version="1.0" encoding="utf-8"?>
    <!--底部-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:background="@color/background"
    android:layout_width="match_parent"
    android:layout_height="70dp">

    <!--bug:tab只能點擊字體才管用,在使用imagebutton時(用imageview時沒事,因爲本身就沒有處理點擊事件的功能)-->
    <!--原因:linerlayout和imagebutton點擊響應衝突-->
    <!--思路:讓每個tab的linearlayout認爲 imagebutton不能處理點擊事件 -->
    <!--效果就是打到 點擊linearlayout就起作用-->
    <!--解決方案:設置 imgbtn的clickable屬性爲"false"-->

    <!--微信-->
    <LinearLayout
        android:id="@+id/ll_tab_weixin"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:gravity="center"
        android:orientation="vertical"
        android:layout_height="fill_parent">

        <ImageButton
            android:id="@+id/imgb_tab_weixin"
            android:src="@drawable/weixinoff"
            android:background="#00000000"
            android:clickable="false"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:text="微信1"
            android:textColor="#fff"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        </LinearLayout>

    <!--通訊錄-->
    <LinearLayout
        android:id="@+id/ll_tab_contact"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:gravity="center"
        android:orientation="vertical"
        android:layout_height="fill_parent">

        <ImageButton
            android:id="@+id/imgb_tab_contact"
            android:src="@drawable/contactoff"
            android:background="#00000000"
            android:clickable="false"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:text="通訊錄"
            android:textColor="#fff"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        </LinearLayout>

    <!--發現-->
    <LinearLayout
        android:id="@+id/ll_tab_find"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:gravity="center"
        android:orientation="vertical"
        android:layout_height="fill_parent">

        <ImageButton
            android:id="@+id/imgb_tab_find"
            android:src="@drawable/findoff"
            android:background="#00000000"
            android:clickable="false"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:text="發現"
            android:textColor="#fff"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        </LinearLayout>

    <!--用戶-->
    <LinearLayout
        android:id="@+id/ll_tab_user"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:gravity="center"
        android:orientation="vertical"
        android:layout_height="fill_parent">

        <ImageButton
            android:id="@+id/imgb_tab_user"
            android:src="@drawable/useroff"
            android:background="#00000000"
            android:clickable="false"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:text="我的"
            android:textColor="#fff"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        </LinearLayout>
</LinearLayout>



2.Java關鍵代碼

(1)MainActivity

public class MainActivity extends Activity implements View.OnClickListener {

    //tab
    private LinearLayout mTabWeixin;
    private LinearLayout mTabContact;
    private LinearLayout mTabFind;
    private LinearLayout mTabUser;

    //imgb
    private ImageButton mImgbWeixin;
    private ImageButton mImgbContact;
    private ImageButton mImgbFind;
    private ImageButton mImgbUser;

    //frg
    private Fragment mFrgWeixin;
    private Fragment mFrgContact;
    private Fragment mFrgFind;
    private Fragment mFrgUser;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        //初始化控件
        initView();

        //初始化事件
        initEvent();

        //初始化狀態
        setSelect(0);
    }

    private void initEvent() {
        mTabWeixin.setOnClickListener(this);
        mTabContact.setOnClickListener(this);
        mTabFind.setOnClickListener(this);
        mTabUser.setOnClickListener(this);
    }

    private void resetImgb() {
        mImgbWeixin.setImageResource(R.drawable.weixinoff);
        mImgbContact.setImageResource(R.drawable.contactoff);
        mImgbFind.setImageResource(R.drawable.findoff);
        mImgbUser.setImageResource(R.drawable.useroff);
    }

    private void initView() {
        //tab
        mTabWeixin = (LinearLayout) this.findViewById(R.id.ll_tab_weixin);
        mTabContact = (LinearLayout) this.findViewById(R.id.ll_tab_contact);
        mTabFind = (LinearLayout) this.findViewById(R.id.ll_tab_find);
        mTabUser = (LinearLayout) this.findViewById(R.id.ll_tab_user);

        //imgb
        mImgbWeixin = (ImageButton) this.findViewById(R.id.imgb_tab_weixin);
        mImgbContact = (ImageButton) this.findViewById(R.id.imgb_tab_contact);
        mImgbFind = (ImageButton) this.findViewById(R.id.imgb_tab_find);
        mImgbUser = (ImageButton) this.findViewById(R.id.imgb_tab_user);
    }


    @Override
    public void onClick(View v) {
        //重置圖片
        resetImgb();

        //1.點亮對應按鈕
        //2.切換到對應frgment上
        switch (v.getId()) {
            case R.id.ll_tab_weixin:
                setSelect(0);
                break;
            case R.id.ll_tab_contact:
                setSelect(1);
                break;
            case R.id.ll_tab_find:
                setSelect(2);
                break;
            case R.id.ll_tab_user:
                setSelect(3);
                break;

            default:
                break;
        }
    }

    public void setSelect(int select) {
        //1.點亮對應按鈕
        //2.切換到對應frgment上


        //fragment管理器類
        FragmentManager fm = this.getFragmentManager();
        //開啓管理器事務
        FragmentTransaction transaction = fm.beginTransaction();

        //隱藏
        hideFragment(transaction);

        switch (select) {
            case 0:
                if (mFrgWeixin == null) {
                    mFrgWeixin = new WeixinFragment();
                    transaction.add(R.id.id_content, mFrgWeixin);
                } else {
                    transaction.show(mFrgWeixin);
                }
                mImgbWeixin.setImageResource(R.drawable.weixinon);

                break;

            case 1:
                if (mFrgContact == null) {
                    mFrgContact = new ContactFragment();
                    transaction.add(R.id.id_content, mFrgContact);
                } else {
                    transaction.show(mFrgContact);
                }
                mImgbContact.setImageResource(R.drawable.contacton);

                break;

            case 2:
                if (mFrgFind == null) {
                    mFrgFind = new FindFragment();
                    transaction.add(R.id.id_content, mFrgFind);
                } else {
                    transaction.show(mFrgFind);
                }
                mImgbFind.setImageResource(R.drawable.findon);

                break;

            case 3:
                if (mFrgUser == null) {
                    mFrgUser = new UserFragment();
                    transaction.add(R.id.id_content, mFrgUser);
                } else {
                    transaction.show(mFrgUser);
                }
                mImgbUser.setImageResource(R.drawable.useron);

                break;

            default:
                break;
        }
        transaction.commit();
    }

    private void hideFragment(FragmentTransaction transaction) {
        if (mFrgWeixin != null) {
            transaction.hide(mFrgWeixin);
        }
        if (mFrgContact != null) {
            transaction.hide(mFrgContact);
        }
        if (mFrgFind != null) {
            transaction.hide(mFrgFind);
        }
        if (mFrgUser != null) {
            transaction.hide(mFrgUser);
        }
    }
}


(2)WeixinFragment(首頁,附帶ListView)

public class WeixinFragment extends Fragment implements AdapterView.OnItemClickListener {

    private ListView mListView;
    private LvAdapter mAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        //反射佈局
        View view = inflater.inflate(R.layout.fragment_weixin, container, false);
        //反射控件
        mListView = (ListView) view.findViewById(R.id.lv_1);

        //調用適配器
        mAdapter = new LvAdapter(getActivity());
        //適配器關聯控件
        mListView.setAdapter(mAdapter);
        //適配器關聯數據
        mAdapter.setList(Utils.getAppList(getActivity()));
        mAdapter.notifyDataSetChanged();

        //聲明事件
        mListView.setOnItemClickListener(this);

        return view;
    }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        Intent intent = new Intent();
        intent.setClass(getActivity(), DialogActivity.class);

        //1.得到item
        HashMap<String, Object> map = (HashMap<String, Object>) parent.getItemAtPosition(position);
        //2.得到item的內容
        String tv_name = (String) map.get("tv_name");
        //3.傳值
        intent.putExtra("tv_name", tv_name);
        startActivity(intent);
    }
}


(3)Adapter

public class LvAdapter extends BaseAdapter {
    private List<Map<String, Object>> mList;
    private LayoutInflater mLayoutInflater;

    public LvAdapter(Context context) {
        mLayoutInflater = LayoutInflater.from(context);
    }

    public void setList(List<Map<String, Object>> dataList) {
        this.mList = dataList;
    }

    @Override
    public int getCount() {
        return (mList == null) ? 0 : mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            //反射佈局
            convertView = mLayoutInflater.inflate(R.layout.item_listview, null);
            //反射控件
            holder.iv_logo = (ImageView) convertView.findViewById(R.id.iv_logo);
            holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
            holder.tv_version = (TextView) convertView.findViewById(R.id.tv_version);
            holder.tv_time = (TextView) convertView.findViewById(R.id.tv_time);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        //賦值
        Map<String, Object> map = mList.get(position);
        holder.iv_logo.setImageDrawable((android.graphics.drawable.Drawable) mList.get(position).get("iv_logo"));

        holder.tv_name.setText((String) map.get("tv_name"));
        holder.tv_version.setText((String) map.get("tv_version"));
        holder.tv_time.setText((String) map.get("tv_time"));

        return convertView;
    }

    public class ViewHolder {
        ImageView iv_logo;
        TextView tv_name;
        TextView tv_version;
        TextView tv_time;
    }
}


(4)Utils

public class Utils {
    public static List<Map<String, Object>> getAppList(Context context) {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        //包管理器
        PackageManager pm = context.getPackageManager();
        //包信息集合
        List<PackageInfo> pList = pm.getInstalledPackages(0);

        for (PackageInfo packageInfo : pList) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("iv_logo", packageInfo.applicationInfo.loadIcon(pm));
            map.put("tv_name", (String) packageInfo.applicationInfo.loadLabel(pm));
            map.put("tv_version", packageInfo.versionName);
            map.put("tv_time", getTime(packageInfo.firstInstallTime));
            list.add(map);
        }
        return list;
    }

    public static String getTime(long millis) {
        Date date = new Date(millis);
        SimpleDateFormat smf = new SimpleDateFormat("MM-dd");
        return smf.format(date);

    }
}


(5)DialogActivity

public class DialogActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);

        TextView tv_name_dialog  = (TextView) this.findViewById(R.id.tv_name_dialog);
        String tv_name = getIntent().getStringExtra("tv_name");
        tv_name_dialog.setText(tv_name);
    }
}

三.注意事項
1.getActivity()的使用
在自定義的Fragment裏,經常要用到getActivity()方法.例如:用匿名內部類的方式監聽到按鈕點擊事件,並用Toast輸出,第一個參數要寫getActivity(),原因如下:
對源碼進行分析:
Fragment類有getActivity()方法:

/**
 * Return the Activity this fragment is currently associated with.
 */
final public Activity getActivity() {
    return mActivity;
}
而其中的mActivity是:
 // Activity this fragment is attached to.
    Activity mActivity;
即,當前fragment所綁定的Activity.
同理可知,在fragment中用setAdapter(mAdapter);intent.setClass(getActivity(),DialogActivity.class);等等方法傳參時,注意不要同MainActivity一樣使用this了,而是要用getActivity().


2.XML中引入fragment佈局
(1)直接引入:

<fragment
    android:id="@+id/id_fragment_title"
    android:name="com.example.administrator.fragment_practice.fragment.WeixinFragment" <!--Fragment類名-->
    android:layout_width="fill_parent"
    android:layout_height="45dp"
    />
(2)用<include/>標籤引入
<include layout="@layout/fragment" />


3.fragment中的ListView
fragment 中使用 ListView 時,ListView及適配器的調用要寫在onCreateView()方法中.




發佈了43 篇原創文章 · 獲贊 34 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章