欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-20 20:24:16
本文实例讲述了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程序设计有所帮助。