Android常用UI

详细介绍列表视图(ListView)、单选(RadioGroup)、多选(CheckBox)、下拉列表(Spinner)、菜单(Menu)、内容提示文本框(AutoCompleteTextView)、手势识别(GestureOverlayView)、网页视图(WebView)。

1.列表视图(ListView)

 

XML配置

     在主界面中配置<ListView>标签

     在res/layout/文件夹下创建一个新的xml文件指定每个条目的布局

Java代码构建ListView

     获取ListView对象

     设置一个Adapter

          用适配器封装有两种方式:

             1.SimpleAdapter:以List<Map<String,?>>形式封装数据

             2.SimpleCursorAdapter:以Cursor对象封装数据,Cursor中需要有“_id”一列

添加OnItemClickListener

     调用ListView的getItemAtPosition(int)方法可以获取封装数据的容器

     如果传入的是SimpleAdapter,获取到的就是一个Map<String,?>

     如果传入的是SimpleCursorAdapter,获得到的就是一个Cursor,并且Cursor以指向选中的一条记录

 

 示例:

用SimpleAdapter进行数据绑定

public class MainActivity extends Activity {
    private PersonService service;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        service = new PersonService(this);
        ListView listView = (ListView) this.findViewById(R.id.listView);
        
        //获取到集合数据
        List<Person> persons = service.getScrollData(0, 10);
        List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>();
        for(Person person : persons){
        	HashMap<String, Object> item = new HashMap<String, Object>();
        	item.put("id", person.getId());
        	item.put("name", person.getName());
        	item.put("phone", person.getPhone());
        	item.put("amount", person.getAmount());
        	data.add(item);
        }
       //创建SimpleAdapter适配器将数据绑定到item显示控件上
       SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item, 
        		new String[]{"name", "phone", "amount"}, new int[]{R.id.name, R.id.phone, R.id.amount});
       //实现列表的显示
       listView.setAdapter(adapter);
       //条目点击事件
       listView.setOnItemClickListener(new ItemClickListener());
    }
       //获取点击事件    
    private final class ItemClickListener implements OnItemClickListener{

		public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
			ListView listView = (ListView) parent;
			HashMap<String, Object> data = (HashMap<String, Object>) listView.getItemAtPosition(position);
			String personid = data.get("id").toString();
			Toast.makeText(getApplicationContext(), personid, 1).show();
		}
    }
}


 用SimpleCursorAdapter进行数据绑定

public class MainActivity extends Activity {
    private PersonService service;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        service = new PersonService(this);
        ListView listView = (ListView) this.findViewById(R.id.listView);
        //获取游标
        Cursor cursor = service.getCursorScrollData(0, 10);
        //创建SimpleCursorAdapter适配器将数据绑定到item显示控件上
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item, cursor, 
        		new String[]{"name", "phone", "amount"}, new int[]{R.id.name, R.id.phone, R.id.amount});
        listView.setAdapter(adapter);
        //条目点击事件
        listView.setOnItemClickListener(new ItemClickListener());
    }
    
    private final class ItemClickListener implements OnItemClickListener{

		public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
			ListView listView = (ListView) parent;
			Cursor cursor = (Cursor) listView.getItemAtPosition(position);
			String personid = String.valueOf(cursor.getInt(cursor.getColumnIndex("_id")));
			Toast.makeText(getApplicationContext(), personid, 1).show();
		}
    }
}

 

2.单选(RadioGroup)

定义<RadioGroup> 

在<RadioGroup>中定义<RadioButton>和<Button>

处理Button点击事件

根据ID获取RadioGroup对象,调用其getCheckedRadioButtonId()方法可以获取其中被选中的RadioGroup的ID

 main.xml:

    <RadioGroup
      android:id="@+id/radioGroup"
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal"
      >
    	<RadioButton
    	  android:id="@+id/java"
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content" 
    	  android:text="Java"
    	  android:layout_weight="1"
    	/>  
    	<RadioButton
    	  android:id="@+id/net"
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content" 
    	  android:text=".NET"
    	  android:layout_weight="1"
    	/>  
    	<RadioButton
    	  android:id="@+id/php"
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content" 
    	  android:text="PHP"
    	  android:layout_weight="1"
    	/>  
         <Button
    	  android:id="@+id/php"
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content" 
    	  android:text="确定"
    	  android:onClick="submitRadio"
    	  android:layout_weight="1"
    	 />
    </RadioGroup>

MainActivity:

    public void submitRadio(View view){
    	//获取选中按钮的ID
    	int id =radioGroup.getCheckedRadioButtonId();
    	RadioButton radioButton=(RadioButton)findViewById(id);
    	Toast.makeText(this,radioButton.getText(), 0).show();
    }


3.多选(CheckBox)

定义若干<CheckBox>和一个<Button>

处理Button的点击事件

根据findViewById获取每个CheckBox,调用其isChecked()方法判断是否被选中

  <LinearLayout
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	>
    	<CheckBox
    	  android:id="@+id/javaCheckBox"
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content" 
    	  android:text="Java"
    	  android:layout_weight="1"
    	/>  
    	<CheckBox
    	  android:id="@+id/netCheckBox"
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content" 
    	  android:text=".NET"
    	  android:layout_weight="1"
    	/>  
    	<CheckBox
    	  android:id="@+id/phpCheckBox"
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content" 
    	  android:text="PHP"
    	  android:layout_weight="1"
    	/>  
         <Button
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content" 
    	  android:text="确定"
    	  android:onClick="submitCheckBox"
    	  android:layout_weight="1"
    	 />
   </LinearLayout>


4.下拉列表(Spinner)

定义<Spinner>标签

创建一个适配器

获取Spinner标签,调用setAdapter(SpinnerAdapter adapter)方法设置一个适配器

调用setOnItemSelectedListener(OnItemSelectedListener listener)方法设置监听器监听选中事件

使用字符串构建适配器

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		spinner = (Spinner) findViewById(R.id.spinner);
		generateSpinner();
	}

	private void generateSpinner() {
		//android.R.layout.simple_spinner_item下拉列表的样式
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		adapter.add("Java");
		adapter.add(".NET");
		adapter.add("PHP");
		spinner.setAdapter(adapter);
		//监听器
		spinner.setOnItemSelectedListener(new OnItemSelectedListener(){
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				String selection=(String)parent.getItemAtPosition(position);
				Toast.makeText(getApplicationContext(), selection, 0).show();
			}
			public void onNothingSelected(AdapterView<?> arg0) {
			}
		});
	}

使用JavaBean构建适配器

	private void generateSpinnerByJavaBean() {
		ArrayAdapter<User> adapter = new ArrayAdapter<User>(this, android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		adapter.add(new User(1,"aaa","aaa@163.com"));
		adapter.add(new User(2,"bbb","bbb@163.com"));
		adapter.add(new User(3,"ccc","ccc@163.com"));
		spinner.setAdapter(adapter);
		//监听器
		spinner.setOnItemSelectedListener(new OnItemSelectedListener(){
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				User user=(User)parent.getItemAtPosition(position);
				Toast.makeText(getApplicationContext(), user.toString(), 0).show();
			}
			public void onNothingSelected(AdapterView<?> arg0) {
			}
		});
	}

使用资源文件构建适配器

支持国际化

资源文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<string-array name="items">
		<item>Java</item>
		<item>.NET</item>
		<item>PHP</item>
	</string-array>
</resources>


MainActivity

	private void generateSpinnerByResource() {
		ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.items, android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		spinner.setAdapter(adapter);
		spinner.setOnItemSelectedListener(new OnItemSelectedListener(){
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				CharSequence selection=(CharSequence)parent.getItemAtPosition(position);
				Toast.makeText(getApplicationContext(), selection, 0).show();
			}
			public void onNothingSelected(AdapterView<?> arg0) {
			}
		});
	}


 

自定义适配器样式

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.custom, R.id.content);

R.layout.custom 布局文件ID

R.id.content 哪一个组件用来显示文本

自定义布局文件:

<?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="wrap_content"
  >
  <ImageView
  	  android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:src="@android:drawable/btn_radio"
  />
  <TextView
  	  android:id="@+id/content"
  	  android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginLeft="30dp"
      android:textColor="#FFFF0000"
      android:textSize="30sp"
  />
</LinearLayout>

activity:

	private void generateSpinnerByResource() {
		ArrayAdapter<String> adapter =new ArrayAdapter<String>(this,R.layout.item,R.id.content);
		adapter.add("java");
		adapter.add(".NET");
		adapter.add("php");
		spinner.setAdapter(adapter);
	}

5.菜单(Menu)

    

添加菜单项

1.重写Actvity的onCreateOptionsMenu(Menu menu)方法

2.添加菜单项

     调用方法中参数menu的add(CharSequence title) 方法

3.添加子菜单

    调用menu对象的addSubMenu(final CharSequence title)

    该方法返回一个SubMenu对象

4.添加子菜单的菜单项

   调用SubMenu对象的add(CharSequence title) 方法

处理菜单点击事件

重写Activity的onOptionsItemSelected(MenuItem item) 方法

     参数item即为被选中的菜单项

	/*
	 * 点击菜单按钮时会调用这个方法
	 * 支持子菜单,子菜单中不能再创建子菜单
	 */
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(Menu.NONE,0,1,"增加1");
		menu.add(Menu.NONE,1,0,"增加2");
		menu.add("修改");
		menu.add("删除"); 
		//创建子菜单
		SubMenu subMenu=menu.addSubMenu("查询");
		subMenu.add("按id查询");
		subMenu.add("按名字查询");
		subMenu.add("按邮箱查询");
		return super.onCreateOptionsMenu(menu);
	}
	
	/*
	 * 点击菜单项会执行这个方法
	 * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
	 */
	public boolean onOptionsItemSelected(MenuItem item) {
		Toast.makeText(this, item.getTitle(), 0).show();
		return super.onOptionsItemSelected(item);
	}

6.手势识别(GestureOverlayView)

创建手势库

导入SDK中的工程

   android-sdk-windows\samples\android-8\GestureBuilder

   这个工程不能直接导入,需要添加三个配置文件:.classpath、.project、default.properties

将工程部署到手机中,创建手势库

   手势库会存储在手机SD卡的根目录

使用手势识别

    

XML配置:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
	<android.gesture.GestureOverlayView
		android:id="@+id/gov"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		android:gestureStrokeType="multiple"
	    >
	    <ImageView
	    	android:id="@+id/img"
	    	android:layout_width="wrap_content" 
	    	android:layout_height="wrap_content" 
	    	/>
	</android.gesture.GestureOverlayView>
</LinearLayout>

Java代码:

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		gov = (GestureOverlayView) findViewById(R.id.gov);
		img=(ImageView) findViewById(R.id.img);
		//获取到手势库,并加载
		library = GestureLibraries.fromRawResource(this, R.raw.gestures);
		library.load();
		gov.addOnGesturePerformedListener(new MyListener());
	}
	private final class MyListener implements OnGesturePerformedListener {
		public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
			//手势库来匹配手势
			ArrayList<Prediction> list = library.recognize(gesture);
			
			//查询手势库匹配的分值并打印
			for(Prediction p:list){
				System.out.println(p.name+":"+p.score);
			}
			
			//获取匹配度最高的选项
			Prediction p =list.get(0);
			
			//如果匹配值小于3则不能识别
			if(p.score<3){
				Toast.makeText(getApplicationContext(), "手势不能识别", 0).show();
			}else if("true".equals(p.name)){
				//执行的内容
			}else if("o".equals(p.name)){
				//执行的内容
			}else if("x".equals(p.name)){
				//执行的内容
			}
		}
	}

7.网页视图(WebView)

WebView(网络视图)能加载显示网页,它使用了WebKit渲染引擎加载显示网页,WebKit是android手机中内置了一款高性能内核浏览器。

XML配置:

	<WebView
		android:id="@+id/webView"
		android:layout_width="fill_parent" 
	    android:layout_height="fill_parent"
		/>


java代码:

		WebView webView = (WebView) findViewById(R.id.webView);
		// 或取内容
		String url = editText.getText().toString();
		// 设置是否可缩放
		webView.getSettings().setBuiltInZoomControls(true);
		// 设置是否支持脚本
		webView.getSettings().setJavaScriptEnabled(true);
		// 设置客户端(谷歌Chrome客户端)
		webView.setWebChromeClient(new WebChromeClient());
		// 加载页面
		webView.loadUrl(url);


 

8.内容提示文本框(AutoCompleteTextView)

单次提示

   XML文件:

    <AutoCompleteTextView
    	android:id="@+id/actv"
    	android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:completionThreshold="1"
    	/>

   Java代码:

	private void generateActv() {
		AutoCompleteTextView actv = (AutoCompleteTextView) findViewById(R.id.actv);
		String[] items = { "tom", "tony", "terry", "付东", "付荣", "付贵" };
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, items);
		actv.setAdapter(adapter);
	}


 

 多次提示


 XML文件:

    <MultiAutoCompleteTextView
    	android:id="@+id/mactv"
    	android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:completionThreshold="1"
    	/>

Java代码:

	private void generateMactv() {
		MultiAutoCompleteTextView mactv = (MultiAutoCompleteTextView) findViewById(R.id.mactv);
		String[] items = { "tom", "tony", "terry", "付东", "付荣", "付贵" };
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, items);
		mactv.setAdapter(adapter);
		//用分隔符进行分割
		mactv.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
	}



Android 常用UI 框架有很多种,下面我将介绍其中几种常用UI 框架。 1. Android Native UI 框架:Android 提供了自带的 UI 控件库,包括 TextView、Button、ListView 等。这些控件具有良好的兼容性和稳定性,适合开发简单的界面。 2. RecyclerView:RecyclerView 是一个高度可定制的控件,替代了 ListView 和 GridView。它使得列表的管理和展示更加灵活,可以通过添加不同的布局管理器和适配器来实现不同形式的列表显示方式。 3. ConstraintLayout:ConstraintLayout 是一个相对布局控件,它强调使用约束来定位和管理子视图的位置。通过设置约束规则,可以创建复杂的布局,适用于各种复杂的界面设计。 4. ViewPager:ViewPager 是支持左右滑动切换页面的控件,通常用于实现导航、展示图片等功能。它可以结合 Fragment 使用,实现多页面的切换效果。 5. Material Design:Material Design 是 Google 提出的一种全新的设计风格,它包含了一系列的 UI 设计规范、交互模式和组件库。开发者可以使用 Material Design 提供的控件和样式来创建符合统一风格的用户界面。 6. ButterKnife:ButterKnife 是一个基于注解的 View 绑定框架,可以简化在代码中 findViewById 的操作。通过注解的方式,可以方便地绑定 View,并且提供了一些简化代码的方法。 综上所述,以上是 Android 开发常用的一些 UI 框架。根据具体的开发需求和设计风格,开发者可以选择合适的框架来提升开发效率和用户体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傅荣康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值