`
zhangfy068
  • 浏览: 144326 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android 学习笔记(持续更新)

阅读更多

1、弹提示信息

 

Toast.makeText(act, "短信发送完成", Toast.LENGTH_LONG).show();

 

2、发送短信

 

SmsManager smsManager = SmsManager.getDefault();
		PendingIntent sentIntent = PendingIntent.getBroadcast(act, 0,
			new Intent(), 0);
		smsManager.sendTextMessage(addressStr, null, contentStr
			, sentIntent, null);
		Toast.makeText(act, "短信发送完成", Toast.LENGTH_LONG).show()

 

 

3、监听器实现方法

一、implements OnClickListener   实现该接口,然后实现方法

二、匿名实现

 

bn.setOnClickListener(new OnClickListener()
		{
			//实现事件处理方法
			@Override
			public void onClick(View v)
			{
				// TODO Auto-generated method stub
				show.setText("bn按钮被单击了!");
			}			
		});

 

 三、配置实现

 

<!-- 在标签中为按钮绑定事件处理方法 -->
<Button
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content" 
	android:text="单击我"
	android:onClick="clickHandler"
	/>	

 

四、自定义listerner

class MyClickListener implements View.OnClickListener

  4、Configuration 用于描述手机上的配置信息

 

Configuration config = getResources().getConfiguration();

 

 5、handler

android不允许在子线程中更新界面组件。使用Handler 更改组件信息

 handler不应该在子线程中创建,应该在全局变量中定义。

//定义一个计时器,让该计时器周期性地执行指定任务

		final Handler myHandler = new Handler()
		{
			@Override
			public void handleMessage(Message msg)
			{
				//如果该消息是本程序所发送的
				if (msg.what == 0x1233)
				{
					//动态地修改所显示的图片
					show.setImageResource(imageIds[currentImageId++]);
					if (currentImageId >= 4)
					{
						currentImageId = 0; 
					}
				}
			}
		};
new Timer().schedule(new TimerTask()
		{
			@Override
			public void run()
			{
				//新启动的线程无法访问该Activity里的组件
				//所以需要通过Handler发送信息
				Message msg = new Message();
				msg.what = 0x1233;
				//发送消息
				myHandler.sendMessage(msg);
			}
		}, 0 , 800);

 

 

  5、获取raw目录下文件大小

 

InputStream ins = context.getResources().openRawResource (R.raw.video)
int videoSize = ins.available();

 

这种写法没用

            Uri filePath = Uri.parse("android.resource://com.android.FileTransfer/" + R.raw.video);
    File videoFile = new File(filePath.getPath());

 

 mWebView.loadUrl("file://sdcard/index.html");

 

6、预定义样式

http://www.cnblogs.com/hnrainll/archive/2012/05/18/2507378.html

 

7、Android Unable to resolve target 'android-8'

http://blog.163.com/jenny_tyb/blog/static/208669106201272922654303/

 

8、width与layout_width区别

width指控件中文本的格式,layout_width注重的是控件与父控件之间的关系。。。想想小盒模型

 

9、spinner使用方法

其实就是个下拉列表,需要设置一个adapter,有点类似listView,可以使用arrayAdapter也可以自行写一个adapter扩展BaseAdapter。

http://blog.csdn.net/xu_song/article/details/7700089

 

 /** 
     * 将drawable转换成bitmap 
     *  
     * @param drawable 
     * @return Bitmap 
     */  
    private static Bitmap drawableToBitmap(Drawable drawable) {  
        // 取drawable的长宽  
        int width = drawable.getIntrinsicWidth();  
        int height = drawable.getIntrinsicHeight();  
        Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; // 取drawable的颜色格式  
  
        Bitmap bitmap = Bitmap.createBitmap(width, height, config);  
        Canvas canvas = new Canvas(bitmap);  
        drawable.setBounds(0, 0, width, height);  
        drawable.draw(canvas);  
        return bitmap;  
    }  
  
    /** 
     * 单位转换:dip => px 
     *  
     * @param ctx 上下文环境 
     * @param dipValue 
     * @return 
     */  
    public static int dip2px(Context ctx, int dipValue) {  
        final float scale = ctx.getResources().getDisplayMetrics().density;  
        return (int) (dipValue * scale);  
    }  

 10、自定义menuOption,使用此方法拦截。

public boolean onMenuOpened(int featureId, Menu menu) {
		if (menuDialog == null) {
			menuDialog = new AlertDialog.Builder(this).setView(menuView).show();
		} else {
			menuDialog.show();
		}
		return false;// 返回为true 则显示系统menu
	}

 11、SimpleAdapter 的用法

  public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
            int resource, String[] from, int[] to)

 第二个参数是数据,一般设置为HashMap,每个listView的数据对象。。第三个参数,为布局文件,第四个参数,表示hashmap对象的参数,第五个参数为对象布局文件中的ViewId

ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
		for (int i = 0; i < menuNameArray.length; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("itemImage", imageResourceArray[i]);
			map.put("itemText", menuNameArray[i]);
			data.add(map);
		}
		SimpleAdapter simperAdapter = new SimpleAdapter(this, data,
				R.layout.item_menu, new String[] { "itemImage", "itemText" },
				new int[] { R.id.item_image, R.id.item_text });
		return simperAdapter;

 

如果一个Activity只需要一个列表,可用ListActiviy来使用,不需要配置布局文件

package com.example.listviewscroll;

import java.util.Timer;
import java.util.TimerTask;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.ListActivity;
import android.database.DataSetObserver;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;

public class MainActivity extends ListActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
//		setContentView(R.layout.activity_main);
		String str[]=new String[20];
		for(int i=0;i<str.length;i++){
			str[i]="item "+i;
		}
		ArrayAdapter<String> aa=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, str);
		setListAdapter(aa);
		
			}
	
	


}

 

12、获取array数组配置文件的值

//获取相应对象
String[] ls=getResources().getStringArray(R.array.action);

 13、spinner的用法

Q:同样的配置代码,为什么有的下拉选项有一个单选按钮,而自己写的就诶呦捏?貌似也不是android version问题。

 

 list.add("北京1");
        list.add("上海2");
        list.add("深圳3");
        list.add("南京4");
        list.add("重庆");
        mySpinner = (Spinner)findViewById(R.id.spinner1);
        //第二步:为下拉列表定义一个适配器,这里就用到里前面定义的list。
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list);
        //第三步:为适配器设置下拉列表下拉时的菜单样式。
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        //第四步:将适配器添加到下拉列表上
 mySpinner.setAdapter(adapter);

 14、可用View来做分割线

<View  android:layout_width="fill_parent" android:layout_height="1dip" android:background="?android:attr/listDivider"/>

 15、ListView

一般把listView中ItemView单独配置成一个配置文件。

 

16、时间设置

    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case 1:
//监听器
                return new TimePickerDialog(this,
                        mTimeSetListener, mHour, mMinute, false);
            case 2:
                return new DatePickerDialog(this,
                            mDateSetListener,
                            mYear, mMonth-1, mDay);
        }
        return null;
    }

 17、shape的使用

可以用来修改,组件的corner圆角

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

 

18、滑动界面效果ViewPager,ViewFlipper ,Gallery

ViewPager是3.0+之后才有的,用之前的版本需要添加一个android.v4_support.jar

http://www.cnblogs.com/bill-joy/archive/2012/04/09/2438688.html

ViewFlipper 可以设置间隔时间让他自动切换,如果需要滑动手势需要监听,

ViewPager   设置自定义一个PagerAdapter。可以通过滑动手势翻页。

setCurrentItem();

 

19、popWindow使用

可以悬浮出一个窗口。

	public void showPopupWindow() 
	{
		Context mContext = PopupWindowDemo.this;
		LayoutInflater mLayoutInflater = (LayoutInflater) mContext
				.getSystemService(LAYOUT_INFLATER_SERVICE);
		View music_popunwindwow = mLayoutInflater.inflate(
				R.layout.music_popwindow, null);
		mPopupWindow= new PopupWindow(music_popunwindwow,
				LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
		//设置显示位置
		mPopupWindow.showAtLocation(findViewById(R.id.main), Gravity.CENTER, 0, 0);
		//mPopWindow上其他的组件
		img=(ImageButton)music_popunwindwow.findViewById(R.id.control_play);
	    img.setOnClickListener(new View.OnClickListener() 
	    {
			
			@Override
			public void onClick(View v)
			{
				secondPop();
			}
		});
	  }

 

http://trinea.iteye.com/blog/1461095

 

20、

LayoutInflater inflater = LayoutInflater.from(this);
        LinearLayout header = (LinearLayout)inflater.inflate(R.layout.categoryheader, null);

 

21、物理返回键,返回上一个Activity

默认会调用这个函数onBackPressed()

Activity A startActiviy(this,B),A调用pause,

B中按返回键,默认是finish当前Activity B,返回到上一个activityA

保证按返回的时候,不会finish当前Activity即可。

将每个activity的属性中增加 android:launchMode="singleInstance" 

 

 22、滑动抽屉的使用

SlidingDrawer should be used as an overlay inside layouts. This means SlidingDrawer should only be used inside of a FrameLayout or a RelativeLayout for       instance

api 17之后过时了

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

例子

http://676744379-qq-com.iteye.com/blog/1125147

1:handle: 点击的按钮

2:content:展开的内容

      sd.setOnDrawerOpenListener(new OnDrawerOpenListener() {			
			@Override
			public void onDrawerOpened() {
				im.setImageResource(R.drawable.right);
				
			}
		});
        // 设置SlidingDrawer被关闭的事件处理
        sd.setOnDrawerCloseListener(new OnDrawerCloseListener() {			
			@Override
			public void onDrawerClosed() {
				im.setImageResource(R.drawable.left);
			}
		});

 

 

23、获取手机多媒体数据库

http://aijiawang-126-com.iteye.com/blog/602921

 private List<MusicData> getMusicFileList()
    {
    	List<MusicData> list = new ArrayList<MusicData>();
    
    	
    	String[] projection = new String[]{MediaStore.Audio.Media._ID, 
    									MediaStore.Audio.Media.TITLE, 
    									MediaStore.Audio.Media.DURATION,
    									MediaStore.Audio.Media.DATA,
    									MediaStore.Audio.Media.ARTIST};   
    	
    	long time1 = System.currentTimeMillis();
    	//获取歌曲的信息	
    	Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI , projection, null, null, null);
    	if (cursor != null)
    	{
    		cursor.moveToFirst();

		    int colNameIndex = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
            int colTimeIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DURATION);
            int colPathIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
            int colArtistIndex = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
            
         
            int fileNum = cursor.getCount();  
            for(int counter = 0; counter < fileNum; counter++){        
                
                MusicData data = new MusicData();
                data.mMusicName = cursor.getString(colNameIndex);
                data.mMusicTime = cursor.getInt(colTimeIndex);
                data.mMusicPath = cursor.getString(colPathIndex);
                data.mMusicAritst = cursor.getString(colArtistIndex);
                
                list.add(data);
                cursor.moveToNext();
            }
            
            cursor.close();
    	}
    	long time2 = System.currentTimeMillis();
    	
    	Log.i(TAG, "seach filelist cost = " + (time2 - time1));
    	return list;
    }

   

 24、水平滚动

http://blog.csdn.net/pathuang68/article/details/6561380

 

+ ScrollView只能包含一个直接子view,这是因为ScrollView是FrameLayout的派生类,通常情况下,这个直接子view是一个LinearLayout,在直接子view(比如LinearLayout)中,可以再包含其他对象。

 +ScrollView只支持垂直滚动。

+HorizontalScrollView除只支持水平滚动外,其他都和ScrollView一样。

+如果要屏幕支持垂直滚动和水平滚动,那么就要让HorizontalScrollView作为ScrollView的直接子view,或者让ScrollView作为HorizontalScrollView的直接子view。

 

1、获取直接子view

 LinearLayout parent=(LinearLayout) getChildAt(0);

2、增加view

   parent.addView(children[i]);

3、增加全局视图监听器

 class MyOnGlobalLayoutListener implements OnGlobalLayoutListener

 getViewTreeObserver().addOnGlobalLayoutListener(listener);

 

4、添加子view 

parent.addView(children[i], dims[0], dims[1]);

 //这样写就完全透明了,一个透明的TextView啊。。

  View transparent = new TextView(this);

25、Android中dip, dp, px, sp的区别

 

http://blog.csdn.net/chenji001/article/details/6018780

 

26、手势监听

1、activity中复写onTouch,如果这个滑动时间被gestureDetector处理了,返回true。

   public boolean onTouchEvent(MotionEvent event)
	   {	
	       if (gestureDetector.onTouchEvent(event))
	           return true;
	       else
	           return false;
	   }

 2、

 // 实例化
        SampleGuest gestureListener = new SampleGuest(this);  
        gestureDetector = new GestureDetector(gestureListener); 

 3、

public class SampleGuest implements OnGestureListener

步骤操作在activity中捕获,然后在自定中回调手势事件。 

 

http://edison-cool911.iteye.com/blog/695163 

 

4、自定义ArrayListAdapter的使用

 http://zhangfy068.iteye.com/admin/blogs/1822515

 

27、盒子模型



 

 

28、service详解

http://android.blog.51cto.com/268543/527314

 

29、获取目录下资源

1、可以使用反射,获取资源的R.drawer.id

try{

  Field field=R.drawable.class.getField(type);

  int i= field.getInt(new R.drawable());

  Log.d(tag,i+"");

  return i;

}catch(Exception e){

  Log.e(tag,e.toString());

  return R.drawable.unknow;

}

 

http://blog.csdn.net/kmyhy/article/details/6583804

 30、AIDL的使用

1、为了实现跨进程远程调用接口。

2、服务端创建一个Service 然后实现该接口,书写方法时,每个参数必须指定in或out来表明它是输入参数还是输出参数。 

private ITestService.Stub binder = new Stub(){}

3、

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		mContext = this;
		return binder;		//返回AIDL接口实例化对象
	}

 4、客户端绑定该Service

//创建远程调用对象
	private ServiceConnection connection = new ServiceConnection(){

		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			//从远程service中获得AIDL实例化对象
			tService = ITestService.Stub.asInterface(service);
			System.out.println("Bind Success:"+tService);
		}
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			tService = null;
		}
	};

 5、客户端调用

public void onClick(View v) {
		// TODO Auto-generated method stub
		int viewId = v.getId();
		try{
			if (viewId == btn.getId()){
				
				Intent service = new Intent(ITestService.class.getName());
				//绑定AIDL
				bindService(service, connection, BIND_AUTO_CREATE);
			}else if (viewId == btn1.getId()){
				text.setText("远程结果:"+tService.getAccountBalance());
			}else if (viewId == btn2.getId()){
				List<String> names = new ArrayList<String>();
				names.add("李彬彬");
				tService.setOwnerNames(names);
			}else if (viewId == btn3.getId()){
				String[] customerList = new String[1];
				tService.getCustomerList("向华", customerList);
				text.setText("远程结果:"+customerList[0]);
			}else if (viewId == btn4.getId()){
				tService.showTest();
			}
		}catch(RemoteException e){
			e.printStackTrace();
		}
	}

 

6、参考资料http://www.iteye.com/topic/655866

 

31、style和Theme

style   在/res/values 中定义<resource><style.../></resource>

可以继承parent,用于单个view的样式,类似HTML中CSS

Theme 与style一样定义,,但是theme作用于整个activity 。。。

用法context.setTheme(..) 或在配置文件中

style所有的属性都在android.R.attr中。

 

 

 32、当前时间的获取

private String getDate(){
    	Date date = new Date();
    	Calendar c = Calendar.getInstance();
    	c.setTime(date);
    	String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
    	int w = c.get(Calendar.DAY_OF_WEEK) - 1 ;
    	if (w < 0) {
			w = 0;
		}
    	String mDate = c.get(Calendar.YEAR)+"年" + c.get(Calendar.MONTH) + "月" + c.get(Calendar.DATE) + "日  " + weekDays[w];
    	return mDate;
    }

 33、任意位置显示对话框

下面是设置对话框x的偏移量。

1 int marginLeft = 100;
2     Window window = getDialog().getWindow();
3         WindowManager.LayoutParams wmlp =window.getAttributes();
4         wmlp.gravity = Gravity.LEFT;
5         wmlp.x = marginLeft;
6         Log.i(getTag(), "wmlp="+wmlp);
7         window.setAttributes(wmlp);

值得注意的是: 我们要看看WindowManager.LayoutParams的文档中关于x,y属性的说明:

 

01 /**
02          * X position for this window.  With the default gravity it is ignored.
03          * When using {@link Gravity#LEFT} or {@link Gravity#START} or {@link Gravity#RIGHT} or
04          * {@link Gravity#END} it provides an offset from the given edge.
05          */
06         @ViewDebug.ExportedProperty
07         public int x;
08          
09         /**
10          * Y position for this window.  With the default gravity it is ignored.
11          * When using {@link Gravity#TOP} or {@link Gravity#BOTTOM} it provides
12          * an offset from the given edge.
13          */
14         @ViewDebug.ExportedProperty
15         public int y;

 

重要的两点就是:

 (1)如果你需要设置x的值,那么需要将gravity设置有LEFT,START,RIGHT或者END。

  (2)如果你需要设置y的值,那么需要将gravity设置成有TOP,BOTTOM。

上面的两点,如果你的对FrameLayout设置的margin不起作用了,可能也是需要遵守上面两点规则。

 

转(http://my.oschina.net/banxi/blog/102995

 

 

34.检测网络连接状态.

  (1 ) 首先确保配置了相应权限.使用如下权限:

 

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

 

  (2)检测的网络连接状态的示例代码

01 private boolean checkNetwork() {
02     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
03     NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
04     if (networkInfo == null || !networkInfo.isAvailable()) {
05         // showDialog
06         return false;
07  
08     } else if (networkInfo.getType() != ConnectivityManager.TYPE_WIFI) {
09         Toast.makeText(this, "当前网络连接使用手机流量!,建议使用Wifi!", Toast.LENGTH_LONG);
10     }
11  
12     return true;
13 }

 35、软键盘的开关

http://blog.csdn.net/pilou5400/article/details/5954905

 

36、再按一次退出程序

 

@Override
	//如果是继承Activity可以用这种办法
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		System.out.println("keyDown...........");
		if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
 		finish(); 
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}
	

 

 

		//如果是继承GroupActivity的话,比如TabActivity需要用这种方法实现,onKeyDown居然不会被回调、如果连续二次按返回键时间差小于二秒则退出。
		
 		long exitTime = 0; 
		public boolean dispatchKeyEvent(KeyEvent event) { 
		
		 System.out.println(KeyEvent.KEYCODE_BACK+"--------------------"+event.getKeyCode()+" "+exitTime+"---------------------"+event.getAction()); 
		 if(event.getKeyCode()==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_DOWN){ 
		 if((System.currentTimeMillis()-exitTime) > 2000){ 
		 Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); 
		 exitTime = System.currentTimeMillis(); 
		 } else { 
		 finish(); 
		 exitTime=System.currentTimeMillis();
		 System.exit(0); 
		 } 
		 return true; 
		 } 
		 return super.dispatchKeyEvent(event); 
		 } 

 37、设置全屏。横屏

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置成全屏模式 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//强制为横屏 

 

res/color/目录下

 

4、背景色根据状态更改颜色 android:backgroup

复制代码
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true"><shape>

            <gradient android:angle="0" android:centerColor="#00a59f" android:endColor="#00a59f" android:startColor="#00a59f" />
        </shape></item>
    <item android:state_focused="true"><shape>
            <gradient android:angle="0" android:centerColor="#00a59f" android:endColor="#00a59f" android:startColor="#00a59f" />
        </shape></item>
    <item android:state_pressed="true"><shape>
            <gradient android:angle="0" android:centerColor="#00a59f" android:endColor="#00a59f" android:startColor="#00a59f" />
        </shape></item>
    <item><shape>
            <gradient android:angle="0" android:centerColor="#00ff00" android:endColor="00ff00" android:startColor="00ff00" />
        </shape></item>

</selector>

复制代码

 如果直接给背景色color会报错。

 

5、启动APK的默认Activity

复制代码
    public static void startApkActivity(final Context ctx, String packageName) {
        PackageManager pm = ctx.getPackageManager();
        PackageInfo pi;
        try {
            pi = pm.getPackageInfo(packageName, 0);
            Intent intent = new Intent(Intent.ACTION_MAIN, null);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);
            intent.setPackage(pi.packageName);

            List<ResolveInfo> apps = pm.queryIntentActivities(intent, 0);

            ResolveInfo ri = apps.iterator().next();
            if (ri != null) {
                String className = ri.activityInfo.name;
                intent.setComponent(new ComponentName(packageName, className));
                ctx.startActivity(intent);
            }
        } catch (NameNotFoundException e) {
            Log.e("startActivity", e);
        }
    }
复制代码

 

7、计算字宽

 

    public static float GetTextWidth(String text, float Size) {
        TextPaint FontPaint = new TextPaint();
        FontPaint.setTextSize(Size);
        return FontPaint.measureText(text);
    }

 

 

注意如果设置了textStyle,还需要进一步设置TextPaint。 

 

 

 38、绘制提醒数字

自定义一个MyView重写onDraw()方法,,注意在布局文件中配置自定义View。构造函数需要是有AttributeSet否则会抛出异常。

 

package com.flysnow.icon.notification; 

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;

/** 
 * @author 作者 :FFish Zhang 
 * @version 创建时间:2013-4-8 下午3:17:51 
 * 类说明 
 */
public class MyView extends Button{
	int contacyCount=0;
	long start;
	Handler handler;
	 public MyView(Context context,AttributeSet attr)     
	    {     
		
	        super(context,attr);     
	        handler=new Handler(){
	        	@Override
	        	public void handleMessage(Message msg) {
	        		// TODO Auto-generated method stub
	        		invalidate();
	        	}
	        };
	        Thread thread=new Thread(new Runnable() {
				@Override
				
				public void run() {
					while(true){
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						contacyCount++;
						handler.sendEmptyMessage(0);
					}
					// TODO Auto-generated method stub
					
				
				}
			});
			thread.start();
	    } 
	
	public MyView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		Rect rect=getBackground().getBounds();
		super.onDraw(canvas);
		Paint countPaint=new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DEV_KERN_TEXT_FLAG);
    	countPaint.setColor(Color.RED);
    	countPaint.setTextSize(20f);
    	countPaint.setTypeface(Typeface.DEFAULT_BOLD);
    	canvas.drawText(String.valueOf(contacyCount), rect.width()-18, 25, countPaint);
	}
	
	

}
 

 

 

  public void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)

意义从原图片上取一个src大小的矩形,绘制到画布上dst上这个位置。

BitmapDrawable bd=(BitmapDrawable) getResources().getDrawable(R.drawable.lufei);
    		Rect src=new Rect(0,0,100,100);
        	Rect dst=new Rect(50,50,300,300);
        	canvas.drawBitmap(bd.getBitmap(), src, dst, countPaint);

 

 下载文件到手机自身内存中,而不是SD卡中

 

Context.getFilesDir(),


内部存储路径为/data/data/youPackageName/,下面讲解的各路径都是基于你自己的应用的内部存储路径下。所有内部存储中保存的文件在用户卸载应用的时候会被删除。


Context.getFilesDir(),该方法返回/data/data/youPackageName/files的File对象

 

 扩展栏的应用

  1.      // Set up our adapter  
  2.         mAdapter = new SimpleExpandableListAdapter(  
  3.                 this,  
  4.                 groupData,  // 存储父list的数据  
  5.                 android.R.layout.simple_expandable_list_item_2, //父list的现实方式  
  6.                 new String[] { NAME,IS_EVEN},                    // 父list需要显示的数据  
  7.             new int[] { android.R.id.text1,android.R.id.text2}, // 父list的数据绑定到的view  
  8.                 childData,                                      //子list的数据  
  9.                 android.R.layout.simple_expandable_list_item_2,  //子list的显示
  10.                 new String[] { NAME, IS_EVEN },  
  11.                 new int[] { android.R.id.text1, android.R.id.text2 }  
  12.                 );  
  13.         setListAdapter(mAdapter);  
  14.     }  

或参考代码

http://zhangfy068.iteye.com/admin/blogs/1858767

 

强制退出APP进程

 Log.e("kill", "kill-Process");
        方法一:
        android.os.Process.killProcess(android.os.Process.myPid());
        方法二:
        System.exit(0);

 

applyDimension的作用是:根据当前的分辨率把pix 转化为 dip

int padding = (int) TypedValue.applyDimension(
     TypedValue.COMPLEX_UNIT_DIP, 40, getActivity()
       .getResources().getDisplayMetrics());
   text.setPadding(padding, padding, padding, padding);

 

@表示引用资源

@android:string表明引用的系统的(android.*)资源
@string表示引用应用内部资源
对于id, 可以用@+id表明创建一个id

?表示引用属性

 

“?”引用主题属性,当您使用这个标记,你所提供的资源名必须能够在主题属性中找到,因为资源工具认为这个资源属性是被期望得到的,您不需要明确的支出他的类型(?android:attr/android:textDisabledColor

 

  • 大小: 42.3 KB
  • 大小: 29.5 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics