上一篇文章中,记录一些在activity常见的控件,今天再记录也是很常见的控件,但其用法相对来说,要更复杂一些,直接来例子:

  1. ListView
    ListView一看名字就知道了,用于在activity中展示一个list,例如我们要查询出所有的用户并在activity中展示出来,那么此时ListView就派上用场了;首先看Activity的代码:
package cn.bridgeli.demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<Map<String, String>> list = new ArrayList<Map<String,String>>();
        Map<String, String> map1 = new HashMap<String, String>();
        Map<String, String> map2 = new HashMap<String, String>();
        Map<String, String> map3 = new HashMap<String, String>();

        map1.put("username", "test1");
        map1.put("user_ip", "192.168.0.1");
        map2.put("username", "test2");
        map2.put("user_ip", "192.168.0.2");
        map3.put("username", "test3");
        map3.put("user_ip", "192.168.0.3");

        list.add(map1);
        list.add(map2);
        list.add(map3);

        SimpleAdapter listAdapter = new SimpleAdapter(this, list, R.layout.item, new String[]{"username", "user_ip"}, new int[]{R.id.username, R.id.user_ip});

        setListAdapter(listAdapter);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        System.out.println("position === " + position);
        System.out.println("id === " + id);
    }
}

这里面用到了两个布局文件,一个是主布局文件activity_main.xml,比较简单,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
xmlns:tools="http://schemas.android.com/tools"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical"  
tools:context="cn.bridgeli.demo.MainActivity" >

<LinearLayout android:id="@+id/listLinearLayout"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical" >

<ListView android:id="@id/android:list"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical"  
android:drawSelectorOnTop="false" />

</LinearLayout>

</LinearLayout>  

另一个是每一个条目的布局文件:item.xml,其实也很简单:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
xmlns:tools="http://schemas.android.com/tools"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical"  
tools:context="cn.bridgeli.demo.MainActivity"  
android:paddingLeft="10dip"  
android:paddingRight="10dip"  
android:paddingTop="1dip"  
android:paddingBottom="1dip">

<TextView android:id="@+id/username"  
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>  

需要说明的是,①. 主布局文件中,ListView的ID是Android系统提供的;
②. 每一个条目的布局文件和具体展示的数据是相对应的,所以本例中每一个条目有两列。

  1. ExpandableListActivity
    这个则更复杂一些,他不仅仅是直接展示出来,更需要对展示的数据进行分组,如果系统要求不仅把所有的用户都展示出来,更要求把同一个级别的用户放到同一个组里面,那么ExpandableListActivity就派上用了,先看activity代码:
package cn.bridgeli.demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.ExpandableListActivity;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleExpandableListAdapter;

public class MainActivity2 extends ExpandableListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        List<Map<String, String>> groups = new ArrayList<Map<String,String>>();
        Map<String, String> group1 = new HashMap<String, String>();
        group1.put("group", "group1");
        Map<String, String> group2 = new HashMap<String, String>();
        group1.put("group", "group2");
        groups.add(group1);
        groups.add(group2);

        List<Map<String, String>> child1 = new ArrayList<Map<String,String>>();
        Map<String, String> child1Data1 = new HashMap<String, String>();
        child1Data1.put("child1", "child1Data1");
        Map<String, String> child1Data2 = new HashMap<String, String>();
        child1Data1.put("child1", "child1Data2");
        child1.add(child1Data1);
        child1.add(child1Data2);

        List<Map<String, String>> child2 = new ArrayList<Map<String,String>>();
        Map<String, String> child2Data1 = new HashMap<String, String>();
        child1Data1.put("child2", "child2Data1");
        Map<String, String> child2Data2 = new HashMap<String, String>();
        child1Data1.put("child2", "child2Data2");
        child2.add(child2Data1);
        child2.add(child2Data2);

        List<List<Map<String, String>>> childs = new ArrayList<List<Map<String,String>>>();
        childs.add(child1);
        childs.add(child2);

        SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(this, groups, R.layout.group, new String[]{"group"}, new int[]{R.id.groupTo}, childs, R.layout.child, new String[]{"child"}, new int[]{R.id.childTo});

        setListAdapter(adapter);
    }

    @Override
    public boolean onChildClick(ExpandableListView parent, View v,
                                int groupPosition, int childPosition, long id) {
        return super.onChildClick(parent, v, groupPosition, childPosition, id);
    }
}

这个里面用到了三个布局文件,分别是主布局文件:activity_main3.xml,一级目录的布局文件:group.xml和二级目录的布局文件:child.xml,代码分别如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
xmlns:tools="http://schemas.android.com/tools"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical"  
tools:context="cn.bridgeli.demo.MainActivity" >

<ExpandableListView  
android:id="@id/android:list"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:drawSelectorOnTop="false"/>

<TextView  
android:id="@id/android:empty"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:text="no data"/>  
</LinearLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
xmlns:tools="http://schemas.android.com/tools"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical" >

<TextView android:id="@+id/groupTo"  
android:layout_width="fill_parent"  
android:layout_height="fill_parent"  
android:paddingLeft="10dip"  
android:paddingRight="10dip"  
android:paddingTop="1dip"  
android:paddingBottom="1dip"  
android:textSize="10pt"  
android:singleLine="true"/>

</LinearLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
xmlns:tools="http://schemas.android.com/tools"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical" >

<TextView android:id="@+id/childTo"  
android:layout_width="fill_parent"  
android:layout_height="fill_parent"  
android:paddingLeft="10dip"  
android:paddingRight="10dip"  
android:paddingTop="1dip"  
android:paddingBottom="1dip"  
android:textSize="10pt"  
android:singleLine="true"/>

</LinearLayout>  
  1. Spinner
    这个在开发中,也很常见,老夫理解其实就是我们在web中的下拉框而已,其中下拉的数据实现有两种,第一种:直接在strings.xml中写死
package cn.bridgeli.demo2;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Spinner spinner = (Spinner) findViewById(R.id.spinnerId);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.planets_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spinner.setAdapter(adapter);
        spinner.setPrompt("test");
        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view,
                                       int position, long id) {
                String selectId = adapterView.getItemAtPosition(position).toString();
                System.out.println(selectId);
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {

            }
        });
    }

} 

布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
xmlns:tools="http://schemas.android.com/tools"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical"  
tools:context="cn.bridgeli.demo2.MainActivity" >

<Spinner android:id="@+id/spinnerId"  
android:layout_width="wrap_content"  
android:layout_height="wrap_content"/>  
</LinearLayout>  

从代码中我们看到,有一个数据源,就是提供给我们下拉选择有哪些,就是strings.xml:

<?xml version="1.0" encoding="utf-8"?>  
<resources>

<string-array name="planets_array">  
<item >Mercury</item>  
<item >Venus</item>  
<item >Earth</item>  
</string-array>  
</resources>  

这个其实用途算是一般吧,因为有些时候我们并不知道下拉的是那些数据,是我们从数据库中根据不同的情况读取出来的,这个也很简单

package cn.bridgeli.demo2;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

public class MainActivity2 extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Spinner spinner = (Spinner) findViewById(R.id.spinnerId);
        List<String> list = new ArrayList<String>();
        list.add("test1");
        list.add("test2");
        list.add("test3");
        ArrayAdapter<CharSequence> adapter = new ArrayAdapter(this, R.layout.item, R.id.textView, list);

        spinner.setAdapter(adapter);
        spinner.setPrompt("test");
        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view,
                                       int position, long id) {
                String selectId = adapterView.getItemAtPosition(position).toString();
                System.out.println(selectId);
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {

            }
        });
    }
}

从代码里面我们可以看到,这里面多了一个每一个条目的布局文件,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
xmlns:tools="http://schemas.android.com/tools"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical"  
tools:context="cn.bridgeli.demo2.MainActivity" >

<TextView  
android:id="@+id/textView"  
android:layout_width="fill_parent"  
android:layout_height="match_parent"/>  
</LinearLayout>  
  1. AutoCompleteTextView
    这个我们在开发中用的应该也挺多,很多时候用户在输入的时候,我们需要给用户更好的体验,什么刚好的体验呢?当用户输入一半的时候,我们能提示用户可能的输入就好了,那么此时这个控件就派上用场了:
package cn.bridgeli.demo3;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

import com.example.demo3.R;

public class MainActivity extends ActionBarActivity {

    private AutoCompleteTextView autoCompleteTextView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        autoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView);

        List<String> list = new ArrayList<String>();
        list.add("test1");
        list.add("test2");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item, R.id.textview, list);

        autoCompleteTextView.setAdapter(adapter);
    }

} 

需要说明的是,本例中的提示用的是List,其实大家也可以换成数组之类的,不过个人认为一般提示的数据应该是从数据库中查询出来的,所以应该以List居多,例如当用户输入 a 时,提示所以以 a 打头的所有用户,对应的布局文件也有两个,分别是主布局文件和提示用户时出现的下拉框的布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
xmlns:tools="http://schemas.android.com/tools"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical"  
tools:context="cn.bridgeli.demo.MainActivity" >

<AutoCompleteTextView  
android:id="@+id/autoCompleteTextView"  
android:layout_width="match_parent"  
android:layout_height="match_parent"/>  
</LinearLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
xmlns:tools="http://schemas.android.com/tools"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical"  
tools:context="cn.bridgeli.demo.MainActivity" >

<TextView  
android:id="@+id/textview"  
android:layout_width="match_parent"  
android:layout_height="match_parent"/>  
</LinearLayout>  
  1. DatePickerDialog
    这个用途其实也很多,例如当用户注册注册时填写注册日期之类的,那么这个控件就派上用了:
package cn.bridgeli.demo;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;

public class Dateactivity extends Activity {

    private Button button = null;
    private static final int DATE_ID = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                showDialog(DATE_ID);
            }
        });
    }

    @Override
    @Deprecated
    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case DATE_ID:
                return new DatePickerDialog(this, new OnDateSetListener() {

                    @Override
                    public void onDateSet(DatePicker datePicker, int year, int month, int date) {
                        System.out.println();
                    }
                }, 2015, 0, 25);
        }
        return null;
    }
}

对应的肯定也有一个布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
xmlns:tools="http://schemas.android.com/tools"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:orientation="vertical"  
tools:context="cn.bridgeli.demo.MainActivity" >

<Button  
android:id="@+id/button"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:text="Test"/>  
</LinearLayout>  

其实除了这些还有很多很多我们很常用的一些控件,例如:TimePickerDialog,其实和DatePickerDialog很类似,只不过一个是时间一个是日期仅此而已,有赖于我们工作中自己去学习积累,至于他们的用法其实也都不难,当我们用到一个控件时,如果我们不知道怎么用,先去查资料,然后根据资料写一个小例子测试一下,那个时候一个控件怎么用我们就会一目了然,所以学习的时候重要的是:自学的能力,只要你大胆的写,不要怕犯错就对了。

PS:第一次写Android的东西,既是初学还是自学,也没做过项目,所以不免有错误的地方和有点抓不住重点,还请大家能留言交流,谢谢