最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Android编程实现的简易路径导航条功能示例
时间:2017-02-09 编辑:简简单单 来源:一聚教程网
这里要实现的是如图所示的路径导航条, 类似于文件管理器的效果。
该导航条包含三个功能:
1. 支持追加任意个子路径(文字一行写不下时可左右滑动);
2. 支持返回到上一个路径;
3. 支持点击中间的某个路径回到指定位置。
代码很简单,已封装成自定义View, 如下:
代码如下 | 复制代码 |
PathTextView.Java /** * 显示路径的View,支持返回上一级,支持点击某个位置回到指定层级。 */ publicclassPathTextViewextendsLinearLayout { privateTextView mTextView; privateHorizontalScrollView hsView; privateOnItemClickListener mListener; //保存每一个路径的id和名称 privateLinkedList //可点击部门文本颜色 privatestaticfinalintTEXT_COLOR = Color.parseColor("#48a0c7"); //分隔符 privatestaticfinalString DIV_STR =" - "; publicPathTextView(Context context) { super(context); } publicPathTextView(Context context, AttributeSet attrs) { super(context, attrs); View root = LayoutInflater.from(context).inflate(R.layout.simple_tv,this,true); hsView = (HorizontalScrollView) root.findViewById(R.id.path_hs); mTextView = (TextView) root.findViewById(R.id.path_tv); mTextView.setMovementMethod(LinkMovementMethod.getInstance()); mTextView.setOnLongClickListener(newView.OnLongClickListener() { @Override publicbooleanonLongClick(View v) { returntrue; } }); pathItemList =newLinkedList<>(); } /** * 初始化根路径名称。 */ publicvoidinitRoot(String text) { mTextView.append(createSpannableString(-1, text)); pathItemList.addLast(newPathItem(-1, text)); } /** * 继续拼接一个路径。 */ publicvoidappend(longid, String text) { mTextView.append(DIV_STR); mTextView.append(createSpannableString(id, text)); pathItemList.addLast(newPathItem(id, text)); //HorizontalScrollView滑动到最右边 hsView.postDelayed(newRunnable() { @Override publicvoidrun() { hsView.fullScroll(HorizontalScrollView.FOCUS_RIGHT); } },100); } /** * 返回父级路径,一般用户点击“返回”时调用。 */ publicvoidbackParent() { intlastItemLength = pathItemList.removeLast().text.length(); CharSequence oldCs = mTextView.getText(); mTextView.setText(oldCs.subSequence(0, oldCs.length() - lastItemLength - DIV_STR.length())); } privateSpannableString createSpannableString(longid, String text) { SpannableString spStr =newSpannableString(text); ClickableSpan clickSpan =newMyClickableSpan(id); spStr.setSpan(clickSpan,0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); spStr.setSpan(newForegroundColorSpan(TEXT_COLOR),0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); returnspStr; } privateclassMyClickableSpanextendsClickableSpan { privatelongid; MyClickableSpan(longid) { super(); this.id = id; } @Override publicvoidonClick(View widget) { //更新当前路径 intbackCount =0; while(pathItemList.getLast().id != id) { backParent(); backCount++; } //回调 if(mListener !=null&& backCount >0) { mListener.onClick(id, backCount); } } } privateclassPathItem { privatelongid; privateString text; privatePathItem(longid, String text) { this.id = id; this.text = text; } } publicinterfaceOnItemClickListener { /** * @param currentId 返回后目录的id. * @param backCount 返回层级的数量. */ voidonClick(longcurrentId,intbackCount); } /** * 设置点击某个中间路径时的回调。 */ publicvoidsetOnItemClickListener(OnItemClickListener listener) { this.mListener = listener; } } |
布局文件,其实就是一个TextView:
代码如下 | 复制代码 |
simple_tv.xml android:id="@+id/path_hs" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/light_gray2" android:scrollbars="none"> android:id="@+id/path_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/light_gray2" android:paddingBottom="12dp" android:paddingLeft="8dp" android:paddingRight="8dp" android:paddingTop="12dp" android:textSize="15sp"/> |
使用方法也很简单:
1. 初始化时,调用 initRoot(String text) 方法,传入根路径名称;
2. 点击列表项进入下一级时,调用 append(long id, String text) 方法,传递当前项的id(用于唯一性区分)和名称;
3. 返回上一级时,调用 backParent() 方法;
4. 点击某个中间路径时, OnItemClickListener.onClick(long currentId, int backCount) 方法将会被回调,并返回点击项的id和返回的层级数量。
相关文章
- sora软件价格介绍 02-22
- sora官网入口地址一览 02-22
- Sora生成的视频使用教程 02-22
- 《梦幻西游》元宵灯谜线索答案大全2024 02-22
- 《原神》有朋自远方来第一天通关攻略 02-22
- 《苏醒之路》四个结局达成攻略 02-22