平时的一些总结--ing

来源:互联网 发布:机械设计画图软件 编辑:程序博客网 时间:2024/05/22 01:30

:自定义一个Dialog,并且点击空白处可以取消的步骤:

1.编写一个自定义的LocationDialog的布局文件,R.layout.view_dialog

2.自定义LocationDialog类,继承extends Dialog

3.onCreate()方法中加载并显示布局文件setContentView(R.layout.view_dialog);

4.设定点击窗口空白处取消会话 setCanceledOnTouchOutside(true);

5.代码动态设置自定义LocationDialog上的内容;

6.展示窗口 .show();

二.使用GPS/ 基站等定位时, 当前位置发生改变会回调LocationListener的()方法

1)位置发生变化时调用  onLocationChanged(Location location)

location 封装了当前的位置信息:

double latitude = location.getLatitude();  纬度

double longitude = location.getLongitude();   经度

location.getAltitude();   海拔

2)定位方式状态发生变化时调用  

onStatusChanged(String provider, int status, Bundle extras)

3)定位方式不可用回调  onProviderDisabled(String provider)

定位方式可用回调    onProviderEnabled(String provider)

三.移动端的定位方式的理解。

1. 网络定位(WiFi定位)

手机扫描到WiFi信号对应的有路由器/路由器有mac地址和ip, 位置服务器提供商记录到数据库里

精度和WiFi信号强度有关受更新频率影响只能精确到大致区域街道纯真ip.

2. 基站定位

手机和基站通信可以根据基站的位置以及信号强度计算自己的位置至少三个基站基站数量越多

信号越强越精确精度在几十米-几公里

3. GPS定位

手机里有GPS芯片接收卫星发射的GPS信号根据卫星的位置以及信号中的信息确定自己的位置

GPS指的就是美国的GPS系统至少获取四颗卫星的信号相对论军用信号/商用信号

取决于芯片质量和信号强度一般的在室外受天气影响精度几米-几十米

星历, AGPS, 等专业名词可以自己查查了解即可.

Glonass定位:

Glonass是俄罗斯开发的一套定位系统,原理跟GPS一样,也是用很多很多天上飞的卫星来定位。不同的是:

Glonass芯片比GPS贵;②它抗干扰性能强,阴天下雨高楼深壑的地方GPS可能就抓瞎了,Glonass却仍然能正常工作;③北半球定位精度比GPS强一些;④搜星速度快。

目前Glonass主要见于高端机型,比如苹果系列,HTC ONE等,都是GPS+Glonass双系统导航,精度相当之高,导航可以精确到车道。

四.判断当前手势方向,切换上一页或者下一页。

GestureDetector手势识别器

上一个页的ActivityFistActivity

下一个页的ActivityNextActivity

当前页面的ActivityCurrentActivity

public class CurrentActivity extends Activity {

     private GestureDetector mGestureDetector;

     @Override

 protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.xxx);

       /* 2. 创建 GestureDetector手势识别器*/

       mGestureDetector = new GestureDetector(getApplicationContext(),

                             new MyGestureListener());

    }

 

 public class MyGestureListener  extends  GestureDetector.SimpleOnGestureListener{

        // 单击

        public boolean onSingleTapUp(MotionEvent e) {

            return false;

        }

        // 快速滑动

        // e1: 按下去的那个事件,e2:抬起来的那个事件,velocityX X轴的速度

        public boolean onFling(MotionEvent e1, MotionEvent e2,

                          float velocityX, float velocityY) {

                   if (e2.getRawX() - e1.getRawX() > 100) {

                        // 向右滑,切换到上一页

                        startActivity(new Intent(this, FistActivity.class));

                        finish();

                   } else if (e1.getRawX() - e2.getRawX() > 100) {

                        // 向左滑,切换到下一页

                        startActivity(new Intent(this, NextActivity.class));

                        finish();

                   }

            return false;

        }

        // 按下

        public boolean onDown(MotionEvent e) {

            return false;

        }

    }

    /* 1. 重写ActivityonTouchEvent方法,在这个方法里处理触摸事件

     * 当手指触摸到Activity上的时候,这个方法被调用

     * 参数 MotionEvent event,表示整个触摸事件*/

    public boolean onTouchEvent(MotionEvent event) {

        mGestureDetector.onTouchEvent(event);

        return super.onTouchEvent(event);

    }

}

.布局填充器LayoutInflater

1. public class MainActivity extends Activity {  

2.   

3.     private LinearLayout mainLayout;  

4.     protected void onCreate(Bundle savedInstanceState) {  

5.         super.onCreate(savedInstanceState);  

6.         setContentView(R.layout.activity_main);  

7.         mainLayout = (LinearLayout) findViewById(R.id.main_layout);  

8.         LayoutInflater layoutInflater = LayoutInflater.from(this);  

9.         View buttonLayout = layoutInflater.inflate(R.layout.button_layout, null);  

10.         mainLayout.addView(buttonLayout);  

11.     }   

12. }  

可以看到,这里先是获取到了LayoutInflater的实例,然后调用它的inflate()方法来加载button_layout这个布局,最后调用LinearLayout的addView()方法将它添加到LinearLayout中

六 为什么加载布局叫setContentView()?

LinearLayout的父布局确实是一个FrameLayout,而这个FrameLayout就是由系统自动帮我们添加上的。

说到这里,虽然setContentView()方法大家都会用,但实际上Android界面显示的原理要比我们所看到的东西复杂得多。任何一个Activity中显示的界面其实主要都由两部分组成,标题栏和内容布局。标题栏就是在很多界面顶部显示的那部分内容,比如刚刚我们的那个例子当中就有标题栏,可以在代码中控制让它是否显示。而内容布局就是一个FrameLayout,这个布局的id叫作content,我们调用setContentView()方法时所传入的布局其实就是放到这个FrameLayout中的,这也是为什么这个方法名叫作setContentView(),而不是叫setView()。

最后再附上一张Activity窗口的组成图吧,以便于大家更加直观地理解:

            

 

.SQLiteDatabase类封装了一些操作数据库的API其中db.execSQL();方法中可以执行插入,删除,更新及CREATE TABLE等有更改行为的SQL语句。

答案说明:SQLiteDatabase类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。

SQLiteDatabase的学习,应该重点掌握execSQL()rawQuery()方法。 

rawQuery()方法用于执行select语句。

execSQL()方法可以执行insertdeleteupdateCREATE TABLE之类有更改行为的SQL语句;

.导航栏内的只可选一个图标的组合按钮如何做?

可用RadioGroup,将一个个的图标按钮用RadioButton,如下:

1.去掉RadioButton文字前的圆圈:设置android:button=”@android:color/transparent”

2.插入图片DrawableTop

3.细节:设置图片和文字居中,图片和文字之间的距离;必须设置RadioGroup的排列方向

4.点击时的选中效果:通过分别给图片和文字各自加选择器达到;

5.默认选中第一个按钮:RadioGroup节点内,设置android:checkedButton="第一个按钮的id".

九.如何获取设备的屏幕尺寸?

 

.获取view的宽度的方法?

:getWidth()获得的宽度是View在设定好布局后整个View的宽度。

getMeasuredWidth()是对View上的内容进行测量后得到的View内容占据的宽度。前提是你必须在父布局的onLayout()方法或者此ViewonDraw()方法里调用measure(0,0);(measure中的参数的值你自己可以定义),否则你得到的结果和getWidth()得到的结果是一样的。

两者的使用场合:

getMeasuredWidth:在自定义view重写onLayout时、在我们用layoutinflater动态加载view后想获得view的原始宽度时。

getWidth:一般在view已经布局后呈现出来了,想获取宽度时。

 

十一.Touch事件传递机制中,dispatchTouchEvent(..)onInterceptTouchEvent(..)onTouchEvent(..)方法的含义。

dispatchTouchEvent(..)方法:用来分派事件。

其中调用了onInterceptTouchEvent()onTouchEvent(),一般不重写该方法

onInterceptTouchEvent(..)方法:用来拦截事件。

ViewGroup类中的源码实现就是{return false;}表示不拦截该事件,事件将向下传递(传递给其子View);

若手动重写该方法,使其返回true则表示拦截,事件将终止向下传递,事件由当前ViewGroup类来处理,就是调用该类的onTouchEvent()方法

onTouchEvent(..) 方法:用来处理事件。

返回true则表示该View能处理该事件,事件将终止向上传递(传递给其父View);

返回false表示不能处理,则把事件传递给其父ViewonTouchEvent()方法来处理

答案说明:注意:不是所有的View的子类,很多教程都说的是所有的View的子类,只有可以向里面添加View的控件才需要分发,比如TextView它本身就是最小的view了,所以不用再向它的子视图分发了,它也没有子视图了,所以它没有dispatchIntercept,只有touchEvent

十二、支持库?

是让高版本才有的API在低版本中也能用,版本兼容

支持库路径:sdk\extras\android\support\   

非系统控件(不是android.jar里面的控件),在xml中使用的时候必须使用全包名的方式,如: <android.support.v4.view.ViewPager />

什么是V4代表支持的最低的API  level,如:

android-support-v4.jar  支持的最低版本是 Android 1.6 API 4

android-support-v7.jar  支持的最低版本是 Android 2.1 API 7

invalidate()方法 :请求重绘View树,

即draw()过程,假如视图发生大小没有变化就不会调用layout()过程,并且只绘制那些“需要重绘的”

一般引起invalidate()操作的函数如下:

  1、直接调用invalidate()方法,请求重新draw(),但只会绘制调用者本身。

  2、setSelection()方法 :请求重新draw(),但只会绘制调用者本身。

  3、setVisibility()方法 : 当View可视状态在INVISIBLE转换VISIBLE时,会间接调用invalidate()方法,继而绘制该View。

  4、setEnabled()方法 : 请求重新draw(),但不会重新绘制任何视图包括该调用者本身。

如何使用户在点击PopupWindow对话框外部的时候,隐藏该对话框。

1.如果需要点击PopupWindow之外的地方或者back键让PopupWindow消失,PopupWindow的背景不能为空 ,调用setBackgroundDrawable(new ColorDrawable(0))设置背景,注意这里设置背景并不会覆盖xml文件定义的背景。

2. 当设置PopupWindow的setOutsideTouchable(true)时,设置的是它的外部可以点击,再加上设置它的背景不为空,点击PopupWindow对话框的外面或者点击Back键才会消失。

pw.setBackgroundDrawable(new ColorDrawable(0));

pw.setOutsideTouchable(true);

十三.动态的创建ListView的方法?

/**初始化布局*/

protected View initView() {

ListView listView = new ListView(mActivity);

        //设置背景 listView.setBackgroundColor(颜色)

listView.setBackgroundColor(Color.BLACK);

        //去掉默认的条目选择器的背景色setSelector(透明)

listView.setSelector(android.R.color.transparent);

        //listView的内容往下移动setPadding(0,top,0,0)

listView.setPadding(0, 40, 0, 0);

//去掉listView的分割线  将分割线高度设置为0

listView.setDividerHeight(0);

        //添加条目点击事件 setOnItemClickLinstener

listView.setOnItemClickListener(this);

return listView;

}

十四.Dppix的转换?

public static int dp2Pix(Context context,int dp){

float density = context.getResources().getDisplayMetrics().density;

int a = (int)(dp*density+0.5f);

return a;

}

十五.国际化

此处为转载

只知道i18n,但不知道为什么叫i18n.今天翻到一哥们的播客才清楚:internationalization (国际化)简称 i18n,因为在in之间还有18个字符.i18n,res/values-zh,values-en.

localization(本地化 ),简称L10n。 一般说明一个地区的语言时,用 语言_地区的形式,如  zh_CN, zh_TW.

各国语言缩写  http://www.loc.gov/standards/iso639-2/php/code_list.php,国家和地区简写http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html

Android i18nL10n提供了非常好的支持。android没有专门的API来提供国际化,而是通过对不同resource的命名来达到国际化,同时这种命名方法还可用于对硬件的区分,如不同的新视屏用不同的图片。

      eclipse的工程中,res目录有默认几项resource,如drawablelayoutmenuvalues其余还有

res/anim/   用来放置动画
res/xml/     用来放置style themexml定义。
res/raw/    用来放置data数据

十六.常用的获取inflate三种写法

1.View.infalte

view = View.inflate(context, R.layout.item_news, null);//将一个布局文件转换成一个View对象

2.使用LayoutInflater

LayoutInflater layoutInflater = LayoutInflater.from(context);

view = layoutInflater.inflate(R.layout.item_news, null);

3.使用Context.getSystemServcie

LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

view = layoutInflater.inflate(R.layout.item_news, null);

十七.安卓下的数据库的两种增删改查的方法

第一种:使用SqliteDatabaseexecSQL方法执行增删改;查询用rawQuery;

特点:增删改没有返回值,无法得知执行是否成功;查询比较灵活,可以做多表查询

1.创建帮助类对象

2.调用getReadabledatabase方法,帮助我打开数据库,并返回一个数据库操作对象 SqliteDatabase

3.通过数据库操作对象 SqliteDatabase执行增加数据的sql语句

第二种:使用SqliteDatabaseinsertdelete updatequery方法做增删改查;

特点:增删改有返回值,可以得知执行是否成功; 查询不够灵活不能做多表查询;

十八.使用XUtils进行网络请求的方法

HttpUtils httpUtils = new HttpUtils(5000);// 1.连接超时时间

GetCallBack callBack = new GetCallBack();

// 请求服务端 参1.请求方法GET/POST2.地址3.接收对象

httpUtils.send(HttpMethod.GET, url, callBack); private class GetCallBack extends RequestCallBack<String> {

/***请求成功时调用的方法 200成功* @param responseInfo返回数据的封装*/

public void onSuccess(ResponseInfo<String> responseInfo) {

String json = responseInfo.result;

Log.i("SplashActivity", json + "");

}

/***请求失败调用的方法 404 5xx失败*/

public void onFailure(HttpException error, String msg) {

Toast.makeText(getApplicationContext(), msg, 0).show();

}

}

 

 

 

0 0