android拦截短信并屏蔽系统的Notification

http://blog.csdn.net/wufenglong/archive/2011/03/07/6230310.aspx

 

1.android接收短信时是以广播的方式

 

2.程序只要在自己的Manifest.xml里加有”接收”SMS的权限

 

<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

 

3.要写个广播接收类

public class smsreceiveandmask extends BroadcastReceiver {
	private String TAG = "smsreceiveandmask";
	@Override
	public void onReceive(Context context, Intent intent) {
		
	}

 

4.Manifest.xml的receiver标签里要加入intent-filter ,action为

<action android:name="android.provider.Telephony.SMS_RECEIVED" />

 

5.重要的是要在这个intent-filter上加上priority优先级,以使自己接收到SMS优先于系统或其它软件

<receiver android:name=".smsreceiveandmask" >
			<intent-filter android:priority="1000"> 
				<action android:name="android.provider.Telephony.SMS_RECEIVED" />
			</intent-filter>
		</receiver>

 

6.当自己的程序接收到要屏蔽的SMS后,用 this.abortBroadcast();来结束广播的继续发给别的程序,这样系统就不会收到短信广播了,Notification也不会有提示了

// 第三步:取消
if (flags_filter) {
	this.abortBroadcast();
}

 

源码如下:

Manifest.xml

< xml version="1.0" encoding="utf-8" >
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.hwttnet.test.smsreceiveandmask" android:versionCode="1"
	android:versionName="1.0">
	<uses-sdk android:minSdkVersion="3" />
	<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<receiver android:name=".smsreceiveandmask" >
			<intent-filter android:priority="1000"> 
				<action android:name="android.provider.Telephony.SMS_RECEIVED" />
			</intent-filter>
		</receiver>
	</application>
</manifest>

 

BroadcastReceiver类:

package com.hwttnet.test.smsreceiveandmask;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
public class smsreceiveandmask extends BroadcastReceiver {
	private String TAG = "smsreceiveandmask";
	@Override
	public void onReceive(Context context, Intent intent) {
		Log.v(TAG, ">>>>>>>onReceive start");
		// 第一步、获取短信的内容和发件人
		StringBuilder body = new StringBuilder();// 短信内容
		StringBuilder number = new StringBuilder();// 短信发件人
		Bundle bundle = intent.getExtras();
		if (bundle != null) {
			Object[] _pdus = (Object[]) bundle.get("pdus");
			SmsMessage[] message = new SmsMessage[_pdus.length];
			for (int i = 0; i < _pdus.length; i++) {
				message[i] = SmsMessage.createFromPdu((byte[]) _pdus[i]);
			}
			for (SmsMessage currentMessage : message) {
				body.append(currentMessage.getDisplayMessageBody());
				number.append(currentMessage.getDisplayOriginatingAddress());
			}
			String smsBody = body.toString();
			String smsNumber = number.toString();
			if (smsNumber.contains("+86")) {
				smsNumber = smsNumber.substring(3);
			}
			// 第二步:确认该短信内容是否满足过滤条件
			boolean flags_filter = false;
			if (smsNumber.equals("10086")) {// 屏蔽10086发来的短信
				flags_filter = true;
				Log.v(TAG, "sms_number.equals(10086)");
			}
			// 第三步:取消
			if (flags_filter) {
				this.abortBroadcast();
			}
		}
		Log.v(TAG, ">>>>>>>onReceive end");
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

struts2+jfreechart整合

struts2 + jfreechart整合:
1、配置环境:
 在struts2中,默认的struts-default.xml中,并没有包含chart的result-type,它是插件的形式使用的。
 把 struts2的解压包的lib里找到struts2-jfreechart-plugin-2.1.8.1.jar,拷贝到你的项目的 classpath里,
 因为这个插件里的文件struts-plugin.xml里有一个chart的result-type。内容如下:

	<package name="jfreechart-default" extends="struts-default">
       	<result-types>
    		<result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult">
    			<param name="height">150</param>
    			<param name="width">200</param>
    		</result-type>
    	</result-types>
    </package>

 

 

 同时把jfreechart的库文件jfreechart-1.0.13.jar和jcommon-1.0.16.jar拷贝到你的项目的 classpath里。

 

2、修改web.xml,增加下面的struts2的配置:

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
		<init-param>
			<param-name>struts.i18n.encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

 

3、在src目录下增加新建一个struts.xml配置文件,其主要内容如下:

	<!--
		关于extends继承jfreechart-default这点请大家注意
		因为在struts-default这个包里并没有result-type为chart的 chart
		定义在前面我们导入的struts2-jfreechart-plugin-2.1.8.jar 下面的struts-plugin.xml文件中
	-->
	<package name="jfreechart" extends="jfreechart-default">
		<action name="jfreechart" class="org.usc.actions.JfreeChartAction">
			<result name="success" type="chart">
				<param name="width">600</param>
				<param name="height">400</param>
			</result>
		</action>
	</package>

 

 

4、写测试页面:

	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>
	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		<title>jfreechart</title>
	  </head>
	  <body>
		 <img alt="jfreechart" src="jfreechart.action"/>
	  </body>
	</html>

 

 

5、在你的action代码里,返回一个JFreeChart对象即可:

	/**
	 * File   : JfreeChartAction.java
	 * Author : zqding
	 * Date   : 2010-7-27
	 * Version:
	 * Desc   : 	
	 */
	package org.usc.actions;

	import org.jfree.chart.ChartFactory;
	import org.jfree.chart.JFreeChart;
	import org.jfree.data.general.DefaultPieDataset;

	import com.opensymphony.xwork2.ActionSupport;

	public class JfreeChartAction extends ActionSupport {
		/**
		 * 定义JFreeChart对象 大家请注意在这里JFreeChart对象名只能为chart 
		 * 不能是别的, 关于这点大家可以上struts2网站上面查看一下
		 * http://struts.apache.org/2.x/docs/jfreechart-plugin.html
		 */
		private JFreeChart chart;
		
		public JFreeChart getChart() {
			return chart;
		}

		public void setChart(JFreeChart chart) {
			this.chart = chart;
		}

		@Override
		public String execute() throws Exception {
			 //设置数据
			DefaultPieDataset data = new DefaultPieDataset();
			data.setValue("Java", new Double(43.2));
			data.setValue("Visual Basic", new Double(1.0));
			data.setValue("C/C++", new Double(17.5)); 
			data.setValue("Android", new Double(60.0));
			//设置字体及生成的图片格式设置略,请参照API文档
			//生成JFreeChart对象
			chart = ChartFactory.createPieChart("Programme Language", data, true,true, false);
			return SUCCESS;
		}
	}

 

 6、发布到应用服务器,进行测试。
 http://localhost:9090/SSHDemo/jfreechart.jsp
 如下图:

jfreechart

【android开发】android文件搜索

目的:输入关键字KEY,sd卡中文件名包含KEY的文件路径显示在屏幕下方,如果没有,则toast提示,整个实现过程还是比较简单的。

思路: EditText — > button(onClick) –> getText –>ListFiles   indexof — > show

main.xml

 

< xml version="1.0" encoding="utf-8" >
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/widget0"
    >
    
<Button
	android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/button_search"
    android:layout_x="253px"
    android:layout_y="5px"
    android:text="@string/toSearch"
/>
<EditText
	android:layout_width="112px"
    android:layout_height="52px"
    android:id="@+id/key"
    android:textSize="18sp"
    android:layout_x="119px"
    android:layout_y="4px"
/>
<TextView
	android:layout_width="103px"
    android:layout_height="29px"
    android:id="@+id/TextView_showIn"
    android:layout_x="5px"
    android:layout_y="16px"
    android:textSize="20sp"
    android:text="@string/showInput"
/>
<TextView
	android:layout_width="fill_parent"
    android:layout_height="370px"
    android:id="@+id/TextView_Result"
    android:layout_x="0px"
    android:layout_y="60px"
/>
</AbsoluteLayout>

  Activity类内容

 

package com.android;

import java.io.File;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
// extends Activtiy 
//implements OnClickListener 实现click方法
public class Activity07 extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
	
	private File file;
	private String path;
	private String info;
	private String key; //关键字
	private TextView result; // 显示结果
	private EditText et; // 编辑view
	private Button search_btn; // button view
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        result = (TextView)findViewById(R.id.TextView_Result);
        et = (EditText)findViewById(R.id.key);
        search_btn = (Button)findViewById(R.id.button_search);
       // file = new File(Environment.getExternalStorageDirectory().getPath());
        file = new File("/sdcard/mp3");
        info = getString(R.string.info);
        
        search_btn.setOnClickListener(this);
    }

	/* (non-Javadoc)
	 * @see android.view.View.OnClickListener#onClick(android.view.View)
	 */
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		path = "";
		result.setText("");
		key = et.getText().toString();
		BrowserFile(file);
	}
	/**
	 * 校验 		toast提示
	 * @param file
	 */
	public void BrowserFile(File file) {
		if (key.equals("")) {
			Toast.makeText(this, getString(R.string.pleaseInput), Toast.LENGTH_LONG).show();
		} else {
			toSearchFiles(file);
			if (result.getText().equals("")) {
				Toast.makeText(this, getString(R.string.notFound), Toast.LENGTH_SHORT).show();
			}
		}
	}
    /**
     * 遍历 Files
     * @param file
     */
	public void toSearchFiles(File file) {
		File[] files = file.listFiles();
		for (File tf : files) {
			if (tf.isDirectory()) {
				toSearchFiles(tf);
			} else {
				try {
					if (tf.getName().indexOf(key) > -1) {
						path += "\n" + tf.getPath();
						result.setText(info+path);
					}
				} catch(Exception e) {
					Toast.makeText(this, getString(R.string.pathError), Toast.LENGTH_SHORT).show();
				}
			}
		}
	}
}

  String.xml

 

< xml version="1.0" encoding="utf-8" >
<resources>
    <string name="hello">Hello World, Activity07!</string>
    <string name="app_name">文件搜索</string>
    <string name="showInput">输入关键字</string>
    <string name="toSearch">搜索</string>
    <string name="info">系统SDCard目录文件路径:\n</string>
    <string name="pleaseInput">请输入关键字!</string>
    <string name="notFound">SD卡中没有相关文件!!</string>
    <string name="pathError">读取路径出错!!</string>
</resources>

查看SD卡MP3下的文件列表

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

效果

 

 

 

Android常用功能实例如IMEI号

Android 屏幕显示设置

程序中默的显示是带有标题栏和系统信息栏的,有的时候,这很影响程序界面的美观。手机默认的是竖屏,或与感应器状态相关,为了某种效果,我们的程序需要限制使用横屏或竖屏。以下的代码就解决了上述问题。

//设置为无标题栏

requestWindowFeature(Window.FEATURE_NO_TITLE);

//设置为全屏模式

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

//设置为横屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Android Intent参数传递

当Activity与Activity/Service(或其它情况)有时与要进行参数传递,最常用也是最简单的方式就是通过Intent来处理。

看如下代码:

Intent intent = new Intent(...);
Bundle bundle = new Bundle();
bundle.putString("NAME", "zixuan");
intent.putExtras(bundle);
context.startActivity(intent); 或 context.startService(intent);

当然,有传送就有接收,接收也很简单,如:

Bundle bunde = intent.getExtras();
String name = bunde.getInt("NAME");

当然参数KEY要与传送时的参数一致。

Android 获取手机号/手机串号

在j2me中,根本没有办法获取用户的手机号码,就连获取手机串号(IMEI)都基本上无法实现,然后在android手机上一切都是如此的简单,看代码:

TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
String tel = tm.getLine1Number();

看来,android的确加速了j2me的消亡。

Android 振动器

总感觉手机上的振动器没有多大用处(当然静音模式下的振铃很有用),但还是顺带着说一下吧,只有两行代码:

1、获取振动服务的实例

Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

2、设置振动时长,单位当然也是ms

vibrator.vibrate(1000);

如果你觉得这样过去单调的话,可以设个节奏:

vibrator.vibrate(new long[]{10, 100, 20, 200}, -1);

两个参数,习惯告诉我第一个是节奏,第二个是重复次数,可事实并没有这么简单,我翻译不好,大家还是看原文吧:

public void vibrate (long[] pattern, int repeat)
pattern: an array of longs of times to turn the vibrator on or off.
repeat: the index into pattern at which to repeat, or -1 if you don't want to repeat.

google喜欢弄些技巧,我却觉得这里有点弄巧成拙了。

Android 闹钟

最近看了一下Android的闹钟管理类(AlarmManager),真不错误,强大又简单,代码如下:

1、建立一个AlarmReceiver继承入BroadcastReceiver,并在AndroidManifest.xml声明

public static class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "闹钟提示:时间到!", Toast.LENGTH_LONG).show();
}
}

2、建立Intent和PendingIntent,来调用目标组件。

Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

3、设置闹钟

获取闹钟管理的实例:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

设置单次闹钟:

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (5*1000), pendingIntent);

设置周期闹钟:

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10*1000), (24*60*60*1000), pendingIntent);

搞定!当然这里闹钟的响应处理只是用的文字,你可以播放声音,或都用更复杂的一系统通知,在这里你就是上帝,一切由你做主。

Android中ImageButton实现“按下”效果

 

使用Button的时候,实现“按下”的效果是很重要的,也是很常见的,主要有下面三种方式:

12种方式需要按下时和抬起时
两种图片,第3种方式通过改变颜色矩阵,从而改变图像的亮度,对比度,饱和度和色相等。

1)用java代码实现

 

imageButton.setOnTouchListener(new OnTouchListener(){     
                        @Override    
                        public boolean onTouch(View v, MotionEvent event) {     
                                if(event.getAction() == MotionEvent.ACTION_DOWN){     
                                        //更改为按下时的背景图片     
                                        v.setBackgroundResource(R.drawable.pressed);     
                                }else if(event.getAction() == MotionEvent.ACTION_UP){     
                                        //改为抬起时的图片     
                                        v.setBackgroundResource(R.drawable.released);     
                                }     
                                return false;     
                        }     
              });    

 

 

 

2)用xml配置文件实现,xml内容如下

 

< xml version="1.0" encoding="UTF-8" >    
<selector xmlns:android="http://schemas.android.com/apk/res/android">    
 <item           android:state_pressed="false"  android:drawable="@drawable/released " />    
<item           android:state_pressed="true"   android:drawable="@drawable/pressed" />    
<item           android:state_focused="true"    android:drawable="@drawable/pressed" />    
item           android:drawable="@drawable/released " />    
</selector>   

 

 

 

把上面的xml文件,命名为button_regist.xml放在drawable目录下,使用的方法如下:

 

<ImageButton    
 android:id="@+id/imageButton"    
 android:layout_width="wrap_content"    
 android:layout_height="wrap_content"    
 android:background="#00000000"    
 android:src="@drawable/button_regist " >    
</ImageButton> 

 

 

 

3)以上两种方式比较简单,但是需要很多的图片和布局文件,如果项目中的图片按钮比较多,那就很浪费资源。第三种方式使用矩阵颜色滤镜。

颜色过滤矩阵是一个4×5的矩阵, 四行分别是 红色通道值,绿色通道值,蓝色通道值和alpha通道值。五列分别是 对应通道的红色值,绿色值,蓝色值,alpha值和偏移量。

RGBAlpha的终值计算方法如下:

Red通道终值 = a[0] * srcR + a[1] * srcG + a[2] * srcB +
a[3] * srcA + a[4]

Green通道终值 = a[5] * srcR + a[6] * srcG + a[7] * srcB +
a[8] * srcA + a[9]

Blue通道终值 = a[10] * srcR + a[11] * srcG + a[12] *
srcB + a[13] * srcA + a[14]

Alpha通道终值 = a[15] * srcR + a[16] * srcG + a[17] *
srcB + a[18] * srcA + a[19]

备注:

srcR为原图Red通道值,srcG为原图Green通道值,srcB为原图Blue通道值,srcA为原图Alpha通道值。

每个通道的源值和终值都在0255的范围内。即使计算结果大于255或小于0,值都将被限制在0255的范围内。

实现代码如下:

 

/**   
	   * 按钮被按下  
	   */
private final static float[] BUTTON_PRESSED = new float[] {      
		  2.0f, 0, 0, 0, -50,      
	      0, 2.0f, 0, 0, -50,      
	      0, 0, 2.0f, 0, -50,      
	      0, 0, 0, 5, 0 };     
	       
	  /**   
	   * 按钮恢复原状   
	   */    
private final static float[] BUTTON_RELEASED = new float[] {      
	      1, 0, 0, 0, 0,      
	      0, 1, 0, 0, 0,      
	      0, 0, 1, 0, 0,      
	      0, 0, 0, 1, 0 };  
 
private static final OnTouchListener touchListener = new OnTouchListener() {
		
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			if(event.getAction() == MotionEvent.ACTION_DOWN) {
				v.getBackground().setColorFilter(new ColorMatrixColorFilter(BUTTON_PRESSED));
				v.setBackgroundDrawable(v.getBackground());
			}else if(event.getAction() == MotionEvent.ACTION_UP) {
				v.getBackground().setColorFilter(new ColorMatrixColorFilter(BUTTON_RELEASED));
				v.setBackgroundDrawable(v.getBackground());
			}
			return false;
		}
	};

public static void setButtonStateChangeListener(View v) {
		v.setOnTouchListener(touchListener);
	}

 

 

 

 

 

 

Activity设置全屏以及Android获得屏幕的宽和高

摘1:

Android程序中要设置全屏包括两个部分:

窗口全屏和Activity 全屏。窗口全屏 是指隐藏系统顶部用来显示时间、电量、信号等信息的。

标题栏,Activity全屏 是指隐藏程序的标题栏。我们可以在程序代码中设置,也可以通过修改AndroidManifest.xml文件来实现。

1. 修改程序代码

    我们需要在 Activity的onCreate方法中添加相应的代码。请注意代码的位置,要在setContentView()方法之前调用哦。

Java代码

public class Home extends Activity {    
   
    @Override   
    protected void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
        requestWindowFeature(Window.FEATURE_NO_TITLE);//不显示程序的标题栏    
        getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,WindowManager.LayoutParams. FLAG_FULLSCREEN);//不显示系统的标题栏    
        setContentView(R.layout.main);    
    }    
       
}   

public class Home extends Activity {        
protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                requestWindowFeature(Window.FEATURE_NO_TITLE);
//不显示程序的标题栏
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,WindowManager.LayoutParams. FLAG_FULLSCREEN);
//不显示系统的标题栏
setContentView(R.layout.main); 
       }  
     } 

2. 修改 AndroidManifest.xml

    我们可以修改<application>标签或<activity>标签的属性值来实现。他们的区别是修改<application>标签后所有的Activity都会全屏,而修改<activity>后只针对当前的Activity有效。注意:android:theme=”@android:style/Theme.NoTitleBar.Fullscreen”的位置,我在两处都设置上了,大家可以根据实际状况做出调整。

Xml代码

< xml version="1.0" encoding="utf-8" >   
<manifestxmlns:android="http://schemas.android.com/apk/res/android" 
      package="org.dw.enotes"   
      android:versionCode="1"   
      android:versionName="1.0">   
    <application android:icon="@drawable/icon"    
        android:label="@string/app_name"    
        <!-- 看这里 -->   
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen">   
   
        <activity    
            android:name=".activity.Hello"   
            android:label="@string/app_name"   
            <!-- 看这里 -->   
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen">   
            <intent-filter>   
                <action android:name="android.intent.action.MAIN" />   
                <category android:name="android.intent.category.LAUNCHER" />   
            </intent-filter>   
        </activity>            
    </application>      
    <uses-sdk android:minSdkVersion="4" />   

</manifest>    

    Android获得屏幕的宽度和高度很简单,只需在Activity中调用以下代码:    

Java代码

int screenWidth;//屏幕宽度    
int screenHeight;//屏幕高度    
WindowManager windowManager = getWindowManager();    
Display display = windowManager.getDefaultDisplay();    
   
screenWidth = display.getWidth();    
screenHeight = display.getHeight(); 

摘2:

一是在OnCreate中:

getWindow().setFlags(WindowManager.LayoutParams.NO_STATUS_BAR_FLAG, 
WindowManager.LayoutParams.NO_STATUS_BAR_FLAG);

 

二是在AndroidManifest.xml中:<activity

android:name=".MyActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">

第三种方法:全屏:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

取消全屏:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

前两种方法只能在初始化时决定全屏与否,第三种方法就可以在Activity运行过程中,动态地改变全屏与否

android动态全屏

zz浅谈android的selector,背景选择器

http://www.eoeandroid.com/thread-68469-1-1.html

最近做listview和button都要改变android原来控件的背景,在网上查找了一些资料不是很全,所以现在总结一下android的selector的用法。

首先android的selector是在drawable/xxx.xml中配置的。

先看一下listview中的状态:

把下面的XML文件保存成你自己命名的.xml文件(比如list_item_bg.xml),在系统使用时根据ListView中的列表项的状态来使用相应的背景图片。

drawable/list_item_bg.xml

< xml version="1.0" encoding="utf-8"  >   
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- 默认时的背景图片 -->  
  <item android:drawable="@drawable/pic1" />    
<!-- 没有焦点时的背景图片 -->  
  <item android:state_window_focused="false"   
        android:drawable="@drawable/pic1" />   
<!-- 非触摸模式下获得焦点并单击时的背景图片 -->  
  <item android:state_focused="true" android:state_pressed="true"   
        android:drawable= "@drawable/pic2" />  
<!-- 触摸模式下单击时的背景图片 -->  
  <item android:state_focused="false" android:state_pressed="true"   
        android:drawable="@drawable/pic3" />   
<!--选中时的图片背景  -->  
  <item android:state_selected="true"   
        android:drawable="@drawable/pic4" />   
<!--获得焦点时的图片背景  -->  
  <item android:state_focused="true"   
        android:drawable="@drawable/pic5" />   
</selector>

使用些xml文件:第一种是在listview中配置android:listSelector=”@drawable/list_item_bg

或者在listview的item中添加属性android:background=“@drawable/list_item_bg”即可实现,或者在java代码中使用:Drawable drawable = getResources().getDrawable(R.drawable.list_item_bg); 

       ListView.setSelector(drawable);同样的效果。

但是这样会出现列表有时候为黑的情况,需要加上:android:cacheColorHint=”@android:color/transparent”

使其透明。

其次再来看看Button的一些背景效果:

android:state_selected是选中

android:state_focused是获得焦点

android:state_pressed是点击

android:state_enabled是设置是否响应事件,指所有事件

根据这些状态同样可以设置button的selector效果。也可以设置selector改变button中的文字状态。

以下就是配置button中的文字效果:

drawable/button_font.xml

< xml version="1.0" encoding="utf-8" >
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:color="#FFF" />
    <item android:state_focused="true" android:color="#FFF" />
    <item android:state_pressed="true" android:color="#FFF" />
    <item android:color="#000" />
</selector>
Button还可以实现更复杂的效果,例如渐变啊等等。
drawable/button_color.xml
< xml version="1.0" encoding="utf-8" >
<selector xmlns:android="http://schemas.android.com/apk/res/android">         / 
        <item android:state_pressed="true">//定义当button 处于pressed 状态时的形态。 
              <shape> 
                     <gradient  android:startColor="#8600ff" /> 
                      <stroke   android:width="2dp" android:color="#000000" /> 
                       <corners android:radius="5dp" />  
                       <padding android:left="10dp" android:top="10dp" 
                                android:bottom="10dp" android:right="10dp"/>  
                 </shape> 
        </item> 
        <item android:state_focused="true">//定义当button获得 focus时的形态 
                 <shape> 
                       <gradient android:startColor="#eac100"/> 
                        <stroke android:width="2dp" android:color="#333333"  color="#ffffff"/> 
                         <corners android:radius="8dp" />   
                         <padding android:left="10dp" android:top="10dp" 
                                  android:bottom="10dp" android:right="10dp"/>                   
                </shape> 
            </item>
</selector>

     最后,需要在包含 button的xml文件里添加两项。假如是 main.xml 文件,

我们需要在<Button />里加两项。

     android:focusable=”true”

     android:backgroud=”@drawable/button_color”

这样当你使用Button的时候就可以甩掉系统自带的那黄颜色的背景了,实现个性化的背景,配合应用的整体布局非常之有用啊。

这些是个人的使用理解,如果各们大侠们有什么意见直接回复啊,有什么错误直接指出来,谢谢大家了。

转:LinearLayout布局


LinearLayout布局将自己的子元素按照一个方向排列,即水平排列或竖直排列。

几个xml属性

1,android:orientation

布局方向。horizontal是让所有的子元素按水平方向从左到右排列, vertical是让所有的子元素按竖直方向从上到下排列。

2,android:gravity 与 android:layout_gravity的区别

android:gravity是指定本元素的子元素相对它的对齐方式。

android:layout_gravity是指定本元素相对它的父元素的对齐方式。

例如:

下面这里的linearlayout的android:gravity设为right,有两个子元素Button01和Button02。

< 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:gravity=”right”
>
<Button android:text=”button01″ android:id=”@+id/Button01″ android:layout_width=”wrap_content” android:layout_height=”wrap_content”></Button>
<Button android:text=”button02″ android:id=”@+id/Button02″ android:layout_width=”wrap_content” android:layout_height=”wrap_content”></Button>
</LinearLayout>

下面是效果图,可以看到都居右了。

这个main.xml里的LinearLayout也是有两个子元素Button01和Button02。Button01的android:layout_gravity设为”left”,Button02的 android:layout_gravity设为”right”

< 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”

>

<Button android:layout_gravity=”left” android:text=”button01″ android:id=”@+id/Button01″ android:layout_width=”wrap_content” android:layout_height=”wrap_content”></Button>

<Button android:layout_gravity=”right” android:text=”button02″ android:id=”@+id/Button02″ android:layout_width=”wrap_content” android:layout_height=”wrap_content”></Button>

</LinearLayout>

下面是效果图,可以看到Button01居左,Button02居右。

 

androidLayoutParams简单说明理解示例

   简单说说 自己对 android LayoutParams的理解吧,xh写不出高级文章是低级写手。

public static class

ViewGroup.LayoutParams

extends Object

java.lang.Object

     android.view.ViewGroup.LayoutParams   //继承关系

以下说明摘自官方文档E文好的可以看看

Class Overview

LayoutParams are used by views to tell their parents how they want to be laid out. See ViewGroup Layout Attributes for a list of all child view attributes that this class supports.

The base LayoutParams class just describes how big the view wants to be for both width and height. For each dimension, it can specify one of:

FILL_PARENT (renamed MATCH_PARENT in API Level 8 and higher), which means that the view wants to be as big as its parent (minus padding)

WRAP_CONTENT, which means that the view wants to be just big enough to enclose its content (plus padding)

an exact number

There are subclasses of LayoutParams for different subclasses of ViewGroup. For example, AbsoluteLayout has its own subclass of LayoutParams which adds an X and Y value.

E文不好看不懂  但是觉得写得啰嗦了

其实这个LayoutParams类是用于child view(子视图) 向 parent view(父视图)传达自己的意愿的一个东西(孩子想变成什么样向其父亲说明)其实子视图父视图可以简单理解成

一个LinearLayout 和 这个LinearLayout里边一个 TextView 的关系 TextView 就算LinearLayout的子视图 child view 。需要注意的是LayoutParams只是ViewGroup的一个内部类 这里边这个也就是ViewGroup里边这个LayoutParams类是 base class 基类 实际上每个不同的ViewGroup都有自己的LayoutParams子类

比如LinearLayout 也有自己的 LayoutParams 大家打开源码看几眼就知道了

myeclipse 怎么查看源码 请看http://byandby.iteye.com/blog/814277

下边来个例子

       //创建一个线性布局
        private LinearLayout mLayout;   
        mLayout = (LinearLayout) findViewById(R.id.layout);   
       //现在我要往mLayout里边添加一个TextView 
      //你可能会想直接在布局文件里边配置不就O 了 那是 但是这里为了说明问题我们用代码实现
       TextView textView = new TextView(Activity01.this);   
            textView.setText("Text View " );
            //这里请不要困惑这里是设置 这个textView的布局 FILL_PARENT WRAP_CONTENT 和在xml文件里边设置是一样的如
   /**<TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Text View"/>*/
 //在xml里边怎么配置高宽大家都会的。
   //第一个参数为宽的设置,第二个参数为高的设置。
            LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(   
                    LinearLayout.LayoutParams.FILL_PARENT,   
                    LinearLayout.LayoutParams.WRAP_CONTENT   
            );   
            //调用addView()方法增加一个TextView到线性布局中
            mLayout.addView(textView, p);   
           //比较简单的一个例子

如果还不能理解下边在来一段直白的说明:

LayoutParams继承于Android.View.ViewGroup.LayoutParams.

LayoutParams相当于一个Layout的信息包,它封装了Layout的位置、高、宽等信息。假设在屏幕上一块区域是由一个Layout占领的,如果将一个View添加到一个Layout中,最好告诉Layout用户期望的布局方式,也就是将一个认可的layoutParams传递进去。

可以这样去形容LayoutParams,在象棋的棋盘上,每个棋子都占据一个位置,也就是每个棋子都有一个位置的信息,如这个棋子在4行4列,这里的“4行4列”就是棋子的LayoutParams。

但LayoutParams类也只是简单的描述了宽高,宽和高都可以设置成三种值:

1,一个确定的值;

2,FILL_PARENT,即填满(和父容器一样大小);

3,WRAP_CONTENT,即包裹住组件就好。

基本就这么多了,不要想的太复杂。

Android中ContentProvide

一.Conent Provider用来保存和检索数据,并且使应用程序之间相互访问数据成为可能,它是跨应用程序共享数据的唯一方法。

二.Android提供了应用程序之间访问的统一接口,这些接口被定义在ContentProvide中,包括添加,删除,修改和查询等操作。

例:我们要发送一条短信,可能要用到联系人应用程序,从而选择要发送的人。

三.Content Provider的常用方法:

   ContentProvide定义在android.content包下面。定义一个ContentProvide必须实现几个抽象的方法:

  query(uri,String[],String,String[],String)查询

  insert(Uri,ContentBValues)插入

  update(Uri,ContentValues,String,String[])更新

  delete(Uri,String,String)删除

  getType(Uri)获得MIME的数据类型

四.ContentResolver

  我们是在ContentProvide中实现我们实际操作数据的方法的,但是客户端调用时,我们用到了另外一个接口,它就是ContentResolver。ContnetResolver来操作ContentProvider的。

五.1.ContentProvider是通过对象来进行共享数据

   2.一个URI对象必须以”content://”开头,接下来为URI的授权部分,这个部分内容要和androidMainifest.xml配置文件中声明的授权内容一致,后面还有可能数据类型和记录Id。通过URI可以使得ContentResolver知道和那个ContentProvider对应,并且来操作那些表以及那个记录。

content://com.example.transportationprovider/trains//122

六.创建ContentProvide的步骤:

1.创建保存数据的文件或数据库

2.定义一个类继承ContentProvide。实现抽象方法

3.将定义好的ContentProvider在AndroidMainf.xml配置文件中声明。