Android編程實(shí)現(xiàn)的簡(jiǎn)易路徑導(dǎo)航條功能示例
本文實(shí)例講述了Android編程實(shí)現(xiàn)的簡(jiǎn)易路徑導(dǎo)航條功能。分享給大家供大家參考,具體如下:
這里要實(shí)現(xiàn)的是如圖所示的路徑導(dǎo)航條, 類似于文件管理器的效果。

該導(dǎo)航條包含三個(gè)功能:
1. 支持追加任意個(gè)子路徑(文字一行寫不下時(shí)可左右滑動(dòng));
2. 支持返回到上一個(gè)路徑;
3. 支持點(diǎn)擊中間的某個(gè)路徑回到指定位置。
代碼很簡(jiǎn)單,已封裝成自定義View, 如下:
PathTextView.Java
/**
* 顯示路徑的View,支持返回上一級(jí),支持點(diǎn)擊某個(gè)位置回到指定層級(jí)。
*/
public class PathTextView extends LinearLayout {
private TextView mTextView;
private HorizontalScrollView hsView;
private OnItemClickListener mListener;
//保存每一個(gè)路徑的id和名稱
private LinkedList<PathItem> pathItemList;
//可點(diǎn)擊部門文本顏色
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));
}
/**
* 繼續(xù)拼接一個(gè)路徑。
*/
public void append(long id, String text) {
mTextView.append(DIV_STR);
mTextView.append(createSpannableString(id, text));
pathItemList.addLast(new PathItem(id, text));
//HorizontalScrollView滑動(dòng)到最右邊
hsView.postDelayed(new Runnable() {
@Override
public void run() {
hsView.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
}
}, 100);
}
/**
* 返回父級(jí)路徑,一般用戶點(diǎn)擊“返回”時(shí)調(diào)用。
*/
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) {
//更新當(dāng)前路徑
int backCount = 0;
while (pathItemList.getLast().id != id) {
backParent();
backCount++;
}
//回調(diào)
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 返回層級(jí)的數(shù)量.
*/
void onClick(long currentId, int backCount);
}
/**
* 設(shè)置點(diǎn)擊某個(gè)中間路徑時(shí)的回調(diào)。
*/
public void setOnItemClickListener(OnItemClickListener listener) {
this.mListener = listener;
}
}
布局文件,其實(shí)就是一個(gè)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>
使用方法也很簡(jiǎn)單:
1. 初始化時(shí),調(diào)用 initRoot(String text) 方法,傳入根路徑名稱;
2. 點(diǎn)擊列表項(xiàng)進(jìn)入下一級(jí)時(shí),調(diào)用 append(long id, String text) 方法,傳遞當(dāng)前項(xiàng)的id(用于唯一性區(qū)分)和名稱;
3. 返回上一級(jí)時(shí),調(diào)用 backParent() 方法;
4. 點(diǎn)擊某個(gè)中間路徑時(shí), OnItemClickListener.onClick(long currentId, int backCount) 方法將會(huì)被回調(diào),并返回點(diǎn)擊項(xiàng)的id和返回的層級(jí)數(shù)量。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》、《Android資源操作技巧匯總》、《Android文件操作技巧匯總》、《Android開(kāi)發(fā)入門與進(jìn)階教程》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android實(shí)現(xiàn)固定屏幕顯示的方法
- Android側(cè)滑導(dǎo)航欄的實(shí)例代碼
- Android編程使用自定義View實(shí)現(xiàn)水波進(jìn)度效果示例
- Android編程實(shí)現(xiàn)點(diǎn)擊鏈接打開(kāi)APP功能示例
- Android編程使用android-support-design實(shí)現(xiàn)MD風(fēng)格對(duì)話框功能示例
- Android編程實(shí)現(xiàn)ActionBar的home圖標(biāo)動(dòng)畫切換效果
- Android 屏幕切換監(jiān)聽(tīng)的實(shí)例代碼
- Android SQLite數(shù)據(jù)庫(kù)中的表詳解
- Android實(shí)現(xiàn)第三方登錄的上拉展開(kāi),下拉隱藏,下拉隱藏示例
- 詳解Android應(yīng)用開(kāi)發(fā)--MP3音樂(lè)播放器代碼實(shí)現(xiàn)(一)
- Android6.0 固定屏幕功能實(shí)現(xiàn)方法及實(shí)例
相關(guān)文章
Flutter 利用CustomScrollView實(shí)現(xiàn)滑動(dòng)效果
我們可以使用ListView將幾個(gè)GridView組合在一起實(shí)現(xiàn)了不同可滑動(dòng)組件的粘合,但是這里必須要設(shè)置禁止 GridView 的滑動(dòng),防止多個(gè)滑動(dòng)組件的沖突。這種方式寫起來(lái)不太方便,事實(shí)上 Flutter 提供了 CustomScrollView 來(lái)粘合多個(gè)滑動(dòng)組件,并且可以實(shí)現(xiàn)更有趣的滑動(dòng)效果。2021-06-06
android原生實(shí)現(xiàn)多線程斷點(diǎn)續(xù)傳功能
這篇文章主要為大家詳細(xì)介紹了android原生實(shí)現(xiàn)多線程斷點(diǎn)續(xù)傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Android中二維碼的掃描和生成(使用zxing庫(kù))
ZXing是一個(gè)開(kāi)放源碼的,用Java實(shí)現(xiàn)的多種格式的1D/2D條碼圖像處理庫(kù),它包含了聯(lián)系到其他語(yǔ)言的端口,下面這篇文章主要給大家介紹了關(guān)于Android中二維碼掃描和生成的相關(guān)資料,主要使用的zxing庫(kù),需要的朋友可以參考下2022-09-09
Android使用URLConnection提交請(qǐng)求的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android使用URLConnection提交請(qǐng)求的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Kotlin基本類型自動(dòng)裝箱一點(diǎn)問(wèn)題剖析
這篇文章主要剖析了Kotlin基本類型自動(dòng)裝箱的一點(diǎn)問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android實(shí)現(xiàn)桌面快捷方式實(shí)例代碼
大家好,本篇文章主要講的是Android實(shí)現(xiàn)桌面快捷方式實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
解決Eclipse啟動(dòng)出錯(cuò):Failed to create the Java Virtual Machine
這篇文章主要介紹了解決Eclipse啟動(dòng)出錯(cuò):Failed to create the Java Virtual Machine的相關(guān)資料,這里說(shuō)明出錯(cuò)原因及查找錯(cuò)誤和解決辦法,需要的朋友可以參考下2017-07-07
Android中的Shape和Selector的結(jié)合使用實(shí)例
這篇文章主要介紹了Android中的Shape和Selector的結(jié)合使用實(shí)例,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-06-06

