Android —— 面包屑控件(BreadcrumbTreeView)
来源:互联网 发布:剑三脸型数据怎么用 编辑:程序博客网 时间:2024/06/05 11:30
面包屑控件常用在导航中,由于项目中有涉及,又参考大神的介绍,将栗子进行了一番解剖。
参考博文
效果:
功能:
1)点击相应层标题,跳转到相应层级界面。
2)点击列表跳转层级,相应的面包屑控件进行同步显示。
各类介绍
- CrumbView控件:
public class CrumbView extends HorizontalScrollView { private int LIGHT_COLOR, DARK_COLOR; private Resources mRes; private LinearLayout mContainer; private FragmentManager mFragmentManager; public CrumbView(Context context, AttributeSet attrs) { super(context, attrs); mRes = context.getResources(); TypedArray typedArray = mRes.obtainAttributes(attrs, R.styleable.CrumbViewAttrs); try{ LIGHT_COLOR = typedArray.getColor(R.styleable.CrumbViewAttrs_light_color, mRes.getColor(R.color.light_color)); DARK_COLOR = typedArray.getColor(R.styleable.CrumbViewAttrs_dark_color, mRes.getColor(R.color.dark_color)); }finally { typedArray.recycle(); } initView(context); } private void initView(Context context) { mContainer = new LinearLayout(context); mContainer.setOrientation(LinearLayout.HORIZONTAL); mContainer.setPadding(mRes.getDimensionPixelOffset(R.dimen.crumb_view_padding), 0, mRes.getDimensionPixelOffset(R.dimen.crumb_view_padding), 0); mContainer.setGravity(Gravity.CENTER_VERTICAL); addView(mContainer); } public void setActivity(FragmentActivity activity){ mFragmentManager = activity.getSupportFragmentManager(); mFragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { updateCrumbs(); } }); updateCrumbs(); } private void updateCrumbs() { // 嵌套的fragment数量 int numFrags = mFragmentManager.getBackStackEntryCount(); // 面包屑的数量 int numCrumbs = mContainer.getChildCount(); for(int i = 0; i < numFrags; i++){ final FragmentManager.BackStackEntry backStackEntry = mFragmentManager.getBackStackEntryAt(i); if(i < numCrumbs){ View view = mContainer.getChildAt(i); Object tag = view.getTag(); if(tag != backStackEntry){ for(int j = i; j < numCrumbs; j++){ mContainer.removeViewAt(i); } numCrumbs = i; } } if(i >= numCrumbs){ View itemView = LayoutInflater.from(getContext()).inflate(R.layout.crumb_item_layout, null); TextView tv = (TextView) itemView.findViewById(R.id.crumb_name); tv.setText(backStackEntry.getBreadCrumbTitle()); itemView.setTag(backStackEntry); itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { FragmentManager.BackStackEntry bse; if (v.getTag() instanceof FragmentManager.BackStackEntry) { bse = (FragmentManager.BackStackEntry) v.getTag(); mFragmentManager.popBackStack(bse.getId(), 0); } else { //全部回退 int count = mFragmentManager.getBackStackEntryCount(); if (count > 0) { bse = mFragmentManager.getBackStackEntryAt(0); mFragmentManager.popBackStack(bse.getId(), 0); } } } }); mContainer.addView(itemView); } } numCrumbs = mContainer.getChildCount(); while(numCrumbs > numFrags){ mContainer.removeViewAt(numCrumbs - 1); numCrumbs--; } //调整可见性 for (int i = 0; i < numCrumbs; i++) { final View child = mContainer.getChildAt(i); // 高亮 highLightIndex(child, !(i < numCrumbs - 1)); } // 滑动到最后一个 post(new Runnable() { @Override public void run() { fullScroll(ScrollView.FOCUS_RIGHT); } }); } public void highLightIndex(View view, boolean highLight) { TextView text = (TextView) view.findViewById(R.id.crumb_name); ImageView image = (ImageView) view.findViewById(R.id.crumb_icon); if (highLight) { text.setTextColor(LIGHT_COLOR); image.setVisibility(View.GONE); } else { text.setTextColor(DARK_COLOR); image.setVisibility(View.VISIBLE); } }}
1.自定义的CrumbView,它需要继承HorizontalScrollView以拥有可以左右滚动的效果,同时要实现FragmentManager的OnBackStackChangedListener接口,这样当fragment栈发生变化时,CrumbView就能收到通知并更新导航栏文字。
2.重要方法介绍:
首先有这样四个基础的方法:
1)highLightIndex(View view, boolean highLight):通过传入层级标题的view,设置是否高亮显示,这个方法在update View的时候进行设置。
2)initView(Context context):初始化view,在构造器中调用,初始化存放面包屑的mContainer。
3)setActivity(FragmentActivity activity):提供给外部的方法,用于初始时,设置第一个显示的FragmentActivity,并在其中设置监听OnBackStackChangedListener。
4)updateCrumbs():刷新面包屑控件视图。
MyFragment:自定义的fragment
继承自ListFragment,重写其方法onListItemClick(ListView l, View v, int position, long id),设置点击list行的设置面包屑title,将新创建的fragment放栈,MainActivity中的使用:
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CrumbView crumbView = (CrumbView) findViewById(R.id.crumb_view); crumbView.setActivity(this); int firstLevel = 1; FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setBreadCrumbTitle(getString(R.string.crumb_title, firstLevel)); ft.replace(R.id.frag_container, MyFragment.getInstance(firstLevel)); ft.addToBackStack(null); ft.commitAllowingStateLoss(); }}
1.获得面包屑控件,并设置初始的fragment。
2.通过String中设置变化的标题
<string name="crumb_title">第%1$d层</string> <string name="list_item_txt">第%1$d层第%2$d行</string>
效果展示:
- Android —— 面包屑控件(BreadcrumbTreeView)
- Bootstrap—面包屑导航breadcrumb
- 关于ASP.NET中面包屑(SiteMapPath控件)使用
- Bootstrap - 面包屑(breadcrumbs)
- android面包屑导航栏的实现
- Bootstrap基础9——导航条navbar,面包屑breadcrumb,分页pagination
- 与您分享来自zoomla!逐浪CMS的Web导航设计—面包屑的由来
- Dedecms当前位置(面包屑导航)的处理
- laravel面包屑导航(2)模块化开发
- 自定义组件-BreadcrumbTreeView 的使用
- 自定义组件-BreadcrumbTreeView 的使用
- Android自定义控件(一)——开关控件
- Android—常用控件(一)文本控件
- Android—常用控件(四)日期/时间控件
- android控件—MuAutoCompleteTextView
- Android控件—RecyclerView
- Android—(WebView控件)
- ASP.NET的面包屑导航控件、树形导航控件、菜单控件
- iOS IO在线预览APP的介绍
- 不可描述
- javah 找不到类文件的解决办法
- 水题-NYOJ22素数求和问题
- 前端架构总结
- Android —— 面包屑控件(BreadcrumbTreeView)
- Linux面试题目(一)
- Android 5.0文件管理操作公开
- Web前端面试指导(六):面试后需要总结和交流
- 利用编码实现界面
- jQuery 一些简单常用方法
- Caffe学习笔记(七)—— solver参数说明及利用自己的数据集对权值微调
- IntentFilter
- valgrind详解,安装,使用,示例