您的位置:首页 > 移动开发 > Android开发

Android 零碎知识点---2

2017-08-20 17:40 483 查看

android中TextView属性之autoText解析

(转载自:http://blog.csdn.net/muyi_amen/article/details/46911635

如果没有时间看完全篇的同学们,可以直接看文章的最后第四点总结的内容。

一、看看Android官方文档的描述。



在这之前,需要说明一点autoText虽然是TextView的属性之一,但它实际是服务于EditText。EditText是TextView的子类。

如果在TextView中设置属性autoText,编译器会提示“TextView不建议使用autoText属性”—因为设置了也是无效的。

二、那autoText在EditText中到底在干什么呢。来看看android TextView源码片段。

[java] view plain copyprint?

1. //autotext对应的是android:autotext属性
2. //autocap对应的是android:capitalize属性
3. if (autotext || autocap != -1) {
4.             TextKeyListener.Capitalize cap;
5.
6.             inputType = EditorInfo.TYPE_CLASS_TEXT;
7.
8.             switch (autocap) {
9.             case 1:
10.                 cap = TextKeyListener.Capitalize.SENTENCES;//每句的第一个单词首字母转为大写
11.         //inputType对应的是android:inputType属性
12.                 inputType |= EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES;//每一句的第一个单词的首字母大写
13.                 break;
14.
15.             case 2:
16.                 cap = TextKeyListener.Capitalize.WORDS;//每个单词的首字母大写
17.                 inputType |= EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS;
18.                 break;
19.
20.             case 3:
21.                 cap = TextKeyListener.Capitalize.CHARACTERS;//所有字符大写
22.                 inputType |= EditorInfo.TYPE_TEXT_FLAG_CAP_CHARACTERS;
23.                 break;
24.
25.             default:
26.                 cap = TextKeyListener.Capitalize.NONE;
27.                 break;
28.             }
29.
30.             createEditorIfNeeded();
31.             mEditor.mKeyListener = TextKeyListener.getInstance(autotext, cap);
32.             mEditor.mInputType = inputType;
33.         }


此段源码中可以发现,其实就是给inputType这个属性赋值。

第31行中,再次把autoText传递给了TextKeyListener。看看TextKeyListener的源码:

[java] view plain copyprint?

1. public class TextKeyListener extends BaseKeyListener implements SpanWatcher {
2.     private static TextKeyListener[] sInstance =
3.         new TextKeyListener[Capitalize.values().length * 2];
4.
5.     /* package */ static final Object ACTIVE = new NoCopySpan.Concrete();
6.     /* package */ static final Object CAPPED = new NoCopySpan.Concrete();
7.     /* package */ static final Object INHIBIT_REPLACEMENT = new NoCopySpan.Concrete();
8.     /* package */ static final Object LAST_TYPED = new NoCopySpan.Concrete();
9.
10.     private Capitalize mAutoCap;
11.     private boolean mAutoText;
12.
13.     private int mPrefs;
14.     private boolean mPrefsInited;
15.
16.     /* package */ static final int AUTO_CAP = 1;
17.     /* package */ static final int AUTO_TEXT = 2;
18.     /* package */ static final int AUTO_PERIOD = 4;
19.     /* package */ static final int SHOW_PASSWORD = 8;
20.     private WeakReference<ContentResolver> mResolver;
21.     private TextKeyListener.SettingsObserver mObserver;
22.
23.     /**
24.      * Creates a new TextKeyListener with the specified capitalization
25.      * and correction properties.
26.      *
27.      * @param cap when, if ever, to automatically capitalize.
28.      * @param autotext whether to automatically do spelling corrections.
29.      */
30.     public TextKeyListener(Capitalize cap, boolean autotext) {
31.         mAutoCap = cap;
32.         mAutoText = autotext;
33.     }
34.
35.     /**
36.      * Returns a new or existing instance with the specified capitalization
37.      * and correction properties.
38.      *
39.      * @param cap when, if ever, to automatically capitalize.
40.      * @param autotext whether to automatically do spelling corrections.
41.      */
42.     public static TextKeyListener getInstance(boolean autotext,
43.                                               Capitalize cap) {
44.         int off = cap.ordinal() * 2 + (autotext ? 1 : 0);
45.
46.         if (sInstance[off] == null) {
47.             sInstance[off] = new TextKeyListener(cap, autotext);
48.         }
49.
50.         return sInstance[off];
51.     }
52.
53.     /**
54.      * Returns a new or existing instance with no automatic capitalization
55.      * or correction.
56.      */
57.     public static TextKeyListener getInstance() {
58.         return getInstance(false, Capitalize.NONE);
59.     }
60.
61.     /**
62.      * Returns whether it makes sense to automatically capitalize at the
63.      * specified position in the specified text, with the specified rules.
64.      *
65.      * @param cap the capitalization rules to consider.
66.      * @param cs the text in which an insertion is being made.
67.      * @param off the offset into that text where the insertion is being made.
68.      *
69.      * @return whether the character being inserted should be capitalized.
70.      */
71.     public static boolean shouldCap(Capitalize cap, CharSequence cs, int off) {
72.         int i;
73.         char c;
74.
75.         if (cap == Capitalize.NONE) {
76.             return false;
77.         }
78.         if (cap == Capitalize.CHARACTERS) {
79.             return true;
80.         }
81.
82.         return TextUtils.getCapsMode(cs, off, cap == Capitalize.WORDS
83.                 ? TextUtils.CAP_MODE_WORDS : TextUtils.CAP_MODE_SENTENCES)
84.                 != 0;
85.     }
86.
87.     public int getInputType() {
88.         return makeTextContentType(mAutoCap, mAutoText);
89.     }
90.
91.     @Override
92.     public boolean onKeyDown(View view, Editable content,
93.                              int keyCode, KeyEvent event) {
94.         KeyListener im = getKeyListener(event);
95.
96.         return im.onKeyDown(view, content, keyCode, event);
97.     }
98.
99.     @Override
100.     public boolean onKeyUp(View view, Editable content,
101.                            int keyCode, KeyEvent event) {
102.         KeyListener im = getKeyListener(event);
103.
104.         return im.onKeyUp(view, content, keyCode, event);
105.     }
106.
107.     @Override
108.     public boolean onKeyOther(View view, Editable content, KeyEvent event) {
109.         KeyListener im = getKeyListener(event);
110.
111.         return im.onKeyOther(view, content, event);
112.     }
113.
114.     /**
115.      * Clear all the input state (autotext, autocap, multitap, undo)
116.      * from the specified Editable, going beyond Editable.clear(), which
117.      * just clears the text but not the input state.
118.      *
119.      * @param e the buffer whose text and state are to be cleared.
120.      */
121.     public static void clear(Editable e) {
122.         e.clear();
123.         e.removeSpan(ACTIVE);
124.         e.removeSpan(CAPPED);
125.         e.removeSpan(INHIBIT_REPLACEMENT);
126.         e.removeSpan(LAST_TYPED);
127.
128.         QwertyKeyListener.Replaced[] repl = e.getSpans(0, e.length(),
129.                                    QwertyKeyListener.Replaced.class);
130.         final int count = repl.length;
131.         for (int i = 0; i < count; i++) {
132.             e.removeSpan(repl[i]);
133.         }
134.     }
135.
136.     public void onSpanAdded(Spannable s, Object what, int start, int end) { }
137.     public void onSpanRemoved(Spannable s, Object what, int start, int end) { }
138.
139.     public void onSpanChanged(Spannable s, Object what, int start, int end,
140.                               int st, int en) {
141.         if (what == Selection.SELECTION_END) {
142.             s.removeSpan(ACTIVE);
143.         }
144.     }
145.
146.     private KeyListener getKeyListener(KeyEvent event) {
147.         KeyCharacterMap kmap = event.getKeyCharacterMap();
148.         int kind = kmap.getKeyboardType();
149.
150.         if (kind == KeyCharacterMap.ALPHA) {
151.             return QwertyKeyListener.getInstance(mAutoText, mAutoCap);
152.         } else if (kind == KeyCharacterMap.NUMERIC) {
153.             return MultiTapKeyListener.getInstance(mAutoText, mAutoCap);
154.         } else if (kind == KeyCharacterMap.FULL
155.                 || kind == KeyCharacterMap.SPECIAL_FUNCTION) {
156.             // We consider special function keyboards full keyboards as a workaround for
157.             // devices that do not have built-in keyboards.  Applications may try to inject
158.             // key events using the built-in keyboard device id which may be configured as
159.             // a special function keyboard using a default key map.  Ideally, as of Honeycomb,
160.             // these applications should be modified to use KeyCharacterMap.VIRTUAL_KEYBOARD.
161.             return QwertyKeyListener.getInstanceForFullKeyboard();
162.         }
163.
164.         return NullKeyListener.getInstance();
165.     }
166.
167.     public enum Capitalize {
168.         NONE, SENTENCES, WORDS, CHARACTERS,
169.     }
170.
171.     private static class NullKeyListener implements KeyListener
172.     {
173.         public int getInputType() {
174.             return InputType.TYPE_NULL;
175.         }
176.
177.         public boolean onKeyDown(View view, Editable content,
178.                                  int keyCode, KeyEvent event) {
179.             return false;
180.         }
181.
182.         public boolean onKeyUp(View view, Editable content, int keyCode,
183.                                         KeyEvent event) {
184.             return false;
185.         }
186.
187.         public boolean onKeyOther(View view, Editable content, KeyEvent event) {
188.             return false;
189.         }
190.
191.         public void clearMetaKeyState(View view, Editable content, int states) {
192.         }
193.
194.         public static NullKeyListener getInstance() {
195.             if (sInstance != null)
196.                 return sInstance;
197.
198.             sInstance = new NullKeyListener();
199.             return sInstance;
200.         }
201.
202.         private static NullKeyListener sInstance;
203.     }
204.
205.     public void release() {
206.         if (mResolver != null) {
207.             final ContentResolver contentResolver = mResolver.get();
208.             if (contentResolver != null) {
209.                 contentResolver.unregisterContentObserver(mObserver);
210.                 mResolver.clear();
211.             }
212.             mObserver = null;
213.             mResolver = null;
214.             mPrefsInited = false;
215.         }
216.     }
217.
218.     private void initPrefs(Context context) {
219.         final ContentResolver contentResolver = context.getContentResolver();
220.         mResolver = new WeakReference<ContentResolver>(contentResolver);
221.         if (mObserver == null) {
222.             mObserver = new SettingsObserver();
223.             contentResolver.registerContentObserver(Settings.System.CONTENT_URI, true, mObserver);
224.         }
225.
226.         updatePrefs(contentResolver);
227.         mPrefsInited = true;
228.     }
229.
230.     private class SettingsObserver extends ContentObserver {
231.         public SettingsObserver() {
232.             super(new Handler());
233.         }
234.
235.         @Override
236.         public void onChange(boolean selfChange) {
237.             if (mResolver != null) {
238.                 final ContentResolver contentResolver = mResolver.get();
239.                 if (contentResolver == null) {
240.                     mPrefsInited = false;
241.                 } else {
242.                     updatePrefs(contentResolver);
243.                 }
244.             } else {
245.                 mPrefsInited = false;
246.             }
247.         }
248.     }
249.
250.     private void updatePrefs(ContentResolver resolver) {
251.         boolean cap = System.getInt(resolver, System.TEXT_AUTO_CAPS, 1) > 0;
252.         boolean text = System.getInt(resolver, System.TEXT_AUTO_REPLACE, 1) > 0;
253.         boolean period = System.getInt(resolver, System.TEXT_AUTO_PUNCTUATE, 1) > 0;
254.         boolean pw = System.getInt(resolver, System.TEXT_SHOW_PASSWORD, 1) > 0;
255.
256.         mPrefs = (cap ? AUTO_CAP : 0) |
257.                  (text ? AUTO_TEXT : 0) |
258.                  (period ? AUTO_PERIOD : 0) |
259.                  (pw ? SHOW_PASSWORD : 0);
260.     }
261.
262.     /* package */ int getPrefs(Context context) {
263.         synchronized (this) {
264.             if (!mPrefsInited || mResolver.get() == null) {
265.                 initPrefs(context);
266.             }
267.         }
268.
269.         return mPrefs;
270.     }


以上源码中真正使用到autoText的是getInputType()这个方法。在看此方法调用的是makeTextContentType(mAutoCap, mAutoText),这个方法中其实还是在进行inputType的赋值。

三、看到这里,发现autoText和capitalize属性如影随形。而且感觉autoText没有什么用,真正跟autoText有关系的就是下面这句

[java] view plain copyprint?

1. if (autoText) {
2.             contentType |= InputType.TYPE_TEXT_FLAG_AUTO_CORRECT;//自动更正文本输入
3.         }


官方描述为“自动更正文本输入”。既然是更正,所以必须要有规则。没有规则就不知道什么是正确的。所以单独使用autoText是不起任何作用的。需要和capitalize配合使用。

四、最后,总结一下。

1、autoText是作用在EditText上的属性。

2、即使autoText和capitalize配合使用,他们也是在给inputType赋值。那我们为什么不直接使用inputType这个属性呢—–其实android官方也是建议直接使用inputType这个属性的。不管是使用autoText和capitalize或者inputType,其实只是对手机输入法软键盘有一些影响。EditText本身不会对setText的内容做什么调整。

如果你还是在使用autoText和capitalize这2个属性,最好使用inputType替换。不然出现如下警告:

Deprecated views, attributes and so on are deprecated because there is a better way to do something. Do it that new way. You’ve been warned

通过警告也可以看到,autoText和capitalize已经过时了。

去记录一个过时的方法,感觉有点“然而这并没有什么卵用”的感觉。只是自己在看到这个属性时,不知道这个属性在干什么。所以当我弄明白的时候,就记录于此

Android - 控件android:ems属性

(转载自:http://blog.csdn.net/caroline_wendy/article/details/41684255

xml中android:ems属性,作为EditText默认生成的属性,其含义是需要编辑的字符串长度。

设置为10时,最多编辑10个em,一个em单位是两个inch,但是随着自动调整,在Android中em代表‘M’的数量。

但是EditText的属性,只有在android:layout_width=“wrap_content”时,才会显示;

如果是android:layout_width=“match_parent”时,则不会有变化。

em参考:

http://www.w3.org/Style/Examples/007/units

“The em is simply the font size. In an element with a 2in font, 1em thus means 2in. Expressing sizes, such as margins and paddings, in em means they are related to the font size, and if the user has a big font (e.g., on a big screen) or a small font (e.g., on a handheld device), the sizes will be in proportion. Declarations such as ‘text-indent: 1.5em’ and ‘margin: 1em’ are extremely common in CSS.”

ems属性参考:

参考:http://stackoverflow.com/questions/7053738/what-is-meant-by-ems-android-textview

android:ems or setEms(n) sets the width of a TextView to fit a text of n ‘M’ letters regardless of the actual text extension and text size. See wikipedia Em unit. but only when the layout_width is set to “wrap_content”. Other layout_width values override the ems width setting.

Adding an android:textSize attribute determines the physical width of the view to the textSize * length of a text of n ‘M’s set above.

我的Android进阶之旅——>Android 标签的用法

(转载自:http://blog.csdn.net/ouyang_peng/article/details/46957281)

布局资源文件的根节点可以使用容器控件(如LinearLayout、FrameLayout等),也可以使用非容器控件(如:EditText、TextView等)。对于非容器控件,只能在非容器控件标签中放< requestFocus />标签,表示将当前控件设为焦点。如下代码:

1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2.     android:layout_width="match_parent"
3.     android:layout_height="match_parent"
4.     android:orientation="vertical" >
5.
6.     <Button
7.         android:id="@+id/buttonRingtone"
8.         android:layout_width="wrap_content"
9.         android:layout_height="wrap_content"
10.         android:text="设置来电铃声" />
11.
12.     <Button
13.         android:id="@+id/buttonAlarm"
14.         android:layout_width="wrap_content"
15.         android:layout_height="wrap_content"
16.         android:text="设置闹钟铃声" />
17.
18.     <Button
19.         android:id="@+id/buttonNotification"
20.         android:layout_width="wrap_content"
21.         android:layout_height="wrap_content"
22.         android:text="设置通知铃声" />
23.
24.     <EditText
25.         android:id="@+id/text"
26.         android:layout_width="match_parent"
27.         android:layout_height="wrap_content" >
28.         <!-- 当前控件处于焦点状态 -->
29.         <requestFocus />
30.     </EditText>
31. </LinearLayout>


运行后,EditText控件处于焦点状态,光标一直在动,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android