一步一步学android控件(之五) —— AutoCompleteTextView

浏览:
字体:
发布时间:2013-12-09 23:24:05
来源:
android 控件众多 , 额 , 具体多少个呢? 貌似有那么几十个吧,也没做个统计,嘿嘿!......
有木有朋友感觉写了那么长时间的android代码,有时候想写点自己的东西的时候却发现自己好像离不开网络耶,什么都需要先到网络上遨游一番才能解决自己的问题。思前想后,个人觉得还是有必要巩固一下自己学习过的东西——想想以前这些东西,自己都写过一遍了,但是折腾一段时间下来都不知道放哪里去了........
好了,废话不多说了,这次准备重新学习一下android的常用控件TextView、EditText、AutoCompleteTextView、Button、CalendarView、CheckBox、Chronometer、CompoundButton、DatePicker、DigitalClock、ExpandableListView、Gallery、GridView、HorizontalScrollView、ImageButton、ImageSwitcher、ImageView、ListPopupWindow、ListView、MultiAutoCompleteTextView、NumberPicker、PopupMenu、PopupWindow、ProgressBar、QuickContactBadge、RadioButton、RadioGroup、RatingBar、RemoteViews、ScrollView、SearchView、SeekBar、SlidingDarwer、Switch、TableHost、TextClock、TextSwitcher、TimePicker、Toast、ToggleButton、VideoView、ViewFlipper、ViewSwitcher、ZoomButton等控件。
 
 
今天学习的控件——AutoCompleteTextView , AutoCompleteTextView控件的作用是什么呢? AutoComplete(自动完成),这里大家叫他自动补全—— 当在EditText中输入字符时他将去去一个集合中搜索出满足条件的项,然后列出这些项。在官方文档里给的例子是这样的
 
[java]  
public class CountriesActivity extends Activity {  
     protected void onCreate(Bundle icicle) {  
         super.onCreate(icicle);  
         setContentView(R.layout.countries);  
  
         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,  
                 android.R.layout.simple_dropdown_item_1line, COUNTRIES);  
         AutoCompleteTextView textView = (AutoCompleteTextView)  
                 findViewById(R.id.countries_list);  
         textView.setAdapter(adapter);  
     }  
  
     private static final String[] COUNTRIES = new String[] {  
         "Belgium", "France", "Italy", "Germany", "Spain"  
     };  
 }  
 
好吧,今天就按照这个样例简单实现AutoCompleteTextView,只不过我们要将这里的COUNTIES 换成我们自己想要的内容——在这里我们关心的是整个系统中的文件名称。
先看看效果图:
 
 
下面就一步一步来实现上述功能
 
1、准备必须的布局文件——auto_complete_textview_detail.xml
 
[html]  
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical" >  
  
    <AutoCompleteTextView  
        android:id="@+id/show_auto_complete_textview"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:layout_margin="10dp">  
        <requestFocus />  
    </AutoCompleteTextView>  
  
</LinearLayout>  
该文件中只包含一个View ——AutoCompleteTextView 。
2、 创建activity ——WidgetAutoCompleteActivity.java
 
[java]  
package com.xy.zt.selfdefinewieget;  
  
import java.io.File;  
import java.util.ArrayList;  
import java.util.LinkedList;  
  
import android.app.Activity;  
import android.os.AsyncTask;  
import android.os.Bundle;  
import android.os.Environment;  
import android.widget.ArrayAdapter;  
import android.widget.AutoCompleteTextView;  
  
public class WidgetAutoCompleteActivity extends Activity {  
    private AutoCompleteTextView mShowAuto;  
    private ArrayAdapter<String> mAutoAdapter;  
  
    private class FileSearchTask extends AsyncTask<Void, Void, String[]> {  
  
        @Override  
        protected void onPostExecute(String[] result) {  
            if (result == null || result.length == 0) {  
                return;  
            }  
            mShowAuto.setEnabled(true);  
            if (mAutoAdapter == null) {  
                mAutoAdapter = new ArrayAdapter<String>(  
                        WidgetAutoCompleteActivity.this,  
                        android.R.layout.simple_dropdown_item_1line, result);  
                mShowAuto.setAdapter(mAutoAdapter);  
            }  
        }  
  
        @Override  
        protected String[] doInBackground(Void... params) {  
            File rootDir = Environment.getRootDirectory();  
            LinkedList<File> queue = new LinkedList<File>();  
            ArrayList<String> result = new ArrayList<String>();  
            queue.offer(rootDir);  
            File tmpFile, tmpDirAllFile[];  
            while ((tmpFile = queue.poll()) != null) {  
                if (tmpFile.isDirectory()) {  
                    tmpDirAllFile = tmpFile.listFiles();  
                    if (tmpDirAllFile != null) {  
                        for (File f : tmpDirAllFile) {  
                            queue.offer(f);  
                        }  
                    }  
                } else {  
                    result.add(tmpFile.getName());  
                }  
            }  
            String[] tmpFileNames = new String[result.size()];  
            result.toArray(tmpFileNames);  
            result.clear();  
            result = null;  
            queue = null;  
            return tmpFileNames;  
        }  
  
    }  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.auto_complete_textview_detail);  
        init();  
        new FileSearchTask().execute();  
    }  
  
    private void init() {  
        mShowAuto = (AutoCompleteTextView) findViewById(R.id.show_auto_complete_textview);  
        mShowAuto.setEnabled(false);  
        mShowAuto.setThreshold(1);  
    }  
}  
这个文件处理了所有想要做的事,在OnCreate函数中 new FileSearchTask().execute(); 启动一个异步线程在后台例举出所有的文件名称(在这个过程中AutoCompleteTextView是不可用的),加载完成后准备Adapter 
[java]  
mAutoAdapter = new ArrayAdapter<String>(  
                        WidgetAutoCompleteActivity.this,  
                        android.R.layout.simple_dropdown_item_1line, result);  
                mShowAuto.setAdapter(mAutoAdapter);  
 
由于AutoCompleteTextView默认是最少两个字符才进行处理, 想要输入一个字符就进行处理——加入下面这句话
[java] 
mShowAuto.setThreshold(1);  
 
3、重点已经完成,下面就添加剩余的代码以符合整个工程的架构。
3.1 在ViewData中加入如下内容
 
[java]  
public static final int AUTO_COMPLETE_TEXTVIEW_ID = EDIT_TEXT_ID +1 ;  
public static final String AUTO_COMPLETE_TEXTVIEW_NAME = "AutoCompleteTextView";  
private static final ViewData mAutoCompleteTextView = new ViewData(AUTO_COMPLETE_TEXTVIEW_NAME, AUTO_COMPLETE_TEXTVIEW_ID);  
View_Datas.add(mAutoCompleteTextView);  
3.2 在WidgetsAdapter的handleItemClicked 函数中添加如下内容:
[java]  
case ViewData.AUTO_COMPLETE_TEXTVIEW_ID:  
            intent.setClass(mContext, WidgetAutoCompleteActivity.class);  
            mContext.startActivity(intent);  
            break;  
 
不想太死板,我想要更炫的效果,ok 满足你 ^_^!
 
首先修改上文中mAutoAdapter的构造
 
[java] 
mAutoAdapter = new ArrayAdapter<String>(  
                        WidgetAutoCompleteActivity.this,  
                        R.layout.auto_complete_item, R.id.auto_item_file_name,result);  
上面代码中看到使用了布局文件auto_complete_item和其内部定义的一个id叫auto_item_file_name的View,下面是文件内容
[html] 
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical" >  
  
    <TextView  
        android:id="@+id/auto_item_file_name"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:textAppearance="?android:attr/textAppearanceMedium"  
        android:background="@drawable/widget_button_drawable"  
        android:textColor="@color/auto_complete_font_color"  
        android:paddingTop="10dp"  
        android:paddingBottom="10dp"  
        android:textSize="16sp" />  
  
</LinearLayout>  
注意:该布局中的TextView是必须的不能换成其他的View , 否则将报ClassCastException。
TextView使用的背景Widget_button_drawable的定义参见一步一步学android控件(之三) —— Button   。TextView 使用的字体颜色是心添加的 ,定义在widget_color.xml文件中
 
[html] 
<color name="auto_complete_font_color">#FFCC00</color>
>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();