将相本无种,男儿当自强。这篇文章主要讲述android 项目学习随笔三(Fragment )相关的知识,希望能为你提供帮助。
1、在主页面(activity引用Fragment
)的布局文件中定义FrameLayout ,加载Fragment
<
FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fl_content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<
/FrameLayout>
2、初始化Fragment
private void initFragment() {
// Fragment管理器
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
// 开始事务
// 将帧布局替换为对应的Fragment
transaction
.replace(R.id.fl_content, new ContentFragment(), TAG_CONTENT);
transaction.replace(R.id.fl_left_menu, new LeftMenuFragment(),
TAG_LEFT_MENU);
transaction.commit();
// 提交事务
// fm.findFragmentByTag(TAG_CONTENT);
}
3、定义Fragment基类
文章图片
文章图片
public abstract class BaseFragment extends Fragment {public Activity mActivity; // Fragment被创建 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivity = getActivity(); // 获取所在的activity对象 }// 初始化Fragment布局 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = initView(); return view; }// activity创建结束 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initData(); }/** * 初始化布局, 子类必须实现 */ public abstract View initView(); /** * 初始化数据, 子类可以不实现 */ public void initData() {} }
View Code4、定义下方菜单
文章图片
文章图片
文章图片
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > < android.support.v4.view.ViewPager android:id="@+id/vp_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> < RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_tab_bg" android:gravity="center" android:orientation="horizontal" > < RadioButton android:id="@+id/rb_home" style="@style/BottomTabStyle" android:drawableTop="@drawable/btn_home_selector" android:checked="true" android:text="首页" /> < RadioButton android:id="@+id/rb_news" style="@style/BottomTabStyle" android:drawableTop="@drawable/btn_news_selector" android:text="新闻中心" /> < RadioButton android:id="@+id/rb_smart" style="@style/BottomTabStyle" android:drawableTop="@drawable/btn_smart_selector" android:text="智慧服务" /> < RadioButton android:id="@+id/rb_gov" style="@style/BottomTabStyle" android:drawableTop="@drawable/btn_gov_selector" android:text="政务" /> < RadioButton android:id="@+id/rb_setting" style="@style/BottomTabStyle" android:drawableTop="@drawable/btn_setting_selector" android:text="设置" /> < /RadioGroup> < /LinearLayout>
布局文件
文章图片
文章图片
< resources> < !-- Base application theme, dependent on API level. This theme is replaced by AppBaseTheme from res/values-vXX/styles.xml on newer devices.--> < style name="AppBaseTheme" parent="android:Theme.Light"> < !-- Theme customizations available in newer API levels can go in res/values-vXX/styles.xml, while customizations related to backward-compatibility can go here.--> < /style> < !-- Application theme. --> < style name="AppTheme" parent="AppBaseTheme"> < !-- All customizations that are NOT specific to a particular API-level can go here. --> < /style> < style name="BottomTabStyle"> < item name="android:layout_width"> wrap_content< /item> < item name="android:layout_height"> wrap_content< /item> < item name="android:layout_weight"> 1< /item> < item name="android:button"> @null< /item> < item name="android:gravity"> center< /item> < item name="android:padding"> 5dp< /item> < item name="android:drawablePadding"> 3dp< /item> < item name="android:textColor"> @color/txt_bottom_tab_selector< /item> < /style> < /resources>
样式文件
文章图片
文章图片
< ?xml version="1.0" encoding="utf-8"?> < selector xmlns:android="http://schemas.android.com/apk/res/android"> < item android:drawable="@drawable/home_press" android:state_checked="true"> < /item> < item android:drawable="@drawable/home"> < /item> < /selector>
selector5、定义Fragment
利用XUtils findViewById
文章图片
文章图片
ViewUtils使用方法完全注解方式就可以进行UI绑定和事件绑定。 无需findViewById和setClickListener等。 // xUtils的view注解要求必须提供id,以使代码混淆不受影响。 @ViewInject(R.id.textView) TextView textView; //@ViewInject(vale=R.id.textView, parentId=R.id.parentView) //TextView textView; @ResInject(id = R.string.label, type = ResType.String) private String label; // 取消了之前使用方法名绑定事件的方式,使用id绑定不受混淆影响 // 支持绑定多个id @OnClick({R.id.id1, R.id.id2, R.id.id3}) // or @OnClick(value=https://www.songbingjia.com/android/{R.id.id1, R.id.id2, R.id.id3}, parentId={R.id.pid1, R.id.pid2, R.id.pid3}) // 更多事件支持参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。 @OnClick(R.id.test_button) public void testButtonClick(View v) { // 方法签名必须和接口中的要求一致 ... } ... //在Activity中注入: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ViewUtils.inject(this); //注入view和事件 ... textView.setText("some text..."); ... } //在Fragment中注入: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.bitmap_fragment, container, false); // 加载fragment布局 ViewUtils.inject(this, view); //注入view和事件 ... } //在PreferenceFragment中注入: public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ViewUtils.inject(this, getPreferenceScreen()); //注入view和事件 ... } // 其他重载 // inject(View view); // inject(Activity activity) // inject(PreferenceActivity preferenceActivity) // inject(Object handler, View view) // inject(Object handler, Activity activity) // inject(Object handler, PreferenceGroup preferenceGroup) // inject(Object handler, PreferenceActivity preferenceActivity)
xutils
文章图片
文章图片
public class ContentFragment extends BaseFragment {@ViewInject(R.id.vp_content) private ViewPager mViewPager; private ArrayList< BasePager> mPagers; @Override public View initView() { View view = View.inflate(mActivity, R.layout.fragment_content, null); ViewUtils.inject(this, view); // 注入view和事件 // mViewPager = (ViewPager) view.findViewById(R.id.vp_content); return view; }@Override public void initData() { // 初始化5个标签页面 mPagers = new ArrayList< BasePager> (); mPagers.add(new HomePager(mActivity)); mPagers.add(new NewsCenterPager(mActivity)); mPagers.add(new SmartServicePager(mActivity)); mPagers.add(new GovAffairsPager(mActivity)); mPagers.add(new SettingPager(mActivity)); mViewPager.setAdapter(new ContentAdapter()); }class ContentAdapter extends PagerAdapter {@Override public int getCount() { return mPagers.size(); }@Override public boolean isViewFromObject(View view, Object object) { return view == object; }@Override public Object instantiateItem(ViewGroup container, int position) { BasePager pager = mPagers.get(position); container.addView(pager.mRootView); // 将页面布局添加到容器中 pager.initData(); //初始化数据 return pager.mRootView; }@Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); }}}
ContentFragment
6、定义ViewPager页面
文章图片
文章图片
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > < include layout="@layout/title_bar" /> < FrameLayout android:id="@+id/fl_content" android:layout_width="match_parent" android:layout_height="match_parent" > < /FrameLayout> < /LinearLayout>
layout/base_pager.xml
文章图片
文章图片
< ?xml version="1.0" encoding="utf-8"?> < RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/title_red_bg" > < TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="标题" android:textColor="#fff" android:textSize="22sp" /> < ImageButton android:id="@+id/btn_menu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:background="@null" android:src="https://www.songbingjia.com/android/@drawable/img_menu" /> < /RelativeLayout>
layout/title_bar.xml
文章图片
文章图片
public abstract class BasePager {public Activity mActivity; public View mRootView; public TextView tvTitle; public ImageButton btnMenu; public FrameLayout flContent; public BasePager(Activity activity) { mActivity = activity; initView(); }/** * 初始化布局 */ public void initView() { mRootView = View.inflate(mActivity, R.layout.base_pager, null); tvTitle = (TextView) mRootView.findViewById(R.id.tv_title); btnMenu = (ImageButton) mRootView.findViewById(R.id.btn_menu); flContent = (FrameLayout) mRootView.findViewById(R.id.fl_content); }/** * 初始化数据 */ public abstract void initData(); }
BasePager
文章图片
文章图片
public class NewsCenterPager extends BasePager {public NewsCenterPager(Activity activity) { super(activity); }@Override public void initData() { tvTitle.setText("新闻"); TextView view = new TextView(mActivity); view.setText("新闻中心"); view.setTextColor(Color.RED); view.setTextSize(22); view.setGravity(Gravity.CENTER); flContent.addView(view); }}
NewsCenterPager
文章图片
文章图片
public class SettingPager extends BasePager {public SettingPager(Activity activity) { super(activity); }@Override public void initData() { tvTitle.setText("设置"); TextView view = new TextView(mActivity); view.setText("设置"); view.setTextColor(Color.RED); view.setTextSize(22); view.setGravity(Gravity.CENTER); flContent.addView(view); }}
SettingPager【android 项目学习随笔三(Fragment )】
推荐阅读
- Android EventBus事件总线剖析
- Android Studio Gradle:Resolvedependencies':app:_debugCompile' 问题解决纪录
- Android应用开发SharedPreferences存储数据的使用方法
- 学习Android之-----------------------AndroidManifest.xml
- Android重构与设计之路,从整理提示对话框弹窗开始
- android studio添加jar包及so文件问题
- Android笔记自定义View之制作表盘界面
- CSS如何使用grid属性(布局图解示例)
- 如何理解路由器中最长的前缀匹配(详细图解)