Activity之常见控件(二)
上一篇文章中,记录一些在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系统提供的;
②. 每一个条目的布局文件和具体展示的数据是相对应的,所以本例中每一个条目有两列。
2. 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>
3. 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>
4. 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>
5. 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的东西,既是初学还是自学,也没做过项目,所以不免有错误的地方和有点抓不住重点,还请大家能留言交流,谢谢
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/141
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
近期评论