package app.tj.com.hello; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.InputFilter; import android.text.Spanned; import android.text.TextWatcher; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //动态创建视图 LinearLayout linearLayout = new LinearLayout(this); ViewGroup.LayoutParams layoutParams = linearLayout.getLayoutParams(); //linearLayout.addView(); linearLayout.setLayoutParams(layoutParams); //类似模板 LayoutInflater layoutInflater = getLayoutInflater(); layoutInflater.inflate(R.layout.activity_main,null); setContentView(R.layout.activity_main); //添加按钮 Button button = (Button) findViewById(R.id.add); Button button2 = (Button) findViewById(R.id.add2); //添加监听 /*button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"添加",Toast.LENGTH_SHORT).show(); } });*/ button.setOnClickListener(listener); //触碰事件 button.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int actionType = event.getAction(); if (actionType==MotionEvent.ACTION_DOWN){ //按下 }else if (actionType==MotionEvent.ACTION_MOVE){ //移动 }else if (actionType==MotionEvent.ACTION_UP){ //松开 } //绑定多个事件时是否往下传递,true不传递 return false; } }); //获取布局页面 相当于DIV,可以加相关事件 ViewGroup viewGroup = (ViewGroup) findViewById(R.id.main); viewGroup.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return false; } }); //一个ACTIVITY是一个UI线程,线程会监听页面的变化,每个ACTIVITY 中的VIEW 会相互影响 //当线程阻塞超过5秒,系统就会干预 //解决办法 再创建一个线程 //新创建的线程不能修改当前UI主线程中的VIEW组件 button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } //不能再新开辟线程中调用V //TextView textView = (TextView) v; //可用---android解决方案 //可读性差 v.post(new Runnable() { @Override public void run() { //异步执行 放到UI主线程中 TextView textView = (TextView) v; } }); //第二种方案 AsyncTask } }).start(); } }); //android 继承的五个优先级,进程在运行过程中会随时变化 //1用户正在操作的 //2用户从一个程序切换到另一个程序 //3边放音乐,边看电子书,音乐的service //4定时检测更新 //5缓存进程 //资源文件 res R类中都可以获取(asset不能获取AsserManager二进制流的方式获取) //anim (xml动画文件) int color = this.getResources().getColor(R.color.colorAccent); this.getWindow().setBackgroundDrawableResource(R.color.colorAccent); //dimen尺寸资源 //drawable 图片资源文件 //view 的子类为vidget //相对位置 layout_height //wrap 内容多少 组件多大 //ems 多少个字 //fill 和父窗口一直 在定义 android:height不受影响 //android:ems="2" 显示几个字 多了换行 //android:gravity 文本位置设置 //文本框 TextView textView = (TextView) findViewById(R.id.textView); textView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { //文本框内容 String content = s.toString(); } }); textView.setFilters(new InputFilter[]{ //实现自定义过滤 new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { return null; } } }); //Spinner下拉列表 //数组适配器 //ArrayAdapter //LinearLayout 线性布局 布局可以相互嵌套 //RelativeLayout 相对布局 1位置 2边距 3对齐方式 //FrameLayout 帧布局 从屏幕左上角(0,0)布局,进行叠加
//图片视图 ImageView imageView = (ImageView) findViewById(R.id.imageView); //获取窗口的宽度 this.getWindowManager().getDefaultDisplay().getWidth(); //文本框<requestFocus/>获取焦点 EditText editText = (EditText) findViewById(R.id.editText); //弹出框 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(""); builder.setMessage(""); //builder.setView() 自定义弹框 //弹出框弹出多个值单选 builder.setItems(new String[]{}, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); Button button = (Button) findViewById(R.id.button); //scrollView 上下滚动视图 //listView 自带上下滚动 View view = getLayoutInflater().inflate(android.R.layout.activity_list_item,null); // ListView listView = (ListView) findViewById(android.R.layout.activity_list_item); // listView.setAdapter(new BaseAdapter() { // @Override // public int getCount() { // return 0; // } // // @Override // public Object getItem(int position) { // return null; // } // // @Override // public long getItemId(int position) { // return 0; // } // // @Override // public View getView(int position, View convertView, ViewGroup parent) { // return null; // } // }); //viewGroup 和VIEW的关系 //GridView 九宫格 //多个activity 组成一个栈 先进后出 //intent 控制跳转和传值 Intent intent = new Intent(); //intent.setClass(this,) intent.putExtra("name","张三"); this.startActivity(intent); this.startActivityForResult(intent,1); //使当前activity 销毁 重当前栈中删除 this.finish(); //activity 生命周期
} //把listener 和按钮分离,可以重用 private View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()){ case R.id.add: //Toast.makeText(MainActivity.this,"添加",Toast.LENGTH_SHORT).show(); Toast toast = Toast.makeText(MainActivity.this,"添加",Toast.LENGTH_SHORT); //设置显示位置 toast.setGravity(Gravity.CENTER,0,0); toast.show(); //通知 //notification break; default: Log.i("app","测试"); } } }; //下拉列表会用到 class MyAdapter extends BaseAdapter{ @Override public int getCount() { return 0; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { return null; } }
/** * 返回值监听 * @param requestCode * @param resultCode * @param data */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); }
}
双击 shift 查找类
F4看继承关系
gradle 地址
http://services.gradle.org/distributions/
src MainActivity 主文件
res放的都是资源文件
layout 布局文件
values 字符串文件
R可以获取所有的资源文件
R.id
R.string
@相当于R
AndroidManifest.xml app访问入口,所有的activity 都必须在其中注册
logcat pid进程号
一般不用 system
用 log.i("tag","内容");
android 进程优先级
5个级别
1 正在操作的界面
2 用户从一个程序切换到另一个程序
3 service process 边放音乐边看电子书
4 定时检测更新
5 缓存进程
在运行过程中有可能随时变化
消息
toast
context applicationContext 相当于 Application
activityContext 相当于request
消息提示
notification 通知消息
Content title 内容的标题
large icon 图标
android 资源管理
res放的所有资源 会扫描放到R类 R类可以访问
还包括 raw(二进制文件) xml
assets 文件夹一般是原始文件 mp3文件 不能通过R类获取
资源文件的获取包括二中格式
从代码中获取 R.
从配置文件获取 R资源类型/名
所有的资源文件都在<resources></resources>
R.string.ming
尺寸资源 dimens.xml @dimen/ming
px
in
dp
sp
xml 资源 只能在代码中使用
drawable 图片资源 图片名不能用数字
UI组件
view
TextView EditText Button
TimerPicker dataPicket
List views
gallery mageswitcher 显示图片
imageView 图片 android:src
ems最多能输入几个字的长度
singleline;"true" 单行
maxlength 最长输入几个字
<requestFocus>获取焦点
hint text为空时显示的提示信息
numeric 只能输入数字
android:tag 相当于input里的 value
android:text
spinner 下拉列表
viewgroup
Adapter 适配器模式 是数据源和UI组件之间的桥梁
baseAdapter 最常用
ArrayAdapter
UI布局 两种方式
1。layout 布局文件
线性布局 linearLayout
android:orientation 布局方式 垂直 水平
layout 可以嵌套
2.在程序代码中动态生成
gravity 对齐方式
weight 相当于 框架集 对子元素
相对布局 relativeLayout 比线性布局性能高
layout_toRightOf 在右边
layout_alignBottom 底部对齐
UI布局
1.帧布局
frameLayout 常用于 图层 初始化页面,启动页面 层次感
layout_gravity
android:gravity
2表格布局
tableLayout
对话框
alertDialog
自定义alertDialog
layoutInflater 不再activity 中用 context.getsystemservice(context.)获取
scrollview 垂直滚动条
listView 自带滚动条 获取数据 需要使用adapter
多个view 用 viewGroup
GridView
画廊控制
gallery
在 activity 中包含一个window 对象 在 window中包含一个布局容器 layout
Fragment (最低11)3.0后引进的新api v4包2.2
生命周期 必须放在activity中 和activity类似 有一些额外的回调
fragmentManager
activity 中没有frament 只能用fragmentManager
dis