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()方法中.
- Android开发---Fragment使用指南
- Android开发---Viewpager+Fragment使用指南
- Android开发之Fragment
- 初学android开发--Fragment
- Android应用开发:Fragment
- android开发之Fragment
- Android开发之fragment
- android开发-Fragment生命周期
- android开发之VIM快捷键使用指南
- android开发之VIM快捷键使用指南
- android开发之VIM快捷键使用指南
- android开发之VIM快捷键使用指南
- android开发之VIM快捷键使用指南
- 【Android 应用开发】 Fragment 详解
- Android 开发 之 Fragment 详解
- Android 开发 之 Fragment 详解
- Android 开发 之 Fragment 详解
- 【Android开发】之Fragment生命周期
- shell里的小问题
- Adb connection Error:远程主机强迫关闭了一个现有的连接
- text1+text2=text3
- 汇编输出十进制数
- 一、Android调用WebServices原理
- Android开发---Fragment使用指南
- 算法导论——插入排序
- 相似词的挖掘
- 二分查找
- codevs 1173 最优贸易
- mac mini安装ubuntu系统
- 【ubuntu14.04配置caffe】一——双显卡安装NVIDIA驱动以及cuda和cudnn
- Windows下Eclipse连接hadoop
- 一份耕耘一份收获