Johnny Shieh

人如果没有梦想,跟咸鱼有什么分别


  • 首页

  • 分类

  • 归档

  • 标签

  • 读书

  • 小伙伴

  • 关于

  • 搜索

Android xml 资源文件中 @、@android:、@*、?的含义和区别

发表于 2014-09-12 | 分类于 Android | | 阅读次数

引用自定义资源文件

  • 在 xml 中引用的格式为:@[<package_name>:]<resource_type>/<resource_name>

<package_name>: 资源文件所在的包名( layout文件和自定义其他resource文件在同一个包,所以可以省略)
<resource_type>:资源文件的类型
<resource_name>:资源文件的名称

例如: android:text=”@string/hello”

  • 在代码中引用的格式为:R.<resource_type>.<resource_name>,如:R.string.hello

引用系统资源文件

系统资源文件分为 pulbic 和非 public,public 的声明在:<sdk_path>/platforms/android-19/data/res/values/public.xml

  • 引用 public 资源文件

xml: @android:<resource_type>/<resource_name>
code: android.R.<resource_type>.<resource_name>

例如:android:drawable=”@android:drawable/dialog_frame”
getResources.getDrawable( android.R.drawable.dialog_frame );

阅读全文 »

[转] Java 程序员们最常犯的 10 个错误

发表于 2014-08-02 | 分类于 Java | | 阅读次数

将数组转化为列表

将数组转化为一个列表时,程序员们经常这样做:

1
List<String> list = Arrays.asList(arr);

Arrays.asList() 会返回一个 ArrayList 对象,ArrayList 类是 Arrays 的一个私有静态类,
而不是 java.util.ArrayList 类,java.util.Arrays.ArrayList 类有 set()、get()、contains() 方法,
但是没有增加元素的方法,所以它的大小是固定的,想要创建一个真正的 ArrayList 类,你应该这样做:

1
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

ArrayList 的构造方法可以接受一个集合类型,刚好它也是 java.util.Arrays.ArrayList 的超类。

判断一个数组是否包含一个值

程序员们经常这样做:

1
2
Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

这段代码起作用,但是没有必要把一个数组转化成列表,转化为列表需要额外的时间。它可以像下面那样简单:

1
Arrays.asList(arr).contains(targetValue);

或者是:

1
2
3
4
5
6
for(String s:arr){
if(s.equals(targetValue)){
return true;
}
}
return false;

第一种方法比第二种更容易读

阅读全文 »

Android View setEnabled false 没有效果的解决方法

发表于 2014-07-30 | 分类于 Android | | 阅读次数

问题场景

今天遇到了一个很诡异的问题,Android 中 setEnable(false) 没有作用,网上找的很多方法还是没用。会出现这种情况的有下面几个场景:

  1. ListView 中的子视图 setEnable(false) 后点击仍然会响应 onItemClick
  2. FrameLayout 中上层试图 disable 后,上层试图没有响应事件,但是 touch 事件传递到下层视图了
  3. ViewGroup 调用 setEnable(false),不会自动把子视图设为 disabled

针对第一个场景,同事给出了一个解决方法:设置一个空的 onClickListener

1
2
3
4
5
6
7
view.setEnabled ( false );
view.setOnClickListener( new OnClickListener() {
@Override
public void onClick(View v) {
// nothing, just to fix the bug that the view can be clicked.
}
} );

其实上面的做法就是消费点击事件但是什么都不做,并不是一般情况下的不消费点击事件。在 Android 的 View 源码中我找到了产生这个效果的原因,具体看下面代码:

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
public boolean onTouchEvent(MotionEvent event) {
final float x = event.getX();
final float y = event.getY();
final int viewFlags = mViewFlags;
if ((viewFlags & ENABLED_MASK) == DISABLED) {
if (event.getAction() == MotionEvent.ACTION_UP && (mPrivateFlags & PFLAG_PRESSED) != 0) {
setPressed(false);
}
// A disabled view that is clickable still consumes the touch
// events, it just doesn't respond to them.
return (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));
}
// ENABLED_MASK为DISABLED时,且isClickable()或isLongClickable()为true时,onTouchEvent 直接return true,消费了事件却不做其他事情
// 而setOnClickListener时,会setClickable(true).
...
}
/**
* Register a callback to be invoked when this view is clicked. If this view is not
* clickable, it becomes clickable.
*
* @param l The callback that will run
*
* @see #setClickable(boolean)
*/
public void setOnClickListener(OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
阅读全文 »

获得 Android 系统 Widget 控件的方法

发表于 2014-07-23 | 分类于 Android | | 阅读次数

最近在工作中需要改变 Android 系统的一些控件的属性,一开始不知从何下手,经过一段时间的 google 得到了答案,如果我们知道 Widget 的 ID,那么就可以得到它了。

获得 System Widget ID

应用程序自身创建的 View 的 ID 的结构是:R.id.XXX

而由系统自身创建的 View 的 ID 的结构是:com.android.internal.R.id.XXX

可以通过 Android 的 Hierarchyviewer Tools 来获得 System Widget 的 ID

例如,ActionBar相关ID如下:

action_bar_container -- ActionBar 的 parent view 的 ID
action_bar_title     -- ActionBar 的 title 的 ID (它是一个 TextView)
action_bar_subtitle  -- ActionBar 的 subtitle 的 ID

通过 findViewById 获得 View

首先,需要获得当前页的 root View – getActivity().getWindow().getDecorView()

然后,findViewById , ( that is it ).

阅读全文 »

Android ListView 用 EditText 实现搜索功能

发表于 2013-05-01 | 分类于 Android | | 阅读次数

问题描述

我最近遇到这样一个问题:ListView 显示城市列表,上面有个 EditText 控件,当在 EditText 输入关键字如‘南’时,ListView 重新显示与此相关的城市列表,从而实现搜索功能。

由于 ListView 用的是系统的 ArrayAdapter,它实现 Filterable 接口,所以这个问题就简单很多了,只需要监听 Edittext 的输入就可以了。

方案

下面是关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
searchEdittext.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user change the text
mAdapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
//
}
@Override
public void afterTextChanged(Editable arg0) {
//
}
});

如果是自定义的Adapter,也可以实现Filterable接口

阅读全文 »
1…141516
Johnny Shieh

Johnny Shieh

我本微末,心向天空

76 日志
13 分类
43 标签
GitHub Weibo Gmail 简书
  • 热门系列
  • Dagger 完全解析(6)
  • AspectJ in Android(3)
  • Kotlin 写 Android 单元测试(4)
  • Kotlin 协程完全解析(5)
© 2015 - 2019 Johnny Shieh
访客数 访问量