Android开发---Fragment使用指南

来源:互联网 发布:unity3d c 脚本编程 编辑:程序博客网 时间:2024/06/02 08:22

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

学习资料来源: 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()方法中.




1 0
原创粉丝点击