十九.动态的设置Fragment
//1.获取一个FragmentManager对象
FragmentManager fragmentManager = this.getFragmentManager();
//2.使用manager对象开启事务,获取一个FragmentTransaction 对象
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//3.创建一个要在布局中展示的Fragment对象
LeftFragment leftFragment = new LeftFragment();
//4.使用事务对象FragmentTransaction将这个Fragment对象添加到当前Activity布局中的一个ViewGroup中
fragmentTransaction.add(R.id.ll_left, leftFragment);
//3.创建一个要在布局中展示的Fragment对象
RightFragment rightFragment = new RightFragment();
//4.使用事务对象FragmentTransaction将这个Fragment对象添加到当前Activity布局中的一个ViewGroup中
fragmentTransaction.add(R.id.ll_right, rightFragment);
//5.提交事务
fragmentTransaction.commit();
.不同版本Fragment的兼容
1.让Fragment去继承V4 包下的Framgent
2.让Activity继承FragmentActivity
3.获取FramgentManager时需要 使用this.getSupportFragmentManager方法获取;
二十.安卓中的单元测试
Junit java web: 需要单独的第三方jar包;
1.写个类继承AndroidTestCase这个类就具备单元测试的功能
2.写测试方法
3.给androidmanifest的manifest节点下 配置一个instrumentation
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:label="Tests for My App"
android:targetPackage=”要测试的包名" />
4.给androidmanifest的application节点下 配置一个uses-library
<uses-library android:name="android.test.runner" />
注意:如果忘记如何配置androidmannifest 可以创建一个测试工程;会自动配置
二十一.存储到SD卡,获取SD的大小及可用空间
1.加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.硬性编码://使用Environment获取sdcard目录
String path = Environment.getExternalStorageDirectory().getPath();
3.判断sdcard的状态
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(this, "sdcard未挂载或不存在", 0).show();
return;
}
4.sdcard剩余空间
//获取sdcard剩余空间,需要获取一个sdcard目录类型的文件
File sdcard_dirFile = Environment.getExternalStorageDirectory();
//获取sdcard剩余空间
long usableSpace = sdcard_dirFile.getUsableSpace();
//获取总空间
long totalSpace = sdcard_dirFile.getTotalSpace();
//格式化文件
String usableSpace_str = Formatter.formatFileSize(this, usableSpace);
if(usableSpace < 200 *1024*1024){
Toast.makeText(this, "sdcard空间不足,剩余"+usableSpace_str, 0).show();
return;
}
5.通过Context对象获取一个私有目录的路径; Context:上下文
String path = context.getFilesDir().getPath();
二十一.文件的权限概念
1.通过Context打开一个私有目录的文件写入流
//name:要打开的私有目录下面的文件的名称 mode:模式 private append read write 来控制文件的权限
FileOutputStream fileOutputStream = context.openFileOutput("userinfo.txt", Context.MODE_PRIVATE);
2.打开私有目录的一个文件读取流
FileInputStream in = context.openFileInput("userinfo.txt");
二十二.SharedPreferences介绍 用来做数据存储
Sharepreference一般用于存储标记性的数据 和 设置性的配置数据;以键值对的形式写的
Sharepreference保存的数据其实是保存在私有目录下的shared_prfs目录下;是一个xml文件;
通过Context对象获取Sharepreference对象
保存数据:
1.通过Context对象获取SharePreference对象(name:Sp的文件名称;mode:模式)
SharedPreferences sp = context.getSharedPreferences("userinfo.txt", Context.MODE_PRIVATE);
2.通过SharePreference对象获取一个Editor对象
Editor editor = sharedPreferences.edit();
3.使用Editor对象 添加键值对的数据
editor.putString("username", username);
4.提交数据
editor.commit();
读取数据:
1.通过Context对象获取SharePreference对象//name:SharedPreference的文件名称 mode:模式
SharedPreferences sp = context.getSharedPreferences("userinfo.txt", Context.MODE_PRIVATE);
2.使用sharedPreferences对象通过key获取value
String username = sharedPreferences.getString("username", "");
获取SharedPreferenc对象另一种方式
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
ListView中获取第一个条目 getFirstVisiblePosition(;)
ListView中获取最后一个条目 getLastVisiblePosition(;)
取当前应用的可用内存的方法
Int memory = Runtime.getRuntime().maxMemory();
安卓3.0之后的处理内存溢出时用到的LruCache类
有其特有的删除机制
例:LruCache<String,Bitmap> map = new LruCache<String,Bitmap>(maxMemory);
这里的maxMemory就是这个集合中允许存储的所有的value的总内存大小,其一般取当前应用的可用内存的额1/8.
当存储满时,如果继续还有数据需要存储,map就会判断get(Key)方法,执行时用到最少的键值对及近期未经常使用的键值对删除,之后再继续存储数据;
如何在布局文件中,仅写一个占父控件一半的控件?
在线性布局中添加属性: android:weightSum = "n" n--要线性布局按方向分成的份数
然后在布局中的控件上设置weignt = "m" 0<m<=n m---该控件在父布局中所占的份数
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal"
android:weightSum="2" >
<TextView
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:text="何乐虎 提升抗疲劳"
android:background="#0c0"/>
</LinearLayout>
当一个ListView的条目类型有多种时,其适配器还应该复写父类的另外2个方法:
1.getViewTypeCount();获取条目类型的数量
2.getItemViewType(int position):获取相应位置上的条目类型
3.同时getView()方法中的控件赋值也应该根据判断不同的条目类型而进行相应的赋值
测量模式
MeasureSpec.UNSPECIFIED 未定义的模式
MeasureSpec.AT_MOST 最大的模式
MeasureSpec.EXACTLY 精确模式
设置图片的展示模式
//简单第有个显示就行了
ImageView imageView = new ImageView(getActivity());
imageView.setImageResource(R.drawable.fenxi);
//imageView.setBackgroundResource(R.drawable.fenxi); //imageView.setScaleType(ImageView.ScaleType.CENTER);//高度占满屏幕高度,宽度溢出 //imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);//图片按比例展示,宽度/高度按大的为准
获取上下文的另一种方法:
如果在一个项目中的多个非四大组件的类中需要用到上下文,除了传参,也可以用到下面的这种方法:
创建一个类继承Application类(需在功能清单里配置application节点下的name),通过getApplicationContext()获取上下文对象,然后将该对象转成静态的成员变量.在该类中创建静态的获取上下文的方法getContext(),然后在其他类中即可以通过类名.getContext()上下文对象.
public static Context getContext(){return context;}
同理也可以在该类中创建Hanlder对象,供其他类调用;
也可以在此类中获取主线程的id号,()android.os.Process.myTid();)用于其他类判断是否是在主线程中进行操作
ViewPager做轮播图时实现自动轮循的方式?
通过消息机制实现发送消息,处理消息的无限循环,从而实现无限的延时开启下一页的效果
ViewPager做轮播图时处理触摸事件的2种方式?
1.为viewpager设置onTouchLisrener
2.处理事件onTounchEvent()
列表中的headerItem是ViewPager做轮播图时,若有上下触摸事件时,viewpager会接收到cancle取消事件,此时也该让重新启动自动轮循
TextView控件在代码中的动态设置
TextView textView= New TextView(getActivity());
//设置textView控件的字体随机大小 字号从10sp-20sp之间
int size = new Random().nextInt(10)+10;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
页面上都是散乱分布的TextView控件,点击后位置,内容,颜色,字体大小发生变化做此类效果时用第三方类StellarMap;
获取随机颜色的方法
public static int getRandomColor(){
int red = 10 + new Random().nextInt(240);
int green = 10 + new Random().nextInt(240);
int blue = 10 + new Random().nextInt(240);
int rgb = Color.rgb(red, green, blue);
return rgb;
}
代码中动态创建一个带背景颜色的圆角矩形的方法:
/**获取一个带背景颜色的圆角矩形的方法:
* @param rgb 颜色的值
* @exception 不设置边缘会有一些位置的bug出现
* */
public static GradientDrawable getGradientDrawable(int rgb) {
//创建图形对象
GradientDrawable drawable = new GradientDrawable();
//定义图形类型为矩形
drawable.setGradientType(GradientDrawable.RECTANGLE);
//定义圆角大小
drawable.setCornerRadius(10.0f);
//定义图形的颜色
drawable.setColor(rgb);
//设置图形的边缘线的宽度和颜色
drawable.setStroke(1, rgb);
//返回图形对象
return drawable;
}
代码中动态设置背景选择器的方法
/**设置背景选择器的方法
* @param pressedDrawable 被点击时的背景颜色
* @param normalDrawable 普通状态时的背景颜色
* */
public static StateListDrawable getStateListDrawable(
GradientDrawable pressedDrawable, GradientDrawable normalDrawable) {
//创建选择器类对象
StateListDrawable drawable = new StateListDrawable();
//设置按下状态时的背景
drawable.addState(new int[]{android.R.attr.state_pressed}, pressedDrawable);
//设置默认状态时的背景
drawable.addState(new int[]{}, normalDrawable);
//返回选择器对象
return drawable;
}
星星评分控件,设置不可被点击,不抢焦点,需设置的属性
<RatingBar
android:isIndicator="true" />
创建线程池对象的方法有几种?
方式一(常用):
//创建固定的线程数的
ExecutorService threadPool = Executors.newFixedThreadPool(3);
//创建一个线程的线程池
ExecutorService threadPool = Executors.newSingleThreadExecutor();
方式二:
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,10, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
二 软件商城中的应用软件下载完成后,的安装的方法
public void install(AppInfo appInfo){
//获取下载的信息
DownloadInfo downloadInfo = downloadInfoMap.get(appInfo.id);
//判断信息不为空
if (downloadInfo != null) {
//创建意图打开安装界面 进行应用的安装
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse("file://"+downloadInfo.path),"application/vnd.android.package-archive");
context.startActivity(intent);
}
}
/** * 文字的大小 将20sp转换成单位为px的文字大小 */ private float mTextSize = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics());