Android基础知识

来源:互联网 发布:中俄原油管道 知乎 编辑:程序博客网 时间:2024/06/03 13:49

解析JSON数据

把json格式的字符串 生成一个JSONObject对象JSONObject jo = new JSONObject(result);

设置更新的弹出框:

AlertDialog.Builder builder = new AlertDialog.Builder(this);这里一定要传this。builder.show();

SD卡的判断

Environment.getExternalStorageDirectory()    获取SD卡的私有目录Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  判断是否有SD卡

设置进度条,及设置样式

ProgressDialog pd = new ProgressDialog(this);// 更新进度条pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 设置进度条样式为横向pd.setMax(int);   pd.setProgress(int);pd.show();  pd.dismiss();

Dialog构造函数传的是activity.this dialog依赖于activity界面生命周期随着activity的消失而消失
Toast可以传getApplicationContext();

去掉应用所有页面的标题栏

<style name="AppTheme" parent="AppBaseTheme">     <item name="android:windowNoTitle">true</item></style>android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"Theme.Light  Theme.Black 都是旧的样式Theme.holo开头的是新的样式了

GridView的使用

<GridView    android:id="@+id/gv_home"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:horizontalSpacing="2dp"          //条目之间的横向间隔距离    android:numColumns="2"                   //列的数量    android:verticalSpacing="2dp" />         //条目之间的竖直方向间隔距离

自定义组合控件:

获取所有控件TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.SettingItemView);String title = typedArray.getString(R.styleable.SettingItemView_SiTitle);    SettingItemView_SiTitle是自定义类名__布局中设置的属性

自定义dialog布局

AlertDialog.Builder bulder = new AlertDialog.Builder(this);View view = View.inflate(this, R.layout.dialog_sjfd_initpsw, null);bulder.setView(view);AlertDialog dialog = bulder.create();dialog.show();

Activity的跳转动画

参数需要在res下创建xml文件(Tween Animation>>translate)overridePendingTransition(R.anim.next_enter, R.anim.next_exit);

getRawX()和getX()区别: ##

如果我们是重写的activity的onTouchEvent(MotionEvent event) 那么event.getX()和event.getRawX()的值是相同的

 >如果给一个view(比如一个button) 设置setOnTouchListener xxx.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {    System.out.println("onTouch.getRawY()==" + event.getRawY());    System.out.getRawY()("onTouch.getY()==" + event.getY());    //这里的getRawX()和getRawY()的到的坐标是相对于整个手机屏幕的左上角    //这里的getX()和getY()的到的坐标是相对于当前控件(就是xxx)的左上角,坐标值不会 超出控件的宽和高    return true;    }});

开机广播拦截 ##

  • 接收开启广播的权限 不加不会报错 但会接收不到广播

      <receiver android:name="com.itheima.mobilesafe91.receiver.BootCompleteReceiver" >    <intent-filter>        <action android:name="android.intent.action.BOOT_COMPLETED" />    </intent-filter>  </receiver>

广播的发送

sendBroadcast(intent);  发送无序广播sendOrderedBroadcast(   intent,  //意图        null, // receiverPermission 接收的权限        new MyReceiver(), //resultReceiver 最终的结果接收者        null ,//scheduler 消息处理器, 使用主线程中的handler        1, // initialCode 初始代码        "主席讲话:每人奖励10斤土豆", // initialData        null); // initialExtras  bundle类型 实际上就是对零散的数据做一次包装而已。//修改数据setResultData("主席讲话:每人奖励7斤土豆");//终止广播的传输abortBroadcast();

开始获取位置

    // 获取位置管理器    mLm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);    // 生成位置提供者的条件    Criteria criteria = new Criteria();    criteria.setCostAllowed(true);// 允许花费    criteria.setPowerRequirement(Criteria.POWER_HIGH);// 电量级别    // 参2 设置true返回当前能用的提供者    String provider = mLm.getBestProvider(criteria, true);    long minTime = 0;// 获取位置的最小时间    float minDistance = 0;// 获取位置的最小距离    mLm.requestLocationUpdates(provider, minTime, minDistance, listener);// 关闭位置获取    // 停止位置服务 不用的时候就停了 耗电    mLm.removeUpdates(listener);

给listview设置数据为空的图片

listview.setEmptyView(View v)listview.setOnScrollListener();

编辑页面EditText的背景是一个selector 设置了是否可用状态

   每种状态对应的图片是用xml文件写的shape   通过etNum.setEnabled(true);来转换不同状态显示的背景    <?xml version="1.0" encoding="utf-8"?>    <shape xmlns:android="http://schemas.android.com/apk/res/android"        android:shape="rectangle" >        <!-- 四个角的弧度 -->        <corners android:radius="5dp" />        <!-- 颜色 -->        <solid android:color="#FFFFCE" />        <!--            虚线间隔 android:dashGap="10dp"            android:dashWidth="5dp"        -->        <stroke            android:width="1dp"            android:color="#9DCAD9" />        <!-- 渐变色<gradient            android:centerColor="#0f0"            android:endColor="#00f"            android:startColor="#f00"            android:type="sweep"            >        </gradient> -->    </shape>    背景的selector    <selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:drawable="@drawable/black_et_bg_enable" android:state_enabled="true" android:state_focused="true"/>    <item android:drawable="@drawable/black_et_bg_unenable"/>    </selector>// 监听文字改变    etNum.addTextChangedListener(new TextWatcher() {        // 显示在输入框上        @Override        public void onTextChanged(CharSequence s, int start, int before, int count) {        }        // 将要显示在输入框上        @Override        public void beforeTextChanged(CharSequence s, int start, int count, int after) {        }        // 显示在输入框后        @Override        public void afterTextChanged(Editable s) {            String num = s.toString();            // 每次输入框文字改变后 实时查询更新            String address = AddressADO.getAddress(getApplicationContext(), num);            tvLoc.setText(address);        }    });

输入框为空的颤抖动画提醒

    Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);    etNum.startAnimation(shake);            shake 是一个xml写的动画        <translate xmlns:android="http://schemas.android.com/apk/res/android"        android:duration="1000"        android:fromXDelta="0"        android:interpolator="@anim/cycle_7"        android:toXDelta="10" />    cycle_7 是一个插值器    <cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android"    android:cycles="7" />

判断服务是否运行

public static boolean isRunning(Context context,        Class<? extends Service> serviceClz) {    // 活动管理器    ActivityManager am = (ActivityManager) context            .getSystemService(Context.ACTIVITY_SERVICE);    // 获取正在运行的服务信息    List<RunningServiceInfo> runningServices = am.getRunningServices(1000);    for (RunningServiceInfo runningServiceInfo : runningServices) {        // 获取service对应的ComponentName对象        ComponentName service = runningServiceInfo.service;        String className = service.getClassName();        // 判断传进来的服务是否在运行的服务信息里        if (TextUtils.equals(className, serviceClz.getName())) {            return true;        }    }    return false;}

通过查看toast源码知道 可以显示在任意页面上面的view 是添加到window上的

自定义一个toast 通过 WindowManager的addview方法给窗体添加一个view

    // WindowManager 窗口管理器 可以给窗口添加view    mWM = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);    // 指定添加进窗口的view的布局参数    params = new WindowManager.LayoutParams();    params.height = WindowManager.LayoutParams.WRAP_CONTENT;    params.width = WindowManager.LayoutParams.WRAP_CONTENT;    params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE            | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;    // | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE    params.format = PixelFormat.TRANSLUCENT;    调整显示级别 添加权限 SYSTEM_ALERT_WINDOW    params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;    mWM.addView(viewAddress, params);
  • 自定义toast的触摸移动

    首先设置view的触摸监听

    viewAddress.setOnTouchListener(this);

在监听方法里 监听按下 移动 和抬起事件 计算手指移动距离 去移动view

    // view 的触摸事件 自己处理的话 返回true    @Override     public boolean onTouch(View v, MotionEvent event) {        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:// 手指按下            startX = (int) event.getRawX();            startY = (int) event.getRawY();            // System.out.println("起点坐标x" + startX + "y" + startX);            break;        case MotionEvent.ACTION_MOVE:// 手指移动            int moveX = (int) event.getRawX();            int moveY = (int) event.getRawY();            // System.out.println("移动后坐标x" + moveX + "y" + moveY);            int distanceX = moveX - startX;            int distanceY = moveY - startY;            params.x = params.x + distanceX;// 更改view的布局参数的位置为移动后的位置            params.y = params.y + distanceY;            mWM.updateViewLayout(viewAddress, params);// 更新view的位置            startX = moveX;// 每次移动后 指向最新的起始点            startY = moveY;            break;        case MotionEvent.ACTION_UP:// 手指抬起            break;        default:            break;        }        return true;    }

小伙箭发射后 打开背景activity 注意从service开启activity的问题

    Intent intent = new Intent(mContext, RocketBgActivity.class);    //从service开启一个actvity 添加一个标志  创建一个新的栈    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    mContext.startActivity(intent);

创建一个activity 设置主题为透明

     android:theme="@android:style/Theme.Translucent.NoTitleBar"
1 0