Android编程实现的简易路径导航条功能示例

 更新时间:2017年01月20日 11:18:32   作者:books1958  
这篇文章主要介绍了Android编程实现的简易路径导航条功能,结合实例形式分析了Android结合视图、布局及路径操作实现导航条功能的相关技巧,需要的朋友可以参考下

本文实例讲述了Android编程实现的简易路径导航条功能。分享给大家供大家参考,具体如下:

这里要实现的是如图所示的路径导航条, 类似于文件管理器的效果。

该导航条包含三个功能:

1. 支持追加任意个子路径(文字一行写不下时可左右滑动);
2. 支持返回到上一个路径;
3. 支持点击中间的某个路径回到指定位置。

代码很简单,已封装成自定义View, 如下:

PathTextView.Java

/**
 * 显示路径的View,支持返回上一级,支持点击某个位置回到指定层级。
 */
public class PathTextView extends LinearLayout {
  private TextView mTextView;
  private HorizontalScrollView hsView;
  private OnItemClickListener mListener;
  //保存每一个路径的id和名称
  private LinkedList<PathItem> pathItemList;
  //可点击部门文本颜色
  private static final int TEXT_COLOR = Color.parseColor("#48a0c7");
  //分隔符
  private static final String DIV_STR = " - ";
  public PathTextView(Context context) {
    super(context);
  }
  public PathTextView(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(new View.OnLongClickListener() {
      @Override
      public boolean onLongClick(View v) {
        return true;
      }
    });
    pathItemList = new LinkedList<>();
  }
  /**
   * 初始化根路径名称。
   */
  public void initRoot(String text) {
    mTextView.append(createSpannableString(-1, text));
    pathItemList.addLast(new PathItem(-1, text));
  }
  /**
   * 继续拼接一个路径。
   */
  public void append(long id, String text) {
    mTextView.append(DIV_STR);
    mTextView.append(createSpannableString(id, text));
    pathItemList.addLast(new PathItem(id, text));
    //HorizontalScrollView滑动到最右边
    hsView.postDelayed(new Runnable() {
      @Override
      public void run() {
        hsView.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
      }
    }, 100);
  }
  /**
   * 返回父级路径,一般用户点击“返回”时调用。
   */
  public void backParent() {
    int lastItemLength = pathItemList.removeLast().text.length();
    CharSequence oldCs = mTextView.getText();
    mTextView.setText(oldCs.subSequence(0, oldCs.length() - lastItemLength - DIV_STR.length()));
  }
  private SpannableString createSpannableString(long id, String text) {
    SpannableString spStr = new SpannableString(text);
    ClickableSpan clickSpan = new MyClickableSpan(id);
    spStr.setSpan(clickSpan, 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    spStr.setSpan(new ForegroundColorSpan(TEXT_COLOR), 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    return spStr;
  }
  private class MyClickableSpan extends ClickableSpan {
    private long id;
    MyClickableSpan(long id) {
      super();
      this.id = id;
    }
    @Override
    public void onClick(View widget) {
      //更新当前路径
      int backCount = 0;
      while (pathItemList.getLast().id != id) {
        backParent();
        backCount++;
      }
      //回调
      if (mListener != null && backCount > 0) {
        mListener.onClick(id, backCount);
      }
    }
  }
  private class PathItem {
    private long id;
    private String text;
    private PathItem(long id, String text) {
      this.id = id;
      this.text = text;
    }
  }
  public interface OnItemClickListener {
    /**
     * @param currentId 返回后目录的id.
     * @param backCount 返回层级的数量.
     */
    void onClick(long currentId, int backCount);
  }
  /**
   * 设置点击某个中间路径时的回调。
   */
  public void setOnItemClickListener(OnItemClickListener listener) {
    this.mListener = listener;
  }
}

布局文件,其实就是一个TextView:

simple_tv.xml

<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/path_hs"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="@color/light_gray2"
  android:scrollbars="none">
  <TextView
    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" />
</HorizontalScrollView>

使用方法也很简单:

1. 初始化时,调用 initRoot(String text) 方法,传入根路径名称;
2. 点击列表项进入下一级时,调用 append(long id, String text) 方法,传递当前项的id(用于唯一性区分)和名称;
3. 返回上一级时,调用 backParent() 方法;
4. 点击某个中间路径时, OnItemClickListener.onClick(long currentId, int backCount) 方法将会被回调,并返回点击项的id和返回的层级数量。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》、《Android资源操作技巧汇总》、《Android文件操作技巧汇总》、《Android开发入门与进阶教程》、《Android编程之activity操作技巧总结》及《Android控件用法总结

希望本文所述对大家Android程序设计有所帮助。

相关文章

  • Android入门之使用SimpleAdapter实现复杂界面布局

    Android入门之使用SimpleAdapter实现复杂界面布局

    这篇文章主要为大家详细介绍了Android如何使用SimpleAdapter实现复杂的界面布局,文中的示例代码讲解详细,对我们学习Android有一定的帮助,需要的可以参考一下
    2022-11-11
  • Android源码学习之工厂方法模式应用及优势介绍

    Android源码学习之工厂方法模式应用及优势介绍

    工厂方法模式定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类,感兴趣的朋友可以了解下哦
    2013-01-01
  • Android 实现锚点定位思路详解

    Android 实现锚点定位思路详解

    本篇文章就使用tablayout、scrollview来实现android锚点定位的功能。通过<a href="#head" rel="external nofollow" > 去设置页面内锚点定位跳转。具体实现思路大家跟随脚本之家小编一起通过本文看下吧
    2018-07-07
  • 从Cocos2d-x2迁移到Cocos2d-x3的过程分享

    从Cocos2d-x2迁移到Cocos2d-x3的过程分享

    Cocos2d-x 3.0发布没多久,我就迫不及待地将手头的一个习作尝试从2.2.2版本迁移到3.0rc0引擎上,本问介绍了迁移流程和遇到的问题,以及发现了针对Android平台的变动,需要的朋友可以参考下
    2014-04-04
  • Android给布局、控件加阴影效果的示例代码

    Android给布局、控件加阴影效果的示例代码

    本篇文章主要介绍了Android给布局、控件加阴影效果的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Android ListView之EfficientAdapte的使用详解

    Android ListView之EfficientAdapte的使用详解

    这篇文章主要介绍了Android ListView之EfficientAdapte的使用详解的相关资料,这里介绍EfficientAdapter 的使用方法,需要的朋友可以参考下
    2017-08-08
  • Android嵌套线性布局玩法坑解决方法

    Android嵌套线性布局玩法坑解决方法

    这篇文章主要为大家介绍了Android嵌套线性布局玩法坑解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Android中使用Post请求的方法

    Android中使用Post请求的方法

    这篇文章主要介绍了Android中使用Post请求的方法,实例分析了Android中使用post请求的原理与具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Android  图片的颜色处理实例代码

    Android 图片的颜色处理实例代码

    本文主要介绍Android 图片的颜色处理的知识,这里附上一个示例帮助大家学习理解这中实现方法,有需要的小伙伴可以参考下
    2016-09-09
  • 基于AnDroid FrameLayout的使用详解

    基于AnDroid FrameLayout的使用详解

    本篇文章是对AnDroid FrameLayout的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论