⑴ android中edittext怎么获取光标
下面是edittext获取光标的例子,更多关于edittext的介绍,请参考android学习手册。
android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,
源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳
int index = editText.getSelectionStart();
int index = editText.getSelectionStart();
2.在光标处插入字符
[java] view plain print?
int index = editText.getSelectionStart();
Editable editable = editText.getText();
editable.insert(index, "aaaa");
int index = editText.getSelectionStart();
Editable editable = editText.getText();
editable.insert(index, "aaaa");
3.删除光标前字符
[java] view plain print?
int index = editText.getSelectionStart();
Editable editable = editText.getText();
editable.delete(index-1, index);
⑵ 谁能推荐好的android进阶书籍
组件是在需要的时候才会使用,
比如servie ,了解注意它的生命周期。和什么情况下使用,运行在系统中,什么时候杀掉,什么时候不让它被杀掉。等等。
弄安卓有小一段时间了,控件。组件,线程,异步都不难用,主要是有编程思想,
可惜我现在还没有。脑子比较乱。不用刻意去弄这些。做项目的时候需要的时候,
网络,看下API 很简单。
做完一个客户端。基本都涉及了。
也算是了解了。
书籍的话,疯狂的讲义 不错。
⑶ 关于初学者学习android的书籍。。。。。
《Android基础教程》
由浅入深,循序渐进地讨论Android开发。
《Android应用开发揭秘》
基础部分充实丰富,高级部分深入饱含实例,从本质上提高开发者对Android的理解和编程水平。
《Android/Ophone完全讲义》
书中内容理论性和实战性兼备,在Android开发的实战方面很有代表性。
《Android系统原理及开发要点详解》
以知识性内容为纲,重点关注开发的要点,以清晰的思路介绍了整个Android的系统原理和开发方法。
《GoogleAndroid SDK开发范例大全》
以范例集的方式来讲述android的知识点,详细介绍了开发android的人机交互界面、android常用的开发控件、使用android手机收发短信等通信服务、开发android手机的自动服务功能和娱乐多媒体功能。
⑷ 如何让Android获得网页上的数据
例子来自于android学习手册,android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳
//第一种
/**获取参数(ArrayList<NameValuePair> nameValuePairs,String url)后post给远程服务器
* 将获得的返回结果(String)返回给调用者
* 本函数适用于查询数量较少的时候
*/
public String posturl(ArrayList<NameValuePair> nameValuePairs,String url){
String result = "";
String tmp= "";
InputStream is = null;
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
return "Fail to establish http connection!";
}
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
tmp=sb.toString();
}catch(Exception e){
return "Fail to convert net stream!";
}
try{
JSONArray jArray = new JSONArray(tmp);
for(int i=0;i<jArray.length();i++){
JSONObject json_data = jArray.getJSONObject(i);
Iterator<?> keys=json_data.keys();
while(keys.hasNext()){
result += json_data.getString(keys.next().toString());
}
}
}catch(JSONException e){
return "The URL you post is wrong!";
}
return result;
}
⑸ android 怎么判断是否在时间段 范围内
Calendar cal = Calendar.getInstance();// 当前日期
int hour = cal.get(Calendar.HOUR_OF_DAY);// 获取小时
int minute = cal.get(Calendar.MINUTE);// 获取分钟
int minuteOfDay = hour * 60 + minute;// 从0:00分开是到目前为止的分钟数
final int start = 17 * 60 + 20;// 起始时间 17:20的分钟数
final int end = 19 * 60;// 结束时间 19:00的分钟数
if (minuteOfDay >= start && minuteOfDay <= end) {
System.out.println("在外围内");
} else {
System.out.println("在外围外");
}
推荐学安卓的利器:
android学习手册,里面有源码。android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳:
⑹ android 怎么样获取弹出窗口输入的信息
这个问题也困扰过我,后来我终于发现了。就是一个很简单的方法. findViewById.
下面解决方法来源于android学习手册,android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,排列到第四个。
1 类似ListView的AlertDialog
publicclassDialog_{
/**.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
finalString[]arrayFruit=newString[]{"苹果","橘子","草莓","香蕉"};
DialogalertDialog=newAlertDialog.Builder(this).
setTitle("你喜欢吃哪种水果?").
setIcon(R.drawable.ic_launcher)
.setItems(arrayFruit,newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
Toast.makeText(Dialog_AlertDialogDemoActivity.this,arrayFruit[which],Toast.LENGTH_SHORT).show();
}
}).
setNegativeButton("取消",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
//TODOAuto-generatedmethodstub
}
}).
create();
alertDialog.show();
}
}
2 自定义布局的AlerDialog 。 一个关键方法就是myLoginView .findViewById 获取各种控件。
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//取得自定义View
LayoutInflaterlayoutInflater=LayoutInflater.from(this);
ViewmyLoginView=layoutInflater.inflate(R.layout.login,null);
DialogalertDialog=newAlertDialog.Builder(this).
setTitle("用户登录").
setIcon(R.drawable.ic_launcher).
setView(myLoginView).
setPositiveButton("登录",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
//TODOAuto-generatedmethodstub
}
}).
setNegativeButton("取消",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
//TODOAuto-generatedmethodstub
}
}).
create();
alertDialog.show();
}
⑺ android怎么使用sqlopenhelper
下面是SQLiteOpenHelper增删改查的例子。
例子来自于android学习手册,里面有源码。android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳
我们大家都知道Android平台提供给我们一个数据库辅助类来创建或打开数据库,这个辅助类继承自SQLiteOpenHelper类,在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象。继承和扩展SQLiteOpenHelper类主要做的工作就是重写以下两个方法。
onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。
onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。
除了上述两个必须要实现的方法外,还可以选择性地实现onOpen 方法,该方法会在每次打开数据库时被调用。
SQLiteOpenHelper 类的基本用法是:当需要创建或打开一个数据库并获得数据库对象时,首先根据指定的文件名创建一个辅助对象,然后调用该对象的getWritableDatabase 或 getReadableDatabase方法 获得SQLiteDatabase 对象。
调用getReadableDatabase 方法返回的并不总是只读数据库对象,一般来说该方法和getWriteableDatabase 方法的返回情况相同,只有在数据库仅开放只读权限或磁盘已满时才会返回一个只读的数据库对象。
下面通过一个简单的小例子说明SQLiteOpenDatabase的用法,其中包括创建数据库、插入数据、更新 、查询等等,我们将查询后获取到的数据显示到TextView上,看一下运行后的效果。MySQLiteHelper
Java代码
packagexiaohang.meng;
importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
importandroid.database.sqlite.SQLiteDatabase.CursorFactory;
{
//调用父类构造器
publicMySQLiteHelper(Contextcontext,Stringname,CursorFactoryfactory,
intversion){
super(context,name,factory,version);
}
/**
*当数据库首次创建时执行该方法,一般将创建表等初始化操作放在该方法中执行.
*重写onCreate方法,调用execSQL方法创建表
**/
@Override
publicvoidonCreate(SQLiteDatabasedb){
db.execSQL("createtableifnotexistshero_info("
+"idintegerprimarykey,"
+"namevarchar,"
+"levelinteger)");
}
//当打开数据库时传入的版本号与当前的版本号不同时会调用该方法
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
}
}
Activity01
Java代码
packagexiaohang.meng;
importandroid.app.Activity;
importandroid.content.ContentValues;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.graphics.Color;
importandroid.os.Bundle;
importandroid.widget.TextView;
{
MySQLiteHelpermyHelper;
TextViewtv;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.tv);
//创建MySQLiteOpenHelper辅助类对象
myHelper=newMySQLiteHelper(this,"my.db",null,1);
//向数据库中插入和更新数据
insertAndUpdateData(myHelper);
//查询数据
Stringresult=queryData(myHelper);
tv.setTextColor(Color.RED);
tv.setTextSize(20.0f);
tv.setText("名字 等级 "+result);
}
//向数据库中插入和更新数据
publicvoidinsertAndUpdateData(MySQLiteHelpermyHelper){
//获取数据库对象
SQLiteDatabasedb=myHelper.getWritableDatabase();
//使用execSQL方法向表中插入数据
db.execSQL("insertintohero_info(name,level)values('bb',0)");
//使用insert方法向表中插入数据
ContentValuesvalues=newContentValues();
values.put("name","xh");
values.put("level",5);
//调用方法插入数据
db.insert("hero_info","id",values);
//使用update方法更新表中的数据
//清空ContentValues对象
values.clear();
values.put("name","xh");
values.put("level",10);
//更新xh的level为10
db.update("hero_info",values,"level=5",null);
//关闭SQLiteDatabase对象
db.close();
}
//从数据库中查询数据
publicStringqueryData(MySQLiteHelpermyHelper){
Stringresult="";
//获得数据库对象
SQLiteDatabasedb=myHelper.getReadableDatabase();
//查询表中的数据
Cursorcursor=db.query("hero_info",null,null,null,null,null,"idasc");
//获取name列的索引
intnameIndex=cursor.getColumnIndex("name");
//获取level列的索引
intlevelIndex=cursor.getColumnIndex("level");
for(cursor.moveToFirst();!(cursor.isAfterLast());cursor.moveToNext()){
result=result+cursor.getString(nameIndex)+" ";
result=result+cursor.getInt(levelIndex)+" ";
}
cursor.close();//关闭结果集
db.close();//关闭数据库对象
returnresult;
}
@Override
protectedvoidonDestroy(){
SQLiteDatabasedb=myHelper.getWritableDatabase();//获取数据库对象
//删除hero_info表中所有的数据传入1表示删除所有行------>点击back按钮
db.delete("hero_info","1",null);
super.onDestroy();
}
}
⑻ android 什么时候使用弱指针
使用bitmap时使用弱引用。android学习手册中有关于listview中有大量图片,加载bitmap时使用弱引用加载的小例子。
下面介绍来自于android学习手册,android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,排在第三、四个。
使用bitmap时容易引起oom,虽然我们可以在bitmap不适用的时候通过recycle方法释放bitmap占用的内存,但是如果这个方法调用的时间点不合理,很容易引起 use a recycle bitmap的异常。
对此,可以使用弱引用来管理bitmap。将所有用到的bitmap对象放到一个hashmap中,用弱引用来保存,如果再用到这个bitmap的时候,根据相应的key直接取出来,相当于一个高速缓存池。如果确定不再使用的时候手动将其recycle,保证这个程序不会重复创建过多的bitmap对象。此外弱引用对象可以在系统内存不足的时候自动被系统回收。
如果一个对象只具有软引用,那么如果内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
如果一个对象只具有弱引用,那么在垃圾回收器线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。弱引用也可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
弱引用与软引用的根本区别在于:只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。而只具有软引用的对象只有当内存不够的时候才被回收,在内存足够的时候,通常不被回收。
在java.lang.ref包中提供了几个类:SoftReference类、WeakReference类和PhantomReference类,它们分别代表软引用、弱引用和虚引用。ReferenceQueue类表示引用队列,它可以和这三种引用类联合使用,以便跟踪Java虚拟机回收所引用的对象的活动。
在Android应用的开发中,为了防止内存溢出,在处理一些占用内存大而且声明周期较长的对象时候,可以尽量应用软引用和弱引用技术。
下面以使用软引用为例来详细说明。弱引用的使用方式与软引用是类似的。
假设我们的应用会用到大量的默认图片,比如应用中有默认的头像,默认游戏图标等等,这些图片很多地方会用到。如果每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低。所以我们考虑将图片缓存起来,需要的时候直接从内存中读取。但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常。这时,我们可以考虑使用软引用技术来避免这个问题发生。
首先定义一个HashMap,保存软引用对象。
private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
再来定义一个方法,保存Bitmap的软引用到HashMap。
public void addBitmapToCache(String path) {
// 强引用的Bitmap对象
Bitmap bitmap = BitmapFactory.decodeFile(path);
// 软引用的Bitmap对象
SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);
// 添加该对象到Map中使其缓存
imageCache.put(path, softBitmap);
}
获取的时候,可以通过SoftReference的get()方法得到Bitmap对象。
public Bitmap getBitmapByPath(String path) {
// 从缓存中取软引用的Bitmap对象
SoftReference<Bitmap> softBitmap = imageCache.get(path);
// 判断是否存在软引用
if (softBitmap == null) {
return null;
}
// 取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空
Bitmap bitmap = softBitmap.get();
return bitmap;
}
使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间可以被释放掉的,从而避免内存达到上限,避免Crash发生。
需要注意的是,在垃圾回收器对这个Java对象回收前,SoftReference类所提供的get方法会返回Java对象的强引用,一旦垃圾线程回收该Java对象之后,get方法将返回null。所以在获取软引用对象的代码中,一定要判断是否为null,以免出现NullPointerException异常导致应用崩溃。
经验分享:
到底什么时候使用软引用,什么时候使用弱引用呢?
个人认为,如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。
还有就是可以根据对象是否经常使用来判断。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。
另外,和弱引用功能类似的是WeakHashMap。WeakHashMap对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的回收,回收以后,其条目从映射中有效地移除。WeakHashMap使用ReferenceQueue实现的这种机制。
⑼ android 如何判断网络是否能够上网
实现步骤:
下面解决办法来自于android学习手册,android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载。排到第三个。
1、获取ConnectivityManager对象
Context context = activity.getApplicationContext();
// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
2、获取NetworkInfo对象
// 获取NetworkInfo对象
NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();
3、判断当前网络状态是否为连接状态
if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
4、在AndroidManifest.xml中添加访问当前网络状态权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
代码如下:
public class ClassTestDemoActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (isNetworkAvailable(ClassTestDemoActivity.this))
{
Toast.makeText(getApplicationContext(), "当前有可用网络!", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(getApplicationContext(), "当前没有可用网络!", Toast.LENGTH_LONG).show();
}
}
/**
* 检查当前网络是否可用
*
* @param context
* @return
*/
public boolean isNetworkAvailable(Activity activity)
{
Context context = activity.getApplicationContext();
// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null)
{
return false;
}
else
{
// 获取NetworkInfo对象
NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();
if (networkInfo != null && networkInfo.length > 0)
{
for (int i = 0; i < networkInfo.length; i++)
{
System.out.println(i + "===状态===" + networkInfo[i].getState());
System.out.println(i + "===类型===" + networkInfo[i].getTypeName());
// 判断当前网络状态是否为连接状态
if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
}
}
return false;
}
}
⑽ Android中 怎么获取apk中的素材图片
有些APK程序里的图标、图片很漂亮,在使用程序时你可能会想,如果能把这些漂亮的图标、图片提取出来就好了,其实这是可以办到的,请看教程。
更多例子请参考android学习手册,里面有源码。android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳
本教程以“电影超人”的APK安装包为例,其它APK程序的提取方法基本相同。以下内容需要在电脑中进行操作。
1.用压缩软件打开APK
APK程序其实就是个ZIP压缩包,想提取其中的资源就得先用解压缩软件将其打开,如图我们在APK安装包上右键、打开方式、选择压缩软件,我这里选择的是RAR,如果你安装的是其它的解压缩软件,选择它即可。如果你以前没有用压缩软件打开过APK文件,可以点击选择默认程序然后找到解压缩软件进行打开。
2.解压图片文件夹
用解压缩软件打开APK程序后,如图里面有几个文件夹,我们拖出“res”这个文件,一般APK程序的图片资源都在这个文件中。
3.寻找需要的图片
把“res”文件夹解压后我们打开可以看到里面的几个文件夹一般程序图标等图片都在“drawable-hdpi”这个文件夹,打开看看,是不是有自己需要的东西,如果没有再到其它的几个文件夹中查找一下。APK文件里的图片都是png格式的,可直接查看,这点比水果要厚道了许多。
4.反编译查找资源
也许大家发现了,解压后“电影超人”里大量的电影图片并没有看到,那是因为APK程序制作时把它们编译到了“resources.arsc”文件里我们想提取的话把APK文件进行反编译就可以了。具体反编译方法这里就不讲解了,请自行网络。