安卓常用的输入控件控件为Button,EditText,CheckBox,RadioButton,ToggleButton,Picker,Spinner.
Button,如果只需要在按钮上放置文字信息时,可以使用Button。在按钮上放置图片时,使用ImageButton,当然如若需要在按钮上同时放置文字和图片,可以使用Button。
在安卓中,设置构建布局为fill_parent,将强制性的让该控件视图填充满整个视图。wrap_parent,自适应。match_parent,填充满父容器。
获取用户的点击事件:1.使用android:onClick属性,在xml文件中的Button标签中加入android:onClick属性,在要加载这个xml文件的Activity文中加入一个固定格式:
public void 响应方法名(View view){}。然后再将响应名字填入android:onClick的值中去。我们便可以得到用户的点击事件,并对他做出处理。
2.onClickListener,添加监听器。先获取Button对象:Button btn=(Button)findViewById(R.id.btn);再获取onClickListener的对象,并把监听器对象交给Button对象,btn.setOnClickListener(new OnClickListener() {public void onClick(View view) {},把我们需要加的操作写入监听器中,便可以实现我们想实现的点击事件。
Selector为了后期美化,我们可以选择使用selector来获取新的外观图,创建xml文件的时候把类型改为selector,建立在drawable里,而非以前的layout类型。
设置android:state_pressed="true",可以被点击,点击的时候会更换成下面的图片。
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:drawable="@drawable/test_bg"></item>
<item android:drawable="@drawable/turretbz"></item>
</selector>
注意,item越简单的,需要放在越下面。
EditText,可输入文本输入框,基本用法:android:hint="@String/email_hint"属性,可以给我们的编辑框加入一个提示信息。
android:inputType="textEmailAddress"提供给我们调整键盘样式的能力。可以得到只有数字或者输入邮件地址的软键盘。
android:imeOptions="actionSend",软键盘中总有一个默认按钮,这个按钮没有默认的响应方法,需要我们自定义。设置,android:imeOptions="actionDone"软键盘下方变为”完成“光标保持在原来的输入框上,软键盘关闭。android:imeOptions="actionSend"软键盘下面按钮变为”发送“光标移动到下一个。
在加入了imeOptions属性之后,需要一个监听器来监听该按钮的响应。
EditText edit=(EditText)findViewById(R.id.edit);
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
boolean handled = false;
if (actionId == EditorInfo.IME_ACTION_SEND) {
handled = true;
}
return handled;
}
});
android:password="true",此属性规定密码是以密文方式输入,如想改为名文,就改为”false“。
CheckBox,多选框。我们设置onClick的方式加入一个写在Activity中的点击响应方法,便可以使用多选框的监听器:onCheckeChangeListener.
RadioButton,单选框。该控件需要和RadioGroup一起使用。给RadioGroup加入一个onCheckedChangeListener来监听我们的选择监听。
Adapter和ListView
Adapter:用于连接两个事物的桥梁。适配器用来连接我们的AdapterView和数据。
ListView列表空间,实现一个数据列表,方便我们修改数据,同时影响界面。
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:entries="@array/Cities" >
</ListView>
用entries,连接一个string的item。创建方法和selector相似。每个item里放入string数据
在Activity中实现一个我们自己扩展的BaseAdapter子类对象。找到listview对象,将适配器对象设置给listview对象。
Listview也可以作为一个装载控件的容器,其本身不显示数据。注意:listview只能通过适配器加载他的子空控件,如下例。
ListView list=(ListView) findViewById(R.id.listView1);
list.setAdapter(new MyBaseAdapter1());//注:该处的new MyBaseAdapter1()是一个继承了BaseAdapter的子类。
ListView动态内容的动态添加:
由用户或服务器获取的数据,更新数据容器。
Adapter.notifyDataSetChanged();来提醒ListView数据已经更新,界面需要刷新。
例:
public class ListViewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
final ArrayList<String> array=new ArrayList<String>();
array.add("上海");
array.add("成都");
setContentView(R.layout.layout_inflator);
ListView listview=(ListView) findViewById(R.id.listview);
final MyBaseAdapter adapter = this.new MyBaseAdapter(array);
listview.setAdapter(adapter);
EditText edit=(EditText) findViewById(R.id.edittext);
edit.setOnEditorActionListener(new OnEditorActionListener() {
public boolean onEditorAction(TextView tv, int actionid, KeyEvent arg2) {
// TODO Auto-generated method stub
switch(actionid){
case EditorInfo.IME_ACTION_DONE:
array.add(tv.getText().toString());
<span style="white-space:pre"> </span>//提示数据已经更新,界面需要更新。
adapter.notifyDataSetChanged();
tv.setText("");
return true;
}
return false;
}
});
}
LIstView性能优化:1.复用convertView2.减少对findViewById()的使用。convertView是getView方法里的一个参数。
class MyBaseAdapter1 extends BaseAdapter{
ArrayList<Map<String,Object>> array=new ArrayList();
LayoutInflater inflater;
public MyBaseAdapter1() {
// TODO Auto-generated constructor stub
inflater = ChatActivity.this.getLayoutInflater();
for(int i=0;i<=2;i++){
Map<String,Object> ma=new HashMap<String,Object>();
ma.put("str1", str1[i]);
ma.put("str2", str2[i]);
ma.put("int3", int3[i]);
array.add(ma);
}
/* for (int i = 0; i < array.size(); i++) {
System.out.println(array.get(i).get("str1"));
}*/
}
public int getCount() {
// TODO Auto-generated method stub
return array.size();
}
public View getView(int position, View view1, ViewGroup arg2) {
if(view1==null){
view1=inflater.inflate(R.layout.layout_inflator, null);
TextView tv_name=(TextView) view1.findViewById(R.id.tv_name);
TextView tv_say=(TextView) view1.findViewById(R.id.tv_say);
viewholder=new ViewHolder();
viewholder.tv_name=tv_name;
viewholder.tv_say=tv_say;
view1.setTag(viewholder);
}
viewholder=(ViewHolder) view1.getTag();
viewholder.tv_name.setText("章子怡");
viewholder.tv_say.setText("今天16号,天气晴朗!");
return view1;
}
class ViewHolder{
TextView tv_name;
TextView tv_say;
}
}
android:divider="@color/mycolor"间隔线的图片或者颜色的设定。
android:dividerHeight="3dip"间隔线的宽度
该上的方法用于修改ListView中每个item之间的间隔线。
android:stackFromBottom="true"从列表最下方开始。
android:transcriptMode="alwaysScroll"一直显示新来的数据。
android:cacheColorHint="@android:color/transparent" 滑动时,背景透明度。