您的位置:首页 > 移动开发 > Android开发

Android基础知识

2016-07-28 14:11 363 查看

解析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() {

@Override
public 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);// 电量级别
//
4000
参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"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: