1、 精确获取屏幕尺寸(例如:3.5、4.0、5.0寸屏幕)
1
2
3
4
5
6
|
public
static
double
getScreenPhysicalSize
(
Activity
ctx
)
{
DisplayMetrics
dm
=
new
DisplayMetrics
(
)
;
ctx
.
getWindowManager
(
)
.
getDefaultDisplay
(
)
.
getMetrics
(
dm
)
;
double
diagonalPixels
=
Math
.
sqrt
(
Math
.
pow
(
dm
.
widthPixels
,
2
)
+
Math
.
pow
(
dm
.
heightPixels
,
2
)
)
;
return
diagonalPixels
/
(
160
*
dm
.
density
)
;
}
|
2、 判断是否是平板(官方用法)
1
2
3
|
public
static
boolean
isTablet
(
Context
context
)
{
return
(
context
.
getResources
(
)
.
getConfiguration
(
)
.
screenLayout
&
Configuration
.
SCREENLAYOUT_SIZE_MASK
)
>=
Configuration
.
SCREENLAYOUT_SIZE_LARGE
;
}
|
3、 文字根据状态更改颜色 android:textColor
1
2
3
4
5
6
|
<
selector
xmlns
:
android
=
"http://schemas.android.com/apk/res/android"
>
<
item
android
:
color
=
"#53c1bd"
android
:
state_selected
=
"true"
/
>
<
item
android
:
color
=
"#53c1bd"
android
:
state_focused
=
"true"
/
>
<
item
android
:
color
=
"#53c1bd"
android
:
state_pressed
=
"true"
/
>
<
item
android
:
color
=
"#777777"
/
>
<
/
selector
>
|
放在res/color/目录下
4、背景色根据状态更改颜色 android:backgroup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<
selector
xmlns
:
android
=
"http://schemas.android.com/apk/res/android"
>
<
item
android
:
state_selected
=
"true"
>
<
shape
>
<
gradient
android
:
angle
=
"0"
android
:
centerColor
=
"#00a59f"
android
:
endColor
=
"#00a59f"
android
:
startColor
=
"#00a59f"
/
>
<
/
shape
>
<
/
item
>
<
item
android
:
state_focused
=
"true"
>
<
shape
>
<
gradient
android
:
angle
=
"0"
android
:
centerColor
=
"#00a59f"
android
:
endColor
=
"#00a59f"
android
:
startColor
=
"#00a59f"
/
>
<
/
shape
>
<
/
item
>
<
item
android
:
state_pressed
=
"true"
>
<
shape
>
<
gradient
android
:
angle
=
"0"
android
:
centerColor
=
"#00a59f"
android
:
endColor
=
"#00a59f"
android
:
startColor
=
"#00a59f"
/
>
<
/
shape
>
<
/
item
>
<
item
>
<
shape
>
<
gradient
android
:
angle
=
"0"
android
:
centerColor
=
"#00ff00"
android
:
endColor
=
"00ff00"
android
:
startColor
=
"00ff00"
/
>
<
/
shape
>
<
/
item
>
<
/
selector
>
|
如果直接给背景色color会报错。
5、 启动APK的默认Activity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
static
void
startApkActivity
(
final
Context
ctx
,
String
packageName
)
{
PackageManager
pm
=
ctx
.
getPackageManager
(
)
;
PackageInfo
pi
;
try
{
pi
=
pm
.
getPackageInfo
(
packageName
,
0
)
;
Intent
intent
=
new
Intent
(
Intent
.
ACTION_MAIN
,
null
)
;
intent
.
addCategory
(
Intent
.
CATEGORY_LAUNCHER
)
;
intent
.
setPackage
(
pi
.
packageName
)
;
List
<
ResolveInfo
>
apps
=
pm
.
queryIntentActivities
(
intent
,
0
)
;
ResolveInfo
ri
=
apps
.
iterator
(
)
.
next
(
)
;
if
(
ri
!=
null
)
{
String
className
=
ri
.
activityInfo
.
name
;
intent
.
setComponent
(
new
ComponentName
(
packageName
,
className
)
)
;
ctx
.
startActivity
(
intent
)
;
}
}
catch
(
NameNotFoundException
e
)
{
Log
.
e
(
"startActivity"
,
e
)
;
}
}
|
6、计算字宽
1
2
3
4
5
|
public
static
float
GetTextWidth
(
String
text
,
float
Size
)
{
TextPaint
FontPaint
=
new
TextPaint
(
)
;
FontPaint
.
setTextSize
(
Size
)
;
return
FontPaint
.
measureText
(
text
)
;
}
|
注意如果设置了textStyle,还需要进一步设置TextPaint。
7、获取应用程序下所有Activity
1
2
3
4
5
6
7
8
9
|
public
static
ArrayList
<
String
>
getActivities
(
Context
ctx
)
{
ArrayList
<
String
>
result
=
new
ArrayList
<
String
>
(
)
;
Intent
intent
=
new
Intent
(
Intent
.
ACTION_MAIN
,
null
)
;
intent
.
setPackage
(
ctx
.
getPackageName
(
)
)
;
for
(
ResolveInfo
info
:
ctx
.
getPackageManager
(
)
.
queryIntentActivities
(
intent
,
0
)
)
{
result
.
add
(
info
.
activityInfo
.
name
)
;
}
return
result
;
}
|
8、检测字符串中是否包含汉字
1
2
3
4
5
6
7
8
|
public
static
boolean
checkChinese
(
String
sequence
)
{
final
String
format
=
"[\\u4E00-\\u9FA5\\uF900-\\uFA2D]"
;
boolean
result
=
false
;
Pattern
pattern
=
Pattern
.
compile
(
format
)
;
Matcher
matcher
=
pattern
.
matcher
(
sequence
)
;
result
=
matcher
.
find
(
)
;
return
result
;
}
|
9、检测字符串中只能包含:中文、数字、下划线(_)、横线(-)
1
2
3
4
5
6
|
public
static
boolean
checkNickname
(
String
sequence
)
{
final
String
format
=
"[^\\u4E00-\\u9FA5\\uF900-\\uFA2D\\w-_]"
;
Pattern
pattern
=
Pattern
.
compile
(
format
)
;
Matcher
matcher
=
pattern
.
matcher
(
sequence
)
;
return
!
matcher
.
find
(
)
;
}
|
10、检查有没有应用程序来接受处理你发出的intent
1
2
3
4
5
6
|
public
static
boolean
isIntentAvailable
(
Context
context
,
String
action
)
{
final
PackageManager
packageManager
=
context
.
getPackageManager
(
)
;
final
Intent
intent
=
new
Intent
(
action
)
;
List
<
ResolveInfo
>
list
=
packageManager
.
queryIntentActivities
(
intent
,
PackageManager
.
MATCH_DEFAULT_ONLY
)
;
return
list
.
size
(
)
;
}
|
11、使用TransitionDrawable实现图片显示的时候有渐变效果
1
2
3
4
5
6
7
8
|
private
void
setImageBitmap
(
ImageView
imageView
,
Bitmap
bitmap
)
{
// Use TransitionDrawable to fade in.
final
TransitionDrawable
td
=
new
TransitionDrawable
(
new
Drawable
[
]
{
new
ColorDrawable
(
android
.
R
.
color
.
transparent
)
,
new
BitmapDrawable
(
mContext
.
getResources
(
)
,
bitmap
)
}
)
;
//noinspection deprecation
imageView
.
setBackgroundDrawable
(
imageView
.
getDrawable
(
)
)
;
imageView
.
setImageDrawable
(
td
)
;
td
.
startTransition
(
200
)
;
}
|
比使用AlphaAnimation效果要好,可避免出现闪烁问题。
12、 扫描指定的文件
1
|
sendBroadcast
(
new
Intent
(
Intent
.
ACTION_MEDIA_SCANNER_SCAN_FILE
,
uri
)
)
;
|
用途:从本软件新增、修改、删除图片、文件某一个文件(音频、视频)需要更新系统媒体库时使用,不必扫描整个SD卡。
13、Dip转px
1
2
3
|
public
static
int
dipToPX
(
final
Context
ctx
,
float
dip
)
{
return
(
int
)
TypedValue
.
applyDimension
(
TypedValue
.
COMPLEX_UNIT_DIP
,
dip
,
ctx
.
getResources
(
)
.
getDisplayMetrics
(
)
)
;
}
|
用途:难免在Activity代码中设置位置、大小等,本方法就很有用了!
14、获取已经安装APK(列表)的路径
1
2
3
4
|
PackageManager
pm
=
getPackageManager
(
)
;
for
(
ApplicationInfo
app
:
pm
.
getInstalledApplications
(
0
)
)
{
Log
.
d
(
"PackageList"
,
"package: "
+
app
.
packageName
+
", sourceDir: "
+
app
.
sourceDir
)
;
}
|
输出:
1
2
|
package
:
com
.
tmobile
.
thememanager
,
sourceDir
:
/
system
/
app
/
ThemeManager
.
apk
package
:
com
.
touchtype
.
swiftkey
,
sourceDir
:
/
data
/
app
/
com
.
touchtype
.
swiftkey
-
1.apk
|
15、 多进程Preferences数据共享
1
2
3
4
5
6
7
8
9
10
|
public
static
void
putStringProcess
(
Context
ctx
,
String
key
,
String
value
)
{
SharedPreferences
sharedPreferences
=
ctx
.
getSharedPreferences
(
"preference_mu"
,
Context
.
MODE_MULTI_PROCESS
)
;
Editor
editor
=
sharedPreferences
.
edit
(
)
;
editor
.
putString
(
key
,
value
)
;
editor
.
commit
(
)
;
}
public
static
String
getStringProcess
(
Context
ctx
,
String
key
,
String
defValue
)
{
SharedPreferences
sharedPreferences
=
ctx
.
getSharedPreferences
(
"preference_mu"
,
Context
.
MODE_MULTI_PROCESS
)
;
return
sharedPreferences
.
getString
(
key
,
defValue
)
;
}
|
16、泛型ArrayList转数组
1
2
3
4
5
6
7
|
@
SuppressWarnings
(
"unchecked"
)
public
static
<
T
>
T
[
]
toArray
(
Class
<
?
>
cls
,
ArrayList
<
T
>
items
)
{
if
(
items
==
null
||
items
.
size
(
)
==
0
)
{
return
(
T
[
]
)
Array
.
newInstance
(
cls
,
0
)
;
}
return
items
.
toArray
(
(
T
[
]
)
Array
.
newInstance
(
cls
,
items
.
size
(
)
)
)
;
}
|
17、 保存恢复ListView当前位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
private
void
saveCurrentPosition
(
)
{
if
(
mListView
!=
null
)
{
int
position
=
mListView
.
getFirstVisiblePosition
(
)
;
View
v
=
mListView
.
getChildAt
(
0
)
;
int
top
=
(
v
==
null
)
?
0
:
v
.
getTop
(
)
;
//保存position和top
}
}
private
void
restorePosition
(
)
{
if
(
mFolder
!=
null
&&
mListView
!=
null
)
{
int
position
=
0
;
//取出保存的数据
int
top
=
0
;
//取出保存的数据
mListView
.
setSelectionFromTop
(
position
,
top
)
;
}
}
|
18、调用 便携式热点和数据共享 设置
1
2
3
4
5
6
7
|
public
static
Intent
getHotspotSetting
(
)
{
Intent
intent
=
new
Intent
(
)
;
intent
.
setAction
(
Intent
.
ACTION_MAIN
)
;
ComponentName
com
=
new
ComponentName
(
"com.android.settings"
,
"com.android.settings.TetherSettings"
)
;
intent
.
setComponent
(
com
)
;
return
intent
;
}
|
19、 格式化输出IP地址
1
2
3
4
5
|
public
static
String
getIp
(
Context
ctx
)
{
return
Formatter
.
formatIpAddress
(
(
WifiManager
)
ctx
.
getSystemService
(
Context
.
WIFI_SERVICE
)
.
getConnectionInfo
(
)
.
getIpAddress
(
)
)
;
}
|
20、 ip地址转成8位十六进制串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
/** ip转16进制 */
public
static
String
ipToHex
(
String
ips
)
{
StringBuffer
result
=
new
StringBuffer
(
)
;
if
(
ips
!=
null
)
{
StringTokenizer
st
=
new
StringTokenizer
(
ips
,
"."
)
;
while
(
st
.
hasMoreTokens
(
)
)
{
String
token
=
Integer
.
toHexString
(
Integer
.
parseInt
(
st
.
nextToken
(
)
)
)
;
if
(
token
.
length
(
)
==
1
)
token
=
"0"
+
token
;
result
.
append
(
token
)
;
}
}
return
result
.
toString
(
)
;
}
/** 16进制转ip */
public
static
String
texToIp
(
String
ips
)
{
try
{
StringBuffer
result
=
new
StringBuffer
(
)
;
if
(
ips
!=
null
&&
ips
.
length
(
)
==
8
)
{
for
(
int
i
=
0
;
i
<
8
;
i
+=
2
)
{
if
(
i
!=
0
)
result
.
append
(
'.'
)
;
result
.
append
(
Integer
.
parseInt
(
ips
.
substring
(
i
,
i
+
2
)
,
16
)
)
;
}
}
return
result
.
toString
(
)
;
}
catch
(
NumberFormatException
ex
)
{
Logger
.
e
(
ex
)
;
}
return
""
;
}
ip
:
192.168.68.128
16
=
>
hex
:
c0a84480
|
21、 文件夹排序(先文件夹排序,后文件排序)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public
static
void
sortFiles
(
File
[
]
files
)
{
Arrays
.
sort
(
files
,
new
Comparator
<
File
>
(
)
{
@
Override
public
int
compare
(
File
lhs
,
File
rhs
)
{
//返回负数表示o1 小于o2,返回0 表示o1和o2相等,返回正数表示o1大于o2。
boolean
l1
=
lhs
.
isDirectory
(
)
;
boolean
l2
=
rhs
.
isDirectory
(
)
;
if
(
l1
&&
!
l2
)
return
-
1
;
else
if
(
!
l1
&&
l2
)
return
1
;
else
{
return
lhs
.
getName
(
)
.
compareTo
(
rhs
.
getName
(
)
)
;
}
}
}
)
;
}
|
22、代码设置TextView的样式
使用过自定义Dialog可能马上会想到用如下代码:
1
|
new
TextView
(
this
,
null
,
R
.
style
.
text_style
)
;
|
但你运行这代码你会发现毫无作用!正确用法:
1
|
new
TextView
(
new
ContextThemeWrapper
(
this
,
R
.
style
.
text_style
)
)
|
23、获取网络类型名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
public
static
String
getNetworkTypeName
(
Context
context
)
{
if
(
context
!=
null
)
{
ConnectivityManager
connectMgr
=
(
ConnectivityManager
)
context
.
getSystemService
(
Context
.
CONNECTIVITY_SERVICE
)
;
if
(
connectMgr
!=
null
)
{
NetworkInfo
info
=
connectMgr
.
getActiveNetworkInfo
(
)
;
if
(
info
!=
null
)
{
switch
(
info
.
getType
(
)
)
{
case
ConnectivityManager
.
TYPE_WIFI
:
return
"WIFI"
;
case
ConnectivityManager
.
TYPE_MOBILE
:
return
getNetworkTypeName
(
info
.
getSubtype
(
)
)
;
}
}
}
}
return
getNetworkTypeName
(
TelephonyManager
.
NETWORK_TYPE_UNKNOWN
)
;
}
public
static
String
getNetworkTypeName
(
int
type
)
{
switch
(
type
)
{
case
TelephonyManager
.
NETWORK_TYPE_GPRS
:
return
"GPRS"
;
case
TelephonyManager
.
NETWORK_TYPE_EDGE
:
return
"EDGE"
;
case
TelephonyManager
.
NETWORK_TYPE_UMTS
:
return
"UMTS"
;
case
TelephonyManager
.
NETWORK_TYPE_HSDPA
:
return
"HSDPA"
;
case
TelephonyManager
.
NETWORK_TYPE_HSUPA
:
return
"HSUPA"
;
case
TelephonyManager
.
NETWORK_TYPE_HSPA
:
return
"HSPA"
;
case
TelephonyManager
.
NETWORK_TYPE_CDMA
:
return
"CDMA"
;
case
TelephonyManager
.
NETWORK_TYPE_EVDO_0
:
return
"CDMA - EvDo rev. 0"
;
case
TelephonyManager
.
NETWORK_TYPE_EVDO_A
:
return
"CDMA - EvDo rev. A"
;
case
TelephonyManager
.
NETWORK_TYPE_EVDO_B
:
return
"CDMA - EvDo rev. B"
;
case
TelephonyManager
.
NETWORK_TYPE_1xRTT
:
return
"CDMA - 1xRTT"
;
case
TelephonyManager
.
NETWORK_TYPE_LTE
:
return
"LTE"
;
case
TelephonyManager
.
NETWORK_TYPE_EHRPD
:
return
"CDMA - eHRPD"
;
case
TelephonyManager
.
NETWORK_TYPE_IDEN
:
return
"iDEN"
;
case
TelephonyManager
.
NETWORK_TYPE_HSPAP
:
return
"HSPA+"
;
default
:
return
"UNKNOWN"
;
}
}
|
24、Android解压Zip包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
/**
* 解压一个压缩文档 到指定位置
*
* @param zipFileString 压缩包的名字
* @param outPathString 指定的路径
* @throws Exception
*/
public
static
void
UnZipFolder
(
String
zipFileString
,
String
outPathString
)
throws
Exception
{
java
.
util
.
zip
.
ZipInputStream
inZip
=
new
java
.
util
.
zip
.
ZipInputStream
(
new
java
.
io
.
FileInputStream
(
zipFileString
)
)
;
java
.
util
.
zip
.
ZipEntry
zipEntry
;
String
szName
=
""
;
while
(
(
zipEntry
=
inZip
.
getNextEntry
(
)
)
!=
null
)
{
szName
=
zipEntry
.
getName
(
)
;
if
(
zipEntry
.
isDirectory
(
)
)
{
// get the folder name of the widget
szName
=
szName
.
substring
(
0
,
szName
.
length
(
)
-
1
)
;
java
.
io
.
File
folder
=
new
java
.
io
.
File
(
outPathString
+
java
.
io
.
File
.
separator
+
szName
)
;
folder
.
mkdirs
(
)
;
}
else
{
java
.
io
.
File
file
=
new
java
.
io
.
File
(
outPathString
+
java
.
io
.
File
.
separator
+
szName
)
;
file
.
createNewFile
(
)
;
// get the output stream of the file
java
.
io
.
FileOutputStream
out
=
new
java
.
io
.
FileOutputStream
(
file
)
;
int
len
;
byte
[
]
buffer
=
new
byte
[
1024
]
;
// read (len) bytes into buffer
while
(
(
len
=
inZip
.
read
(
buffer
)
)
!=
-
1
)
{
// write (len) byte from buffer at the position 0
out
.
write
(
buffer
,
0
,
len
)
;
out
.
flush
(
)
;
}
out
.
close
(
)
;
}
}
//end of while
inZip
.
close
(
)
;
}
//end of func
|
25、 从assets中读取文本和图片资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
/** 从assets 文件夹中读取文本数据 */
public
static
String
getTextFromAssets
(
final
Context
context
,
String
fileName
)
{
String
result
=
""
;
try
{
InputStream
in
=
context
.
getResources
(
)
.
getAssets
(
)
.
open
(
fileName
)
;
// 获取文件的字节数
int
lenght
=
in
.
available
(
)
;
// 创建byte数组
byte
[
]
buffer
=
new
byte
[
lenght
]
;
// 将文件中的数据读到byte数组中
in
.
read
(
buffer
)
;
result
=
EncodingUtils
.
getString
(
buffer
,
"UTF-8"
)
;
in
.
close
(
)
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
}
return
result
;
}
/** 从assets 文件夹中读取图片 */
public
static
Drawable
loadImageFromAsserts
(
final
Context
ctx
,
String
fileName
)
{
try
{
InputStream
is
=
ctx
.
getResources
(
)
.
getAssets
(
)
.
open
(
fileName
)
;
return
Drawable
.
createFromStream
(
is
,
null
)
;
}
catch
(
IOException
e
)
{
if
(
e
!=
null
)
{
e
.
printStackTrace
(
)
;
}
}
catch
(
OutOfMemoryError
e
)
{
if
(
e
!=
null
)
{
e
.
printStackTrace
(
)
;
}
}
catch
(
Exception
e
)
{
if
(
e
!=
null
)
{
e
.
printStackTrace
(
)
;
}
}
return
null
;
}
|
26、展开、收起状态栏
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public
static
final
void
collapseStatusBar
(
Context
ctx
)
{
Object
sbservice
=
ctx
.
getSystemService
(
"statusbar"
)
;
try
{
Class
<?
>
statusBarManager
=
Class
.
forName
(
"android.app.StatusBarManager"
)
;
Method
collapse
;
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
JELLY_BEAN_MR1
)
{
collapse
=
statusBarManager
.
getMethod
(
"collapsePanels"
)
;
}
else
{
collapse
=
statusBarManager
.
getMethod
(
"collapse"
)
;
}
collapse
.
invoke
(
sbservice
)
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
}
}
public
static
final
void
expandStatusBar
(
Context
ctx
)
{
Object
sbservice
=
ctx
.
getSystemService
(
"statusbar"
)
;
try
{
Class
<?
>
statusBarManager
=
Class
.
forName
(
"android.app.StatusBarManager"
)
;
Method
expand
;
if
(
Build
.
VERSION
.
SDK_INT
>=
17
)
{
expand
=
statusBarManager
.
getMethod
(
"expandNotificationsPanel"
)
;
}
else
{
expand
=
statusBarManager
.
getMethod
(
"expand"
)
;
}
expand
.
invoke
(
sbservice
)
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
}
}
|
用途:可用于点击Notifacation之后收起状态栏
27、 获取状态栏高度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public
static
int
getStatusBarHeight
(
Context
context
)
{
Class
<
?
>
c
=
null
;
Object
obj
=
null
;
Field
field
=
null
;
int
x
=
0
,
statusBarHeight
=
0
;
try
{
c
=
Class
.
forName
(
"com.android.internal.R$dimen"
)
;
obj
=
c
.
newInstance
(
)
;
field
=
c
.
getField
(
"status_bar_height"
)
;
x
=
Integer
.
parseInt
(
field
.
get
(
obj
)
.
toString
(
)
)
;
statusBarHeight
=
context
.
getResources
(
)
.
getDimensionPixelSize
(
x
)
;
}
catch
(
Exception
e1
)
{
e1
.
printStackTrace
(
)
;
}
return
statusBarHeight
;
}
|
28、ListView使用ViewHolder极简写法
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
static
<
T
extends
View
>
T
getAdapterView
(
View
convertView
,
int
id
)
{
SparseArray
<
View
>
viewHolder
=
(
SparseArray
<
View
>
)
convertView
.
getTag
(
)
;
if
(
viewHolder
==
null
)
{
viewHolder
=
new
SparseArray
<
View
>
(
)
;
convertView
.
setTag
(
viewHolder
)
;
}
View
childView
=
viewHolder
.
get
(
id
)
;
if
(
childView
==
null
)
{
childView
=
convertView
.
findViewById
(
id
)
;
viewHolder
.
put
(
id
,
childView
)
;
}
return
(
T
)
childView
;
}
|
用法:
1
2
3
4
5
6
7
8
9
10
|
@
Override
public
View
getView
(
int
position
,
View
convertView
,
ViewGroup
parent
)
{
if
(
convertView
==
null
)
{
convertView
=
LayoutInflater
.
from
(
getActivity
(
)
)
.
inflate
(
R
.
layout
.
fragment_feed_item
,
parent
,
false
)
;
}
ImageView
thumnailView
=
getAdapterView
(
convertView
,
R
.
id
.
video_thumbnail
)
;
ImageView
avatarView
=
getAdapterView
(
convertView
,
R
.
id
.
user_avatar
)
;
ImageView
appIconView
=
getAdapterView
(
convertView
,
R
.
id
.
app_icon
)
;
}
|
用起来非常简练,将ViewHolder隐于无形。
29、 设置Activity透明
1
2
3
4
5
6
7
|
<style
name
="TransparentActivity"
parent
="AppBaseTheme">
<item
name
="android
:
windowBackground">@android
:
color/transparent</item>
<item
name
="android
:
colorBackgroundCacheHint">@null</item>
<item
name
="android
:
windowIsTranslucent">true</item>
<item
name
="android
:
windowNoTitle">true</item>
<item
name
="android
:
windowContentOverlay">@null</item>
</style>
|
说明:AppBaseTheme一般是你application指定的android:theme是啥这里就是啥,否则Activity内部的空间风格可能不一致。
用途:用于模拟Dialog效果,比如再Service中没法用Dialog,就可以用Activity来模拟
30、 代码切换全屏
1
2
3
4
5
|
//切换到全屏
getWindow
(
)
.
clearFlags
(
WindowManager
.
LayoutParams
.
FLAG_FORCE_NOT_FULLSCREEN
)
;
getActivity
(
)
.
getWindow
(
)
.
addFlags
(
WindowManager
.
LayoutParams
.
FLAG_FULLSCREEN
)
;
//切换到非全屏
getWindow
(
)
.
clearFlags
(
WindowManager
.
LayoutParams
.
FLAG_FULLSCREEN
)
;
getWindow
(
)
.
addFlags
(
WindowManager
.
LayoutParams
.
FLAG_FORCE_NOT_FULLSCREEN
)
;
|
注意:切换到全屏时,底部的虚拟按键仍然是显示的。次方法可多次调用用于切换
用途:播放器界面经常会用到
转自:农民伯伯