本博客为大家介绍android中的相对比较复杂的控件,希望对大家能有所帮助,下面依次来看看吧!!
一、ListView
我们使用ListView来显示两列,一列表示用户名,一列表示用户的IP地址
在main.xml中设置整体布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/listLinearLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ListView
android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false"
android:scrollbars="vertical">
</ListView>
</LinearLayout>
</LinearLayout>
其中,必须要加上红色标志部分,用来表示ListView 的ID,否则系统启动会报错,其次,我们还得要有一个布局文件,它用来表示ListView中各列显示的布局,我这里取名为user.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:paddingLeft="10dip" android:paddingRight="10dip" android:paddingTop="1dip" android:paddingBottom="1dip" > <TextView android:id="@+id/user_name" android:layout_width="180dip" android:layout_height="30dip" android:textSize="10pt" android:singleLine="true"/> <TextView android:id="@+id/user_ip" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textSize="10pt" android:gravity="right"/> </LinearLayout>
好了,接下来定义我们的Activity类,这个类需继承自ListActivity:
package com.test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.ListActivity; import android.os.Bundle; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; public class ListViewActivity extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //创建一个list对象,为其中增加相应的信息 List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); HashMap<String, String> map1 = new HashMap<String, String>(); HashMap<String, String> map2 = new HashMap<String, String>(); HashMap<String, String> map3 = new HashMap<String, String>(); map1.put("user_name", "zhangsan"); map1.put("user_ip", "192.168.1.5"); map2.put("user_name", "lisi"); map2.put("user_ip", "192.168.1.6"); map3.put("user_name", "wangwu"); map3.put("user_ip", "192.168.1.7"); list.add(map1); list.add(map2); list.add(map3); //表示ListView中的两列 SimpleAdapter listAdapter = new SimpleAdapter(this, list, R.layout.user, new String[] { "user_name", "user_ip" }, new int[] { R.id.user_name, R.id.user_ip }); this.setListAdapter(listAdapter); } //参数:ListView本身,被点击控件的对象,位置,id @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); System.out.println("id:"+id); System.out.println("position:"+position); } }
注意SimpleAdapter中的参数介绍:1、当前对象 2、list数据,其中的键值要与user.xml中的各TextView中的id要一样3、定义存放内容的布局文件,上面我们已经提到了4、找寻HashMap中的键值,与HashMap中的键值相对应5、user.xml中布局文件的ID
onListItemClick是点击每一行所触发的事件,我们可以得到相应的信息!
需要统一的地方:HashMap中的键值、new String中字符数组、user.xml中控件ID要一致,这样我们的ListView页面就出来了!!
二、TabHost:就是分页卡,像我们手机中的已接来电、未接来电、全部通话等等
借用上面的ListView,我们使用TabHost,一个页面用来显示上面ListView中的信息,另一个页面用来显示hello字符串信息
把上面Listview中的布局文件、user.xml文件、以及ListActivity拷贝到项目中来,因为这些都需要用到,新建TabHost的布局文件tab.xml:
<?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5dp"> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5dp"> <TextView android:id="@+id/hello" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello"/> </FrameLayout> </LinearLayout> </TabHost>
注意:使用TabHost中的布局就必须按照TabHost里面相应的布局进行,否则会报错;接下来我们在Activity中 将ListView及文本加入到TabHost中:
package com.harder.xin; import android.app.TabActivity; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.widget.TabHost; public class MainActivity extends TabActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tab); addTab(); } /** * 添加Tab */ private void addTab(){ //得到当前Activity的TabHost类,针对TabActivity的操作通常都由这个类完成 TabHost tabHost=getTabHost(); //创建TabHost.TabSpec,这个对象代表了一页 TabHost.TabSpec remoteTabSpec=tabHost.newTabSpec("list page"); Intent remoteIntent=new Intent(); //生成一个Inent对象,该对象指向一个Activity remoteIntent.setClass(this, ListViewActivity.class); //设置Tab里面的内容 remoteTabSpec.setContent(remoteIntent); //设置Tab里的setIndicator理解为label和icon图标,这里使用的图标是系统里面自带的 Resources res=getResources(); remoteTabSpec.setIndicator("列表页面", res.getDrawable(android.R.drawable.stat_sys_download)); //将设置好的TabSpec对象添加到tabHost中 tabHost.addTab(remoteTabSpec); //创建第二个tabHost TabHost.TabSpec localTabSpec=tabHost.newTabSpec("text"); localTabSpec.setContent(R.id.hello); localTabSpec.setIndicator("文本页面",res.getDrawable(android.R.drawable.stat_sys_upload)); tabHost.addTab(localTabSpec); } }
相应的注释在代码中可以知道,注意:在AndroidMainifest.xml中将TabActivity主界面设置为启动页面,设置好后,我们看到的效果:
三、Spinner:android选择框,相当于我们的下拉列表,让我们可以选择相应的数据
数据定义,我们可以在strings.xml中指定数据,也可以自己在代码中控制显示的数据,只是我们在strings.xml中定义的数据不灵活,而在代码中控制我们要显示的数据是我们经常用到的,这两种方式的区别是创建ArrayAdapter的方式不同,下面来看一下:
首先定义我们的布局文件:得在布局文件中加入Spinner标签:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Spinner android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/planets_spinner" /> </LinearLayout>
通过strings.xml定义要显示的数据,在strings.xml中加入string-array数组,或者在values中添加array.xml文件也可以定义:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MainActivity!</string>
<string name="app_name">Spinner</string>
<string-array name="planets_array">
<item>changsha</item>
<item>zhuzhou</item>
<item>xiangtan</item>
<item>hengyang</item>
<item>huaihua</item>
</string-array>
</resources>
好了,定义好数据后,通过代码显示数据:
/** * 通过在strings.xml中定义数据来创建Spinner * 数据是死的,不灵活 */ private void createSpinnerByStringXML(){ //通过createFromResource方法创建一个ArrayAdapter对象; //第一个参数表示当前上下文对象 //第二个参数引用了在strings.xml中定义的String数组 //第三个参数用来指定Spinner的样式,是一个布局文件ID,该布局文件由android系统提供,也可以替换为自己的布局文件 ArrayAdapter<CharSequence> adapter=ArrayAdapter.createFromResource (this, R.array.planets_array, android.R.layout.simple_spinner_item); //设置Spinner中每个条目的样式,同样是引用android系统提供的一个布局文件 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setPrompt("选择城市"); //选择每个条目后所触发的事件 spinner.setOnItemSelectedListener(new SpinnerClickListener()); }
然后在我们定义的Activity的onCreate方法中调用上面的方法,运行程序即可看到如下页面:
好了,接下来我们在程序中自己定义数据,我们还需要一个xml文件,用来表示每条数据显示的布局,上面是用的android里面自己提供的布局样式,我们这里定义为item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textViewId" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout>
接下来在程序中控制显示:
private void createSpinnerByAutoData(){ List<String> list=new ArrayList<String>(); list.add("beijing"); list.add("hunan"); list.add("shanghai"); list.add("tianjing"); /** * 通过创建ArrayAdapter的构造函数创建ArrayAdapter对象 * 参数:第一个表示当前上下文对象 * 第二个表示指定下拉菜单中每一个条目的样式 * 第三个指定了TextView控件的ID,在item.xml中有一个TextView * 第四个表示为整个列表提供数据,任何类型的数据都会调用其toString方法,将其显示在上面 */ ArrayAdapter adapter=new ArrayAdapter (this, R.layout.item, R.id.textViewId, list); spinner.setAdapter(adapter); spinner.setPrompt("选择省份"); spinner.setOnItemSelectedListener(new SpinnerClickListener()); }
解释的话基本在代码中我们就会知道了,只是通过strings.xml中创建数据,我们使用的ArrayAdapter是调用其createFromResource方法,而自定义数据我们使用的ArrayAdapter是通过new ArrayAdapter(),根据其参数去调用相应的信息,我们在点击某一项的时候,会产生一个点击事件:
//监听用户选择列表的动作 class SpinnerClickListener implements OnItemSelectedListener{ //点击某一项执行的方法 @Override public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) { //得到当前选中条目的信息 String selectItem=adapterView.getItemAtPosition(position).toString(); System.out.println("你选择的是--->"+selectItem); } //没有点击执行的方法 @Override public void onNothingSelected(AdapterView<?> arg0) { System.out.println("Nothing selected"); } }
解释见代码,通过自定义数据显示出来的界面:比较丑,因为我们没有在item.xml中为其设置相应的显示样式