当前位置: 编程技术>移动开发
本页文章导读:
▪在当前app的data目录上创建的文件 在当前app的data目录下创建的文件
通常情况下我们可以把从网络上下载的数据存放在SD卡上,只要在AndroidManifest.xml中加入<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>的.........
▪ 在launcher 2.1上兑现2.2的屏幕标记 在launcher 2.1上实现2.2的屏幕标记
在launcher 2.1上实现2.2的屏幕标记。Launcher2.2自带了屏幕标记,他是分了两块,分别为在左下角和右下角。1) 每一块为一个imageview,在配置文件Launcher.xml中直.........
▪ Text控件应用小收集 Text控件运用小收集
一、Android API之TextView.BufferType代码演示TextView.BufferType并不是TextView的内部类,是一个枚举类型,设置有三个枚举值,分别为NORMAL,EDITABLE,SPANNAABLE。对于EDITABLE,多用于在.........
[1]在当前app的data目录上创建的文件
来源: 互联网 发布时间: 2014-02-18
在当前app的data目录下创建的文件
通常情况下我们可以把从网络上下载的数据存放在SD卡上,只要在AndroidManifest.xml中加入<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>的权限就可以了。这样写到SD卡上的文件也可以被其他应用程序访问。
但是有的时候,我们在没有SD卡的情况下也要保持应用正常工作,可以把文件存放在该应用的data目录下(/data/data/com.aaa.yourpackage/)。通过代码来实现:
File mediaFilesDir = mContext.getDir("mediaFiles", Context.MODE_WORLD_READABLE);
这样会在/data/data/com.aaa.yourpackage/目录下创建一个名为app_mediaFiles的目录,然后可以在这个目录下创建新的文件。这样创建出来的文件与在SD卡上创建出来的有一个很大的区别,就是权限。其他应用程序无法像加个permission来访问SD卡上的文件一样来访问我们在当前应用下创建的这个文件。那么怎么办呢。我们知道,android提供了一个SharedPreference,也是在自己的当前应用data目录下创建的一个xml文件,但是它是可以设置权限的,MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE. 这说明我们是可以去设置创建出来的文件的权限的,就需要去查看SharedPreference是如何实现对权限的设置的了。经过对源码的一番挖掘,发现原来在frameworks/base/core/java/android/app下面的ContextImpl中提供了这个方法来实现的:
private static void setFilePermissionsFromMode(String name, int mode,
int extraPermissions) {
int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
|FileUtils.S_IRGRP|FileUtils.S_IWGRP
|extraPermissions;
if ((mode&MODE_WORLD_READABLE) != 0) {
perms |= FileUtils.S_IROTH;
}
if ((mode&MODE_WORLD_WRITEABLE) != 0) {
perms |= FileUtils.S_IWOTH;
}
if (DEBUG) {
Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
+ ", perms=0x" + Integer.toHexString(perms));
}
FileUtils.setPermissions(name, perms, -1, -1);
}
这里的参数表中的mode就是我们在获取SharedPreference时传过去的mode(MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE). 原来是用了FileUtils提供的静态方法 setPermissions()来设置的。这是一个native的方法,在对应的c++那边去实现了。
我们把setFilePermissionsFromMode稍微改造如下:
public static void setFilePermissionsFromMode(String name, int mode) {
int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
|FileUtils.S_IRGRP|FileUtils.S_IWGRP;
if ((mode&Context.MODE_WORLD_READABLE) != 0) {
perms |= FileUtils.S_IROTH;
}
if ((mode&Context.MODE_WORLD_WRITEABLE) != 0) {
perms |= FileUtils.S_IWOTH;
}
FileUtils.setPermissions(name, perms, -1, -1);
}
这样就可以去设置文件的权限了。注意这里说的是设置,不是修改。也就是说只能在第一次创建这个文件的时候,就要把权限设置好。如果等文件创建好,再去设置权限,是无法实现的。这个和SharedPreference创建文件时的权限设置道理是一样的。如下代码:
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file.getPath());
//change file permission, so Message is able to access this file.
MyUtil.setFilePermissionsFromMode(file.getPath(), Context.MODE_WORLD_READABLE);
fos.write(bs);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try
{
fos.close();
}
catch (IOException e)
{
e.printStackTrace();
handleErrorMessage(e);
}
}
}
如果我们把
MyUtil.setFilePermissionsFromMode(file.getPath(), Context.MODE_WORLD_READABLE);
放在fos.close()之后写,是无法设置该文件的权限的。
还有种更直接的方式,Context对象提供了openFileOutput(filename, mode); 作用于上文类似。
通常情况下我们可以把从网络上下载的数据存放在SD卡上,只要在AndroidManifest.xml中加入<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>的权限就可以了。这样写到SD卡上的文件也可以被其他应用程序访问。
但是有的时候,我们在没有SD卡的情况下也要保持应用正常工作,可以把文件存放在该应用的data目录下(/data/data/com.aaa.yourpackage/)。通过代码来实现:
File mediaFilesDir = mContext.getDir("mediaFiles", Context.MODE_WORLD_READABLE);
这样会在/data/data/com.aaa.yourpackage/目录下创建一个名为app_mediaFiles的目录,然后可以在这个目录下创建新的文件。这样创建出来的文件与在SD卡上创建出来的有一个很大的区别,就是权限。其他应用程序无法像加个permission来访问SD卡上的文件一样来访问我们在当前应用下创建的这个文件。那么怎么办呢。我们知道,android提供了一个SharedPreference,也是在自己的当前应用data目录下创建的一个xml文件,但是它是可以设置权限的,MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE. 这说明我们是可以去设置创建出来的文件的权限的,就需要去查看SharedPreference是如何实现对权限的设置的了。经过对源码的一番挖掘,发现原来在frameworks/base/core/java/android/app下面的ContextImpl中提供了这个方法来实现的:
private static void setFilePermissionsFromMode(String name, int mode,
int extraPermissions) {
int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
|FileUtils.S_IRGRP|FileUtils.S_IWGRP
|extraPermissions;
if ((mode&MODE_WORLD_READABLE) != 0) {
perms |= FileUtils.S_IROTH;
}
if ((mode&MODE_WORLD_WRITEABLE) != 0) {
perms |= FileUtils.S_IWOTH;
}
if (DEBUG) {
Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
+ ", perms=0x" + Integer.toHexString(perms));
}
FileUtils.setPermissions(name, perms, -1, -1);
}
这里的参数表中的mode就是我们在获取SharedPreference时传过去的mode(MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE). 原来是用了FileUtils提供的静态方法 setPermissions()来设置的。这是一个native的方法,在对应的c++那边去实现了。
我们把setFilePermissionsFromMode稍微改造如下:
public static void setFilePermissionsFromMode(String name, int mode) {
int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
|FileUtils.S_IRGRP|FileUtils.S_IWGRP;
if ((mode&Context.MODE_WORLD_READABLE) != 0) {
perms |= FileUtils.S_IROTH;
}
if ((mode&Context.MODE_WORLD_WRITEABLE) != 0) {
perms |= FileUtils.S_IWOTH;
}
FileUtils.setPermissions(name, perms, -1, -1);
}
这样就可以去设置文件的权限了。注意这里说的是设置,不是修改。也就是说只能在第一次创建这个文件的时候,就要把权限设置好。如果等文件创建好,再去设置权限,是无法实现的。这个和SharedPreference创建文件时的权限设置道理是一样的。如下代码:
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file.getPath());
//change file permission, so Message is able to access this file.
MyUtil.setFilePermissionsFromMode(file.getPath(), Context.MODE_WORLD_READABLE);
fos.write(bs);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try
{
fos.close();
}
catch (IOException e)
{
e.printStackTrace();
handleErrorMessage(e);
}
}
}
如果我们把
MyUtil.setFilePermissionsFromMode(file.getPath(), Context.MODE_WORLD_READABLE);
放在fos.close()之后写,是无法设置该文件的权限的。
还有种更直接的方式,Context对象提供了openFileOutput(filename, mode); 作用于上文类似。
[2] 在launcher 2.1上兑现2.2的屏幕标记
来源: 互联网 发布时间: 2014-02-18
在launcher 2.1上实现2.2的屏幕标记
在launcher 2.1上实现2.2的屏幕标记。
Launcher2.2自带了屏幕标记,他是分了两块,分别为在左下角和右下角。
1) 每一块为一个imageview,在配置文件Launcher.xml中直接添加
<ImageView
android:id="@+id/previous_screen"
android:layout_width="93dip"
android:layout_height="20dip"
android:layout_gravity="bottom|left"
android:layout_marginLeft="6dip"
android:scaleType="center"
android:src="/blog_article/@drawable/home_arrows_left/index.html"
android:onClick="previousScreen"
android:focusable="true"
android:clickable="true" />
其中android:onClick="previousScreen"引用了一个名为previousScreen的方法,在Launcher.java类中定义。
其它一些用到的配置文件及图片可以直接从2.2的工程中拷贝。
2) 在Launcher的setupViews方法中获取配置文件中添加的imageview:
mPreviousView = (ImageView) dragLayer.findViewById(R.id.previous_screen);
Drawable previous = mPreviousView.getDrawable();
mPreviousView.setHapticFeedbackEnabled(false);
mPreviousView.setOnLongClickListener(this);
3) 在Launcher的setupViews方法后添加previousScreen方法:
public void previousScreen(View v) {
mWorkspace.scrollLeft();
}
4) 在workspace的setIndicators方法中添加:
mPreviousIndicator = previous;
mNextIndicator = next;
setCurrentScreen方法中添加:
mPreviousIndicator.setLevel(mCurrentScreen);
mNextIndicator.setLevel(mCurrentScreen);
在launcher 2.1上实现2.2的屏幕标记。
Launcher2.2自带了屏幕标记,他是分了两块,分别为在左下角和右下角。
1) 每一块为一个imageview,在配置文件Launcher.xml中直接添加
<ImageView
android:id="@+id/previous_screen"
android:layout_width="93dip"
android:layout_height="20dip"
android:layout_gravity="bottom|left"
android:layout_marginLeft="6dip"
android:scaleType="center"
android:src="/blog_article/@drawable/home_arrows_left/index.html"
android:onClick="previousScreen"
android:focusable="true"
android:clickable="true" />
其中android:onClick="previousScreen"引用了一个名为previousScreen的方法,在Launcher.java类中定义。
其它一些用到的配置文件及图片可以直接从2.2的工程中拷贝。
2) 在Launcher的setupViews方法中获取配置文件中添加的imageview:
mPreviousView = (ImageView) dragLayer.findViewById(R.id.previous_screen);
Drawable previous = mPreviousView.getDrawable();
mPreviousView.setHapticFeedbackEnabled(false);
mPreviousView.setOnLongClickListener(this);
3) 在Launcher的setupViews方法后添加previousScreen方法:
public void previousScreen(View v) {
mWorkspace.scrollLeft();
}
4) 在workspace的setIndicators方法中添加:
mPreviousIndicator = previous;
mNextIndicator = next;
setCurrentScreen方法中添加:
mPreviousIndicator.setLevel(mCurrentScreen);
mNextIndicator.setLevel(mCurrentScreen);
[3] Text控件应用小收集
来源: 互联网 发布时间: 2014-02-18
Text控件运用小收集
一、Android API之TextView.BufferType代码演示
TextView.BufferType并不是TextView的内部类,是一个枚举类型,设置有三个枚举值,分别为NORMAL,EDITABLE,SPANNAABLE。
对于EDITABLE,多用于在保存数据持久化,而SPANNAABLE则用于设置如TextView,EditText对象里的局部属性设置。 而对于网络上关于EDITABLE之于NORMAL的差异,主要是说EDITABLE之后可以使用textview的append方法,有点类似String和StringBuffer的区别。但我在测试时发现,无论NORMAL还是EDITABLE,都可使用TextView的append方法。当然,我自身理解得也不透彻。对于EDITABLE数据持久化保存则使用了SharedPreferences,参考了Android的ApiDemos。
如下为代码范例:
(1)Activity类代码:
private TextView textView1,textView2,textView3;
private EditText editText1,editText2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//main.xml中定义的UI组件
textView1=(TextView)findViewById(R.id.textView1);
textView2=(TextView)findViewById(R.id.textView2);
textView3=(TextView)findViewById(R.id.textView3);
editText1=(EditText)findViewById(R.id.editText1);
editText2=(EditText)findViewById(R.id.editText2);
//设置textView1为TextView.BufferType.NORMAL
textView1.setText(textView1.getText(),TextView.BufferType.NORMAL);
textView1.append(" Append from textView1");
//设置textView2为TextView.BufferType.EDITABLE
textView2.setText(textView2.getText(), TextView.BufferType.EDITABLE);
textView2.append(" Append from textView2");
//设置textVIew3中Text内容的起始和终止需处理字符的索引位置
int start=(textView3.getText()).toString().indexOf('i');
int end=(textView3.getText()).toString().indexOf('V');
//设置textView3为TextView.BufferType.SPANNABLE
textView3.setText(R.string.textView3, TextView.BufferType.SPANNABLE);
Spannable span=(Spannable)textView3.getText();
span.setSpan(newBackgroundColorSpan(Color.BLUE), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span.setSpan(newStyleSpan(Typeface.BOLD_ITALIC),start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置editText1为TextView.BufferType.SPANNABLE
editText1.setText(editText1.getText(),TextView.BufferType.SPANNABLE);
Spannable span1=(Spannable)editText1.getText();
span1.setSpan(newBackgroundColorSpan(Color.RED), 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//修改editText2内容后,将通过SharedPreferences保存,保证程序重启后数据持久存在
SharedPreferences prefs=getPreferences(0);
String restore=prefs.getString("text", null);
if(restore!=null){
//设置editText2为TextView.BufferType.EDITABLE
editText2.setText(restore,TextView.BufferType.EDITABLE);
intstart=prefs.getInt("start", -1);
intend=prefs.getInt("end", -1);
if(start !=-1 && end!=-1){
editText2.setSelection(start, end);
}
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
SharedPreferences.Editor editor=getPreferences(0).edit();
editor.putString("text", editText2.getText().toString());
editor.putInt("start", editText2.getSelectionStart());
editor.putInt("end", editText2.getSelectionEnd());
editor.commit();
}
(2)main.xml主要部分
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is the TextView.BufferType-NORMAL"
/>
<TextView
android:id="@+id/textView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is the TextView.BufferType-EDITABLE"
/>
<TextView
android:id="@+id/textView3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is the TextView.BufferType-SPANNABLE"
/>
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is EditText for TextView.BufferType-SPANNABLE"
android:freezesText="true">
<requestFocus />
</EditText>
<EditText
android:id="@+id/editText2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is EditText for TextView.BufferType-EDITABLE"
android:freezesText="true">
<requestFocus />
</EditText>
一、Android API之TextView.BufferType代码演示
TextView.BufferType并不是TextView的内部类,是一个枚举类型,设置有三个枚举值,分别为NORMAL,EDITABLE,SPANNAABLE。
对于EDITABLE,多用于在保存数据持久化,而SPANNAABLE则用于设置如TextView,EditText对象里的局部属性设置。 而对于网络上关于EDITABLE之于NORMAL的差异,主要是说EDITABLE之后可以使用textview的append方法,有点类似String和StringBuffer的区别。但我在测试时发现,无论NORMAL还是EDITABLE,都可使用TextView的append方法。当然,我自身理解得也不透彻。对于EDITABLE数据持久化保存则使用了SharedPreferences,参考了Android的ApiDemos。
如下为代码范例:
(1)Activity类代码:
private TextView textView1,textView2,textView3;
private EditText editText1,editText2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//main.xml中定义的UI组件
textView1=(TextView)findViewById(R.id.textView1);
textView2=(TextView)findViewById(R.id.textView2);
textView3=(TextView)findViewById(R.id.textView3);
editText1=(EditText)findViewById(R.id.editText1);
editText2=(EditText)findViewById(R.id.editText2);
//设置textView1为TextView.BufferType.NORMAL
textView1.setText(textView1.getText(),TextView.BufferType.NORMAL);
textView1.append(" Append from textView1");
//设置textView2为TextView.BufferType.EDITABLE
textView2.setText(textView2.getText(), TextView.BufferType.EDITABLE);
textView2.append(" Append from textView2");
//设置textVIew3中Text内容的起始和终止需处理字符的索引位置
int start=(textView3.getText()).toString().indexOf('i');
int end=(textView3.getText()).toString().indexOf('V');
//设置textView3为TextView.BufferType.SPANNABLE
textView3.setText(R.string.textView3, TextView.BufferType.SPANNABLE);
Spannable span=(Spannable)textView3.getText();
span.setSpan(newBackgroundColorSpan(Color.BLUE), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span.setSpan(newStyleSpan(Typeface.BOLD_ITALIC),start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置editText1为TextView.BufferType.SPANNABLE
editText1.setText(editText1.getText(),TextView.BufferType.SPANNABLE);
Spannable span1=(Spannable)editText1.getText();
span1.setSpan(newBackgroundColorSpan(Color.RED), 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//修改editText2内容后,将通过SharedPreferences保存,保证程序重启后数据持久存在
SharedPreferences prefs=getPreferences(0);
String restore=prefs.getString("text", null);
if(restore!=null){
//设置editText2为TextView.BufferType.EDITABLE
editText2.setText(restore,TextView.BufferType.EDITABLE);
intstart=prefs.getInt("start", -1);
intend=prefs.getInt("end", -1);
if(start !=-1 && end!=-1){
editText2.setSelection(start, end);
}
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
SharedPreferences.Editor editor=getPreferences(0).edit();
editor.putString("text", editText2.getText().toString());
editor.putInt("start", editText2.getSelectionStart());
editor.putInt("end", editText2.getSelectionEnd());
editor.commit();
}
(2)main.xml主要部分
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is the TextView.BufferType-NORMAL"
/>
<TextView
android:id="@+id/textView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is the TextView.BufferType-EDITABLE"
/>
<TextView
android:id="@+id/textView3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is the TextView.BufferType-SPANNABLE"
/>
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is EditText for TextView.BufferType-SPANNABLE"
android:freezesText="true">
<requestFocus />
</EditText>
<EditText
android:id="@+id/editText2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is EditText for TextView.BufferType-EDITABLE"
android:freezesText="true">
<requestFocus />
</EditText>
最新技术文章: