UI
Layout
Common Layout
Adapter Layout
InputControls
Button
TextFields
CheckedBox RadioButton
SeekBar ProgressBar RatingBar
InputEvents
UI Commons
ActionBar
Dialog
Notification
Toast
App Resotuces
drawable
values
layout
menu
xml`
Animation Animator
特效
Drawable Canvas
消息模型API方法总结
Message
obj what arg1 arg2 target callable
obtain()
sendToTarget()
MessageQueue
Looper
prepare()
myLooper()
getMainLooper()
loop()
quit()
Handler
sendMessage
sendEmptyMessage
反射:
得到drawable中的信息 可以采用 反射 先得到类对象 再通过类对象获得文件的名字 通过判定文件名的结束为.png
从而通过 f.getInt(类对象) 得到图片的 id 添加到list集合 再通过 adapter 将图片显示到 view 中
Class<?> cla=MainActivity.class
案例:
sv为 searchView;
Class<?> c=sv.getClass();
Field f=c.getDeclaredField("mQueryTextView");通过值 得到值对应的属性
f.setAccessible(true); 因为此属性不可见 所以要进行此操作
AutoCompleteTextView actv=(AutoCompleteTextView) f.get(sv); 得到 此对象的 这个属性的对象 通过此对象来 控制 属性的值
actv.setTextColor(Color.RED); 类 AutoCompleteTextView 通过继承关系找到
AutoCompleteTextView
一个字符开始检索 就是 与输入的 那一个字符相同的 数组 全部 提示出来 acltv.setThreshold(1);
监听事件:acltv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new String[]{"aa","ab","aa1"}));
EditText
android:ems="10"
android:inputType="text"
android:imeOptions="actionSearch"
android:imeOptions="actionSend"
监听:
e1.setOnEditorActionListener(this); 实现接口 重写方法
onEditorAction()
划线:canvas.drawLine(0, getHeight()-2, getWidth(), getHeight()-2, p); 自定义view
searchView
设置对象的监听 sv.setOnQueryTextListener();实现接口 重写方法
sv.onActionViewExpanded()
onQueryTextChange(String newText) 数据发生改变时 就执行 也就是说 一直在监听的状态 参数为当前获得的 输入框中的输入的内容
检索采用此方法 比较 的语句为 :
adapter.getFilter().filter(NewText);
onQueryTextSubmit() 当点击 确定是 才调用 才执行
另一种形式:
int i=getResources().getIdentifier("android:id/search_plate", null, null);
LinearLayout ll=(LinearLayout) sv.findViewById(i);
ll.setBackgroundResource(R.drawable.sss);
TextView的监听
tv.setOnTouvhListener();实现接口 重写方法
onTouch()
event.getAction()==MotionEvent.ACTION_DOWN
ViewStub
延迟加载
当点击其他按钮时 调用 vs.inflate()方法 开启vs
android:id="@+id/vs1" vs的id
android:inflatedId="@+id/panel111111" 必须要设定的 但是id值随意
android:layout="@layout/progressbar" 调用布局文件 布局文件中添加的是 要加载的 文件例如progressBar
ProgressBar
将ProgressBar加载到布局中 通过 View 展现 将 此view 加载到 ListView 的 最顶端 或最低端
View a=View.inflate(this, R.layout.shuaxin, null);
getListView().addFooterView(a);
getListView().addHeaderView(a);
ListView
android:divider="#ff999999"
android:dividerHeight="2dp"
android:listSelector="@drawable/cai"
lv.setOnItemClickListener()实现接口 重写方法
onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
listview中存放的item中的list<String>的数据的类型 即为返回值类型
String s=(String)arg0.getItemAtPosition(arg2);
ListActivity 中的ListView
中采用setListAdapter() 来关联 adapter 其中有自己的 listview 所以自己不必定义
可以通过 获得getListView() 获得 ListView 对象
直接重写
OnListItemClick(ListView l,
View v, //v指向item view
int position, long id)方法 设置ListView的 点击事件
l.getItemAtPosition(position);
会直接显示到 布局文件中
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); //设置选择模式为 多选
SimpleAdapter
最烦人了 参数要求麻烦
案例:new SimpleAdapter(this,
list, //必须是Map《String , ?》 类型的list的集合 可以通过 解析xml获得
R.layout.buju, //每个item 的布局
new String[]{"title","content","image"}, 每个map对象中均存在三组数据
new int[]{R.id.textView1,R.id.textView2,R.id.imageView1}); 将获得的对应的数据 存放到对应的 item 中的 相应的idshang
Adapter
创建view时 若存在 imageView 可以采用
iv.setImageURI(Uri.fromFile(new File(u.getI()))); 将图片添加到 布局中
ArrayAdapter
布局中存在 textView 和 Button 时
定义一个类 继承 arrayadapter
在创建时 创建 新类的 类的对象
通过list 先给 TextView 赋值 然后 在新类中重写getView 方法 继续使用 父类的 方法 在父类的getView 方法的基础上 通过id 获得 Button
然后给button 添加点击事件 删除对应的信息啦
再添加 点击事件时 需要将 button 此个item 的 position进行绑定 或者 在方法中 定义一个新的 变量 给其赋值为 position
并定义为 final 类型的 在匿名内部类中才可以进行访问
list.remove(positon);
刷新listView; NotifyDateSetChanged();
联系人列表的右侧的 26个英文字母的
导航栏 采用ListView 背景设置为 点击背景
android:listSelector="@drawable/dianji2" dianji2未设置的 drawable引用 shap 圆 设置了 半径和颜色
将26个英文字母 添加到 adapter 对应的 item中 采用下列代码可以直接将 String——array 中的 name为 nav 的 中的item中的数据读出 布局采用haha
ArrayAdapter.createFromResource(this, R.array.nav,R.layout.haha);
设置ListView的点击事件 当点击时 得到对应的item中的 值 将值传给 联系人列表的 排序方法
(就是迟到的那天老师讲的那个方法 分块 只显示 首字母相同的为一个快 只显示 最前面的 那个 item中的textView 其他的都隐藏
就是在调用了 排序后 在 adapter中 建立 item时 比较 该item中的用户名字 的首字母 是否和 以前的item中的名字的首字母相同的
若没有相同的就将 该item中的 TextView 显示出来 否则就将 item中的 TextView 隐藏并且还不占用空间 )
调用此方法 获得 第一个 首字母 与自己的相同的 item 的 position
将 zhegeposition 对应的 item 展示到 联系人 列表的最顶端 采用的方法为 :
getListView().setSelectionFromTop(positon,30);据顶端的距离为 30dp
取得name的 首字母 转换为大写
vh.tt1.setText(String.valueOf(u.getN().toUpperCase().charAt(0)));
vh.tt1.setVisibility(View.VISIBLE);//显示
vh.tt1.setVisibility(View.GONE);//不占用空间 隐藏
android:divider="@null" 不用分隔线 导航栏
ExpandableListView
设置 组展开
explv.expandGroup(0);
setadapter() ;adapter 必须继承 BaseExpandableListAdapter
group[2]
child[2][]; 有几个组 child中 就应该有几个对应的 一维数组
表示返回的id是否是稳定 相同的id假如指向的元素永远是相同的那么就是稳定
@Override
public boolean hasStableIds() {
return false;
}
表示子元素是否可被点击,为true表示可以
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
重写方法
public boolean onChildClick() 设置 组中元素 即 child 的点击事件
Spinner
下拉选择框 默认选中的是 arrayadapter 中 字符串数组的 第一个值
得到选框中得值
s.getSelectedItem()
Toast
中的 context 可以是:getApplicationContext();
ViewPager
instantiateItem()创建 item 将图片添加到 布局
destroyItem() 移除文件
onSizeChanged()得到当前布局的 宽 高
invalidate();重绘 会调用 onDraw()方法;
vp.setOnPageChangeListener(this);//事件监听 实现接口 重写相应方法
onPageScrollStateChanged() 页面开始改变时执行一次
onPageScrolled(int arg0, float arg1(偏移量), int arg2) //一直在执行
onPageSelected () 页面改变完成后 执行一次
attars
TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.Caicai);
r=ta.getInteger(R.styleable.Caicai_r, 5);
yeshu=ta.getInteger(R.styleable.Caicai_yeshu, 1);
color=ta.getColor(R.styleable.Caicai_color, Color.parseColor("#ff00ff00"));
Paint
Paint p=new Paint(Paint.ANTI_ALIAS_FLAG); 消除锯齿
p.setColor(Color.GREEN); 设置颜色
p.setStyle(Style.STROKE); 设置 画的圆的样式 空心圆 实心圆 还是 圆环
View v (补LineraLayout)
LinearLayout.LayoutParams llp=new LinearLayout.LayoutParams(10, 10);
llp.leftMargin=5;
v.setLayoutParams(llp);
Java
v.setBackgroundResource(R.drawable.huadong);
v.setEnabled(false);
//设置 此view 为 false 这是与 drawable.huadong 有关的 huadong中的 item 中 state_enabled为
false 时 和 为 true 是 背景色不同 用于显示不同的 颜色
l.addView(v) //可以添加 View
l(LinearLayout).getChildAt(0).setEnabled(true); 可以得到 第一个 的view 并进行相应的设置
RadioGroup、RadioButton
单选框
rg.clearCheck(); 清空选项
int id=rg.getCheckedRadioButtonId();
RadioButton rb=(RadioButton) rg.findViewById(id);
CharSequence s=rb.getText();
SeekBar
事件监听
sb.setOnSeekBarChangeListener(this);
实现接口 重写方法:
onProgressChanged() //一直在执行
onStartTrackingTouch() //开始的时候执行
onStopTrackingTouch() //结束的时候执行
android:max="100" 最大为100
android:progress="10" 当前进度为 10
android:secondaryProgress="90" 缓冲到 90
android:thumb="@drawable/juxing" 滑动块 为 小矩形(自定义的)
android:progressDrawable="@drawable/scrubber_progress_horizontal_holo_light" (设置的背景色 不会的话去参考官方代码 自己去抄 名字就为 前边的名字 找不到 就去屎吧)
RatingBar
评价条:
android:numStars="5" 有5颗星
android:rating="3" 当前 满了 3颗
android:stepSize="0.5" 半颗 半颗的增加
android:isIndicator="true" 是否允许用户点击
ImageSwitcher
直接 方法重写:makeView() 创建 ImageView
设置 iv的 大小 iv.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
iv.setImageResource(ima[0]); 图片显示
imsw.setFactory(this);//设置工厂
imsw.setAnimation(AnimationUtils.loadAnimation(this, android.R.anim.linear_interpolator));//设置动画
点击事件 监听
imsw.setOnTouchListener() 实现接口 重写方法
onTouch()
event.getAction()==MotionEvent.ACTION_DOWN
event.getAction()==MotionEvent.ACTION_UP
得到当前的坐标 x2=event.getX()
当两次的坐标相差多少时 来判定下次展示的图片
Menu
系统启动后会直接调用方法onCreateOptionsMenu()创建菜单:
直接重写方法onOptionsItemSelected(MenuItem item) 监听
item.getItemId() 得到 菜单中点击的 item 的id
Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(i); //开启 菜单 相机
startActivityForResult(i, requestCode); 捕获照片 没讲
Intent i2=new Intent(Intent.ACTION_CALL);
i2.setData(Uri.parse("tel:110"));
startActivity(i2);//打电话
<!--菜单项 ID 顺序 不显示 有空间就显示 总是 收起collapse 标题-->
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="always"
android:title="彩儿"
android:icon="@android:drawable/ic_menu_help"/>
子菜单
<item
android:id="@+id/action_settings1"
android:orderInCategory="101"
android:showAsAction="always"
android:title="caicai"
android:icon="@android:drawable/star_big_off">
<menu >
<item android:id="@+id/m1"
android:orderInCategory="201"
android:showAsAction="never"
android:title="笨"
android:icon="@android:drawable/stat_notify_call_mute"/>
<item android:id="@+id/m2"
android:orderInCategory="202"
android:showAsAction="never"
android:title="大笨蛋"
android:icon="@android:drawable/stat_notify_chat"/>
</menu>
</item>
java代码:
MenuItem mi1=menu.add(1, 111, 102, "哈哈");
mi1.setIcon(android.R.drawable.stat_notify_chat);
mi1.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
SubMenu mi11=menu.addSubMenu(2, 201, 220, "cai");//创建含有子菜单的菜单项
MenuItem mi111=mi11.add(2, 202, 221, "chuxian");
MenuItem mi112=mi11.add(2, 203, 222, "chuxian");
补:java 代码 写的 子菜单在 菜单栏中不显示
上下文菜单:
registerForContextMenu(getListView());//将 菜单 和 ListView 进行绑定吧 注册
重写方法:
onCreateContextMenu()//基于上下文的长按菜单 当采用xml加载时 抄一下系统默认的调用菜单的格式就好了 加载上菜单
得到选中的list的索引值 即为 id值 可通过 :
AdapterContextMenuInfo acm=(AdapterContextMenuInfo) getMenuInfo();
final int i=acm.position;
onContextItemSelected(MenuItem item)菜单响应事件
AdapterContextMenuInfo acm=(AdapterContextMenuInfo) item.getMenuInfo();
final int i=acm.position; //获得 选中的菜单的 id 通过id 去修改文件 switch();
list.remove(i); //得到的是 长按的列表的id adapterContextMenuInfo 中 封装的是 长按列表的索引信息
aad.notifyDataSetChanged();
文件删除后刷新
PopupMenu
自己去想吧
监听事件:popup.setOnMenuItemClickListener();重写方法
ActionBar
ab=getActionBar();
ab.setDisplayHomeAsUpEnabled(true);
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ab.addTab(ab.newTab().setText("菜菜").setTabListener(this));
tab的监听事件:重写的方法:
onTabReselected();
onTabSelected(); vp.setCurrentItem(tab.getPosition()); tab 和 vp 的联动 ab.setSelectedNavigationItem(arg0);
onTabUnselected();
重写方法 onOptionsItemSelected(MenuItem item){ item.getItemId()==android.R.id.home finish(); }
系统给出的后退
onBackPressed();返回 方法
Notification
Intent i=new Intent(this,NotiMainActivity.class);
PendingIntent pi=PendingIntent.getActivity(this, 100(请求吗,随便写个值就好了! 设置延迟意图 当点击时 才执行 ),
i, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews v=new RemoteViews(getPackageName(), R.layout.ca);
v.setTextViewText(R.id.textView1, "倩倩");
v.setTextViewText(R.id.textView2, "youyou");
Notification n=new NotificationCompat.Builder(this)
.setContentText("笨蛋").setContentTitle("caier")
.setSmallIcon(R.drawable.ic_launcher).setTicker("音乐")
.setContent(v).build();
n.flags=Notification.FLAG_AUTO_CANCEL;
ntfm.notify(1, n);
//ntfm.cancel(1); 在没有销毁的 另外两大事件
图片压缩:
Options opts=new Options();
//1.借助option对象封装选项信息
Options opts=new Options();
//2.设置Options对象的inJustDecodeBounds值为true
//当此属性的值为true时,表示只读取图片的边界信息
opts.inJustDecodeBounds=true;
//3.读取图片边界信息,并将其信息封装到options对象
BitmapFactory.decodeFile(
pic.getPath(),opts);
//4.获得图片边界信息
int oHeight=opts.outHeight;
int oWidth=opts.outWidth;
Log.i("TAG", "oHeight="+oHeight);
Log.i("TAG", "oWidth="+oWidth);
//5.计算并设置压缩比例
//获得window窗口显示信息,
//并将其封装到DisplayMetrics对象中
DisplayMetrics dm=new DisplayMetrics();
getWindowManager()
.getDefaultDisplay()
.getMetrics(dm);
int hPix=dm.heightPixels;
int wPix=dm.widthPixels;
int x=oWidth/wPix;
int y=oHeight/hPix;
opts.inSampleSize=y;
//6.设置Options对象的inJustDecodeBounds值为false
opts.inJustDecodeBounds=false;
//7.读取文件内容
Bitmap bitMap=BitmapFactory.decodeFile(
pic.getPath(),opts);
return bitMap;
图片缓存
File cache=//
getExternalCacheDir();//context
File newPic=new File(cache,"cacheql.JPG");
OutputStream out=null;
try{
out=new FileOutputStream(newPic);
bitMap.compress(CompressFormat.JPEG,100, out);//图片格式 压缩比例 写到哪儿
out.close();
}catch(Exception e){e.printStackTrace();}
this.getclass().getSimleName();
this.getclass().getName; 获得 包名
SharedPreferences
spf=getSharedPreferences("caicai", MODE_PRIVATE);
Editor e=spf.edit();
e.putInt("a", 0);
e.commit();
int n=spf.getInt("a", 0);
File
root=Environment.getExternalStorageDirectory();
StatFs s=new StatFs(root.getPath());
int totalSize=s.getBlockSize()*s.getBlockCount()/1024/1024;
数据存储的读写
1.先检测内存有没有,内存有则直接显示
a)内存中的缓存借助LruCache对象实现
b)LruCache的底层实现是一个LinkedHashMap(能保证key的添加顺序)
c)在使用LruCache应至少重写一个方法sizeOf
2.检测磁盘中有没有,磁盘有就要读到内存,然后显示
a)磁盘中的缓存是借助DiskLruCache实现
b)具体数据操作(例如写数据)需要借助Editor对象
3.磁盘没有,则从网络读取缓存到磁盘,然后在到内存进行缓存,然后显示
LruCache
ActivityManager am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
int i=am.getMemoryClass();
int size=i*1024*1024/8;
lc=new LruCache<String, Bitmap>(size){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();}};
通过调用put get 方法 存储数据 获得数据
DiskLruCache
5
SQLite
sqld=openOrCreateDatabase("cqq.db", MODE_PRIVATE, null);
String sql="create table if not exists caicai(_id integer primary key,phone text not null,name text not null,created text not null)";
sqld.execSQL(sql);
String ins="insert into caicai values(0,'15297131753','菜菜','1993-09-21')";
sqld.execSQL(ins);
ContentValues c=new ContentValu` - 7-+ es();
c.put("_id", 1);
c.put("phone", "15110289192");
sqld.insert("caicai", null, c);
String s="select * from caicai where phone like ?";
Cursor c=sqld.rawQuery(s, new String[]{"151%"});
c.moveToFirst()
c.moveToNext()
D:\software\android sdk_4_5_6\samples\android-23\ui\DisplayingBitmaps\Application\src\main\java\com\example\android\displayingbitmaps\util
ScheduledExecutorService ses=Executors.newSingleThreadScheduledExecutor();
ses.schedule(new Runnable() {
public void run() {
System.out.println(5);
}
}, 5, TimeUnit.SECONDS);//延迟5秒后 执行
/*ses.scheduleAtFixedRate(command,
initialDelay, 初始延迟
period, 下次任务的调度时间(无论上次任务有没有结束在period时间之后都会开启下一次调度)
unit)*/
/*ses.scheduleWithFixedDelay(command,
initialDelay,
delay,下次任务的调度时间(上次任务执行结束,再经过delay时间开始下一次的调度
unit)*/
Service
绑定模式的service
需要调用 bindService()方法 用于启动service
调用 unbindService()方法 解除绑定 并停止 service
在Mainactivity 中想直接采用 service 中的方法时 可以通过 Ibinder 方法 返回一个service对象 通过此对象 调用方法
onCreate(用于执行初始化动作) onBind 返回一个Ibinder接口的子类对象 onDestory() 用于释放资源
可以认为 activity 是客户端 而service 是服务端 的C/S 架构
Service 绑定机制支持跨进程通信
通过onServiceConnected()方法 得到 service 返回的 值
启动模式(StartService) intentService 会自动创建 工作线程 执行耗时操作
intentService方法中的onHandleIntent方法 重写 运行在工作线程
音乐播放器:
技术需求:SQLite ContentProvider AsyncTask Service notifycation MediaPlayer Activity
ContentResover
BroadcastReceiver 广播
一般广播 有序广播(设置 清单配置文件的 优先级)
注册方式:动态注册 静态注册 sendBroadcast(。。。)发送广播
Fragment
activity中的一个模块化组件 有自己独立的生命周期方法
继承 Fragment
静态 :在activity的布局文件中配置 fragment
动态 :在activity代码中动态更新fragment
viewpager adapter(fragmentPagerAdapter) Item(Fragment)
Intent
intent对象会由context对象的相关方法传递给底层Android系统
显示intent(目标明确)
隐式intent (目标不明确) 跨进程
常用方式 setClass setAction SetCoponent setType addCategory put get
Activity
启动 Activity
启动startActivity(intent) startActivityForResult(intent,requestCode);
启动 Service
startService(intent)
BindService(intent)
发送广播
sendBroadCast(intent)
反射在程序运行时动态发现类中的属性 发 动态的执行相关方法
通用编程 框架编程
反射: 类名.class 类的对象.getClass(); Class.forName(“包名.类名”);、
ContentProvider ContentResolver
SQLiteDatabase SQLiteOpenHelper Cursor
ContentProvider UriMatcher ContentUris
ContentResolver context.getResolver()
ContentProvider 类型的对象需要注册 (*^__^*) 嘻嘻……
<provider
android:name="com.example.day106_3_contentprovider.MyContentProvider"
android:authorities="lalala"
android:enabled="true"
android:exported="true" >
</provider>
关联的数据一般为 内部存储 其生命周期由系统管理
Service 执行耗时操作
service对象所在的进程生命力更顽强一些 不容易在内存不足时 被杀死
启动模式(startService(intent))
onCreate(1次) onStartCommand(多次) onDestroy(1次)
可以调用stopService()停止 或在内部调用stopSelf()停止
绑定模式(bindService(intent))
onCreate(1次) onStartCommand(多次) onDestroy(1次)
unBindService()停止
Ibinder() binder() ServiceConnection();
Service对象所在进程可以转换为前台进程 可以调用startForground(0,ntf)方法 将service进程转换为前台进程
还可以调用stopForeground将其在转换为后台进程
Service在被非正常停止时 可以自动启动 设置 粘性
Service可以自动启动 可以借助广播的
当activity中希望直接调用service中相关方法时 采用绑定模式更好
IntentService
适合应用在执行完任务以后自动停止的场合
BroadCastReceiver 广播
Receiver对象类型
一般广播(sendBroadcast())
有序广播(sendOrderBroadcast())
当接收到广播以后会回调onReceiver()方法
其生命周期取决于其注册方式:静态注册(清单配置文件) 动态注册 (receiver registerReceiver 注册 UNregisterReceiver)
getResultData(); setResultData();