Android分割线divider(内含Android虚线分割线失效成实线解决方案)

简介: Android分割线divider(内含Android虚线分割线失效成实线解决方案)1,最简单最常见的Android分割线android:attr/listDivider。

Android分割线divider(内含Android虚线分割线失效成实线解决方案)


1,最简单最常见的Android分割线android:attr/listDivider。

最简单最常见的是把Android原生的Android ListView的分割线divider直接拿来作为背景衬托做成分割线divider的效果。比如代码:

    <View
        android:layout_width="match_parent"
        android:layout_height="10dip"
        android:background="?android:attr/listDivider" />

将这个View放置在不同view之间,比如一个垂直方向的线性布局子view之间。


2,直接将一个图片ImageView作为Android分割线divider。

和1中的类似,只是把View该写成ImageView,效果相同,注意高度和背景颜色,比如可以这样写代码:

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="10dip"
        android:background="@android:color/black" />
更复杂的写法可以在此ImageView的background中再次定制和改造。


3,在一个线性布局LinearLayoutCompat中直接设置分割线。

最新版本的LinearLayoutCompat支持在LinearLayoutCompat中配置分割线要素,我之前写过一篇文章介绍过,《Android Material Design :LinearLayoutCompat添加分割线divider》文章链接地址:http://blog.csdn.net/zhangphil/article/details/48899585


4,重点说一说Android虚线分割线divider。

通常为了做一个Android的虚线分割线divider,通用的方法和代码是:

(第一步)先在drawable目录下创建一个线line的shape文件,比如此dash_line.xml文件代码:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line" >
    
    <!--线宽为dashWith,线之间空隙dashGap,dashGap=0dp时,是实线 -->
    <stroke
        android:dashGap="15dip"
        android:dashWidth="30dip"
        android:width="1dip"
        android:color="@android:color/black" />
    
	<!-- 虚线高度 -->
    <size android:height="1dip" />  
    
</shape>

(第二步)然后在自己的布局文件中添加一个LinearLayout作为不同view的分割线,比如:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="csdn zhangphil" />

    <LinearLayout
        android:id="@+id/dashLine"
        android:layout_width="match_parent"
        android:layout_height="2dip"
        android:background="@drawable/dash_line"
        android:orientation="horizontal" />
   
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="csdn zhangphil" />

</LinearLayout>

这是目前网上一搜一大堆互相抄来抄去、实现Android虚线分割线divider的方法和代码(奇怪的是很多人在互相抄来抄去的时候也不检验有效性和时效性),这是很早以前也许有效的方法,遗憾的是,上述的方法和代码也许在Android 3.0以下是可以画出虚线的,但在Android 3.0以上最新Android SDK设备上,代码在真机上跑起来,根本画不出虚线,画出的而是一条实线!

究其根本原因,是因为在Android 3.0以上,Android系统在众多绘图操作时候默认开启了硬件加速,因此导致在最新的高版本Android系统上画dash gap line失效,这一问题在Android官方问题报告页面(https://code.google.com/p/android/issues/detail?id=29944)有问题报告反馈以及给出的各种五花八门的解决方案。总结起来,相对比较有效、且简单的解决方案主要有三个:

解决方案A:setLayerType(View.LAYER_TYPE_SOFTWARE, null)

保持如本案例中第一步和第二步的代码原封不动,只需要在Java代码中做一次判断:

LinearLayout dashLine=(LinearLayout) findViewById(R.id.dashLine);
		if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
			dashLine.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
		}
当Android在3.0及以上版本时候setLayerType(View.LAYER_TYPE_SOFTWARE, null);即可顺利画出虚线分割线。


解决方案B:android:layerType="software"

其实就是解决方案A的Java代码转移到xml中做配置,保持本案例中第一步代码原封不动,仅仅在第二步的代码中增加设置一个属性android:layerType="software" 改进成这样:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="csdn zhangphil" />

    <LinearLayout
        android:id="@+id/dashLine"
        android:layout_width="match_parent"
        android:layout_height="2dip"
        android:background="@drawable/dash_line"
        android:layerType="software"
        android:orientation="horizontal" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="csdn zhangphil" />

</LinearLayout>

解决方案C:修改AndroidManifest.xml中的application属性,设置:android:hardwareAccelerated="false"。

此解决方案其实就是告知Android系统关闭硬件加速,这样也可以顺利画出虚线分割线。但是这样关闭硬件加速的影响是全局的,将导致整体代码运行性能急剧降低,如果仅仅为了画一个虚线而关闭整个APP的硬件加速,实在是得不偿失,丢了大西瓜捡了个小芝麻,因此除非万不得已,我个人不建议采用解决方案C,我个人建议采取解决方案B。


5,ListView在代码运行时设置分割线divider。

通常会在一个布局中先写好、配置好ListView的样式如分割线,我以前写过文章专门介绍过:《Android基础小技术点:Android ListView设置背景图片及分割线、周边距 》文章链接:http://blog.csdn.net/zhangphil/article/details/48948217 。

不过,ListView的分割线也可以在Java代码运行时动态设置,设置代码,比如:

mListView.setDivider(getResources().getDrawable(android.R.drawable.arrow_down_float));


(备注:我写作这篇文章的时间是2015年10月11日。不排除也许在未来的Android版本迭代中,Android官方SDK调整画虚线分割线的代码,使得画虚线分割线更自然。)


相关文章
|
19天前
|
安全 搜索推荐 程序员
深入探索Android系统的碎片化问题及其解决方案
在移动操作系统的世界中,Android以其开放性和灵活性赢得了广泛的市场份额。然而,这种开放性也带来了一个众所周知的问题——系统碎片化。本文旨在探讨Android系统碎片化的现状、成因以及可能的解决方案,为开发者和用户提供一种全新的视角来理解这一现象。通过分析不同版本的Android系统分布、硬件多样性以及更新机制的影响,我们提出了一系列针对性的策略,旨在减少碎片化带来的影响,提升用户体验。
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
81 7
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
|
1月前
|
Android开发
Android开发显示头部Bar的需求解决方案--Android应用实战
Android开发显示头部Bar的需求解决方案--Android应用实战
21 0
|
3月前
|
前端开发 开发工具 Android开发
探索安卓与iOS应用开发:跨平台解决方案的崛起
【8月更文挑战第27天】在移动设备日益普及的今天,安卓和iOS系统占据了市场的主导地位。开发者们面临着一个重要问题:是选择专注于单一平台,还是寻找一种能够同时覆盖两大系统的解决方案?本文将探讨跨平台开发工具的优势,分析它们如何改变了移动应用的开发格局,并分享一些实用的开发技巧。无论你是新手还是资深开发者,这篇文章都将为你提供有价值的见解和建议。
|
3月前
|
Android开发
Android编译出现Warning: Mapping new ns to old ns的解决方案
Android编译出现Warning: Mapping new ns to old ns的解决方案
339 3
|
3月前
|
前端开发 JavaScript Android开发
探索Android和iOS开发中的跨平台解决方案
【8月更文挑战第1天】随着移动应用市场的不断扩张,开发者面临一个共同的挑战——如何高效地为多个平台创建和维护应用程序。本文将深入探讨跨平台开发工具,特别是Flutter和React Native,通过比较它们的优势和限制,并辅以实际代码示例,揭示这些工具如何帮助开发者在保持高性能的同时,实现代码的最大化重用。
|
3月前
|
前端开发 JavaScript Android开发
安卓与iOS开发中的跨平台解决方案
【8月更文挑战第24天】在移动应用开发领域,安卓和iOS两大平台占据了主导地位。然而,为这两个平台分别开发和维护应用会带来额外的时间和成本。本文将探讨跨平台开发的概念、优势以及流行的跨平台框架,如React Native和Flutter,并分析它们如何解决多平台开发的挑战。
|
6月前
|
Android开发
Android中Glide加载Https图片失败的解决方案
Android中Glide加载Https图片失败的解决方案
460 1
|
6月前
|
安全 编译器 API
Android HAL深入探索(5): 调试HAL报错与解决方案
Android HAL深入探索(5): 调试HAL报错与解决方案
1228 1