//尺寸dp   字体sp
 //view是所有类的父类  v大写
 //2/1 布局管理器  layout
 //布局管理器: 线性布局(LinerLayout)  相对布局(RelativeLayout)//居中
 1. LinearLayouta). android:layout_gravity="center_horizontal"表示该布局在父布局里水平居中,此时其父布局必须拥有android:orientation="vertical"属性;
b). android:layout_gravity="center_vertical"表示该布局在父布局里垂直居中,此时其父布局必须应设置成android:orientation="horizontal"属性(默认为该属性),且其父布局的高度应设置为android:layout_height="fill_parent"属性;
 2. RelativeLayout
属性值为true或false
a). android:layout_centerHrizontal 控件在父布局中 水平居中 
 b). android:layout_centerVertical 控件在父布局中 垂直居中 
 c). android:layout_centerInparent 控件相对于父元素完全居中 这里要明确一点,你是想控件里的内容水平居中,还是它在父亲控件中水平居中,
a). 让textView里面的内容水平居中 : android:gravity="center_horizontal"
b). 让textView在它的父布局里水平居中 :layout_gravity="center_horizontal"
//2-1-1 LinerLayout
 //最常用属性
 //android:id                                  android:layout_margin外边距
 //android:layout_width/_height宽度/高度        android:layout_padding内边距
 //android:background                          android:orientation 方向  hor水平  ver垂直 //gravity内部元素对齐方式  是写在父类元素里
//平分一个父类元素 
 //方法一:写两个一模一样的view
 //方法二:子元素设置权重  权重是把剩余内容按照权重分配   layout_weight=1  设置了权重就不用设置layout_width
 //       一般如果要平分就把weight设置为0dp  
2-1-2相对布局
 <relativeLayout>
 layout_toLeftOf 在谁的左边
 layout_toRightOf
 layout_alignBottom  和谁底部对齐
 layout_alignParentBottom /right和父空间底部对齐
 layout_below 在谁的下边
 centerHorizontal居中2-2TextView
 //理解垂直布局和水平布局    垂直布局就是直接换行
 文字大小颜色
 显示不下使用  ellipsize:end
 文字+icon
 中划线 下划线
 跑马灯
 <textview
 text=""  可以写在value的string里
 textcolor
 testsize//行数设置 maxLines
//图片  文字+ico
 drawable   drawableRight  drawablepadding//中划线
 a4.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);//图片+中划线
     <TextView
         android:id="@+id/a4"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="20dp"
         android:drawableRight="@drawable/xiajiantou"
         android:ellipsize="end"
         android:maxLines="1"
         android:textSize="16sp"
         android:text="筛选"
         android:textColor="#000000"
         android:drawablePadding="20dp"/>
 //下划线
 a5.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//下划线
     <TextView
         android:id="@+id/a5"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="20dp"
         android:textSize="16sp"
         android:textColor="#336699"
         android:text="下划线功能"/> //在java文件里下
[现在xml文件编辑功能 再在java文件类里声明变量  再在方法里写]
//也可以通过html标签给文字加下划线
 a6=findViewById(R.id.a6);
 a6.setText(Html.fromHtml("<u>通过html</u>"));//跑马灯效果  单行显示
 <TextView
         android:id="@+id/a7"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"  //包含内容
         android:textColor="#ff3e96"
         android:text="第一个跑马灯效果"
         android:textSize="24sp"
         android:singleLine="true"
         android:ellipsize="marquee"     
         android:marqueeRepeatLimit="marquee_forever"   //循环次数
         android:focusable="true"      //聚焦
         android:focusableInTouchMode="true"/>a7=findViewById(R.id.a7);
 a7.setSelected(true);2-3Button  继承自textview
 //文字大小颜色    textcolor textsize
 //自定义背景形状
 标签样式放在drawable里的xml文件里  xml标签用shape
 drawable里设置背景(颜色 角度)样式,在background里调用<shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
     //填充色
     <solid
         android:color="#ff9900"></solid>
     <corners
         android:radius="15dp"></corners>
 </shape> <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
     //描边
     <stroke
         android:width="1dp"
         android:color="#336699"></stroke>
     <corners
         android:radius="5dp"></corners></shape>
 //自定义按压效果
 触摸变色方法1:
     <Button
         android:id="@+id/a10"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="30dp"
         android:background="@drawable/button_4" /><selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item
         android:drawable="@drawable/click_normal"
         android:state_pressed="false" />
     <item
         android:drawable="@drawable/click_press"
         android:state_pressed="true"/></selector>
方法2:
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    </selector>
 //showToast  点击按钮弹出提示功能
 //大部分控件都可以设置点击事件
 方法1:
  <Button
         android:id="@+id/a11"
         android:text="按钮"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="20dp"
         android:background="@drawable/button_a11"
         android:onClick="showToast" />写在mainactivity的class下 非成员方法
  public void showToast(View view){
         Toast.makeText(this,"我被点击了",Toast.LENGTH_SHORT).show();
     } 方法2:
  <Button
         android:id="@+id/a10"
         android:text="@string/a10name"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="30dp"
         android:background="@drawable/button_4" />private Button a10;
 a10=findViewById(R.id.a10);
         a10.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 Toast.makeText(MainActivity.this,"我被点击了",Toast.LENGTH_SHORT).show();
             }
         }); //2-4 EditText  也是TextView子类
 //可以输入的控件
 //常用属性 
 //监听事件
 //制作登录界面//textAllCaps=false 默认不为大写
//默认内容 hint
//stoke corner 同样适用于EditText
//drawalepadding  drawleft图片文字
 //2-5 RadioButton
//写一个类方法 封装onClick
setLinsteners();
 }//写一个方法设置监听器
         private void setLinsteners(){
             //实例化
             OnClick onClick=new OnClick();
             radio_button.setOnClickListener(onClick);
         } private class OnClick implements View.OnClickListener{
             public void onClick(View v){
                Intent intent=null;
                switch (v.getId()){
                    case R.id.radio_button:
                        intent=new Intent(MainActivity.this,radioButton.class);
                        break;
                }
                startActivity(intent);
             }
         }
 //常用属性 <RadioButton
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="remeber me"/>//<RadioGroup> 有方向  radiobutton放在group里构成一组  一组构成单选
<RadioGroup
         android:id="@+id/remember_group"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
         android:paddingTop="100dp"
         android:paddingLeft="20dp">        <RadioButton
             android:id="@+id/remember_username"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="remeber username"/>        <RadioButton
             android:id="@+id/remember_password"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="remember password"/>     </RadioGroup>
//自定义样式
 //监听事件
  remember_group=findViewById(R.id.remember_group);
         remember_group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(RadioGroup group, int checkedId) {
                 Toast.makeText(radioButton.this,"you have remember the username",Toast.LENGTH_LONG).show();
             }
         });//复选框 CheckBox
 //常用属性
 //自定义样式
 <CheckBox
         android:id="@+id/cb_1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_below="@+id/check_box"
         android:layout_marginTop="20dp"
         android:text="android"/>//自定义样式:自己找图片 放drawable里
 //监听事件:选中,未选中
 private CheckBox cb_1,cb_2;cb_1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                 Toast.makeText(checkbox.this,isChecked?"选中":"未选中",Toast.LENGTH_SHORT).show();
             }
         });        cb_2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                 Toast.makeText(checkbox.this,isChecked?"选中":"未选中",Toast.LENGTH_SHORT).show();
             }
         }); 2-7ImageView 图片控件
 //Button的其他衍生控件:ToggleButton Switch(开关)
 //常用属性
 //加载网络图片
 //
 <ImageView
         android:id="@+id/image"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:src="@drawable/sharing60"
         android:scaleType="fitXY"/>
 //ScaleType
 //fitXY图片填充但可能会拉伸失真
 //fitCenter 保持宽高比缩放,直至完全显示
 //centerCrop 保持宽高比缩放,直至完全覆盖控件,裁剪显示 //插入网络图片方法
 //1.写在activity里
 private ImageView internetpic;
 internetpic=findViewById(R.id.internetpic);
 Glide.with(this).load("https://www.baidu.com/img/xinshouye_e6412034ac5864cf40ca6ab99782883b.gif").into(internetpic);//2.把要用的jar包放入lib里 或者使用build.gradle
 //放入gradle
 repositories {
     mavenCentral()
     google()
 }dependencies {
     implementation 'com.github.bumptech.glide:glide:4.9.0'
     annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
 }//3.使用gradle
 //
 // For a simple view:
 @Override public void onCreate(Bundle savedInstanceState) {
   ...
   ImageView imageView = (ImageView) findViewById(R.id.my_image_view);  Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);
 }// For a simple image list:
 @Override public View getView(int position, View recycled, ViewGroup container) {
   final ImageView myImageView;
   if (recycled == null) {
     myImageView = (ImageView) inflater.inflate(R.layout.my_image_view, container, false);
   } else {
     myImageView = (ImageView) recycled;
   }  String url = myUrls.get(position);
  Glide
     .with(myFragment)
     .load(url)
     .centerCrop()
     .placeholder(R.drawable.loading_spinner)
     .into(myImageView);  return myImageView;
 } //添加访问网络的权限(Manifest)
 <uses-permission android:name="android.permission.INTERNET"/> //2-8列表视图 ListView(不常用)
 //常用属性
 //Adapter接口
 //demo
 //divider  //
 1.写一个liseview
 2.写一个adapter 重写方法  getView方法显示 viewHolder提示效率
 3.点击事件 长按事件 //自己写一个Activity类
 //构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法.对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
 1.新建class  super父类继承Activity
 2.进去重写onCreate方法protected void onCreate( Bundle savedInstanceState) {
 3.layout目录下写一个布局 相对布局或者绝对布局   name:activy_listview
 4.写入Manifest
 <activity android:name=".ListView.ListViewActiviry"/> //listview点击事件
//ScrollView上下滚动
 //根布局改成ScrollView 直接子元素只能有一个  内部linerlayout嵌套//HorizontalscrollView水平滚动
//Adapter数据适配器
 我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的。
 数据适配器正是建立了数据源与ListView之间的适配关系,
 将数据源转换为ListView能够显示的数据格式,从而将数据的来源与数据的显示进行解耦,
 降低程序的耦合性。这也体现了Android的适配器模式的使用。Adapter是用来帮助填出数据的中间桥梁,
 简单点说吧:将各种数据以合适的形式显示在View中给用户看。 2-9 网格视图 GridView
 //常用属性
 //Adapter接口//Activity继承没有标题栏
 //AppCompatActivity继承有标题栏<GridView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:numColumns="3"></GridView  列数
     android:horizontalSpacing="10dp" 水平间距
         android:verticalSpacing="10dp">  垂直间距去Activity声明控件
 写Adapter2-11-1 RecyclerView
 1.首先引入包到build.gradle  比较简单不赘述//1.类似linstView的列表视图  
 1.没有分隔线
 2.自己设置点击事件 //2.水平横向滚动 适配器HorAdapter+ layout_hor_item   +HorrecycleActivity+activity_horrecycle.xml
 //3.网格视图
 //4.瀑布流//五种视图都要adapter  1.listview 2.gridview 3.4.recycle横竖布局 5.recycle网格布局
 //RrecyclerView:下拉刷新 上拉加载
 2-12WebView
 //加载网页 url或者本地assets文件下下的html   assets放不需要被编译的东西
 //加载html代码
 //Native和JS相互调用1.加载网络URL webview.loadUrl("网址")
 需要设置js  webview1.getSettings().setJavaScriptEnadled(true)2.加载html文件  webview.loadUrl("file:///android_asset/test.html")
 3.加载html代码  webview.loadData();   webview.loadDataWithBaseURL();4.网页的前进后退 
 webview.canGoBack()
 webview.goBack()
 webview.canGoForward()
 webview.goForward()
 webview.canGoBackOrForward(int steps)  负数向后 正数向前
 webview.goBackOrForward(int steps)按下返回键,默认是退出当前Activity,如果希望webview内页面后退,要重写onKeyDown方法
第三章
 3-1 Toast
 //设置显示的位置
 //自定义显示内容(例如添加一个图片)
 //简单封装Android系统的角度来理解:Context是一个场景,
 代表与操作系统的交互的一种过程。从程序的角度上来理解:Context是个抽象类,
 而Activity、Service、Application等都是该类的一个实现。XXXActivity.this=?=getApplicationContext
getApplicationContext() 返回应用的上下文,生命周期是整个应用,应用摧毁它才摧毁
 Activity.this的context 返回当前activity的上下文,属于activity ,activity 摧毁他就摧毁getBaseContext()  返回由构造函数指定或setBaseContext()设置的上下文
3-2 AlertDialong  弹出对话框
 //默认样式
 //单选样式
 //多选样式
 //自定义3-3ProgressBar(进度加载圈,条)   ProgressDialog(进度加载+对话框)(ex. 正在下载)
  
 //可以和webview结合@android:style/Widget.ProgressBar.Horizontal    水平进度条
        @android:style/Widget.ProgressBar.Inverse        普通环形进度条
        @android:style/Widget.ProgressBar.Large           大环形进度条
        @android:style/Widget.ProgressBar.Large.Inverse   大环形进度条
        @android:style/Widget.ProgressBar.Small            小环形进度条
        @android:style/Widget.ProgressBar.Small.Inverse   小环形进度条
       android:max          设置进度条最大值
        android:rpogress    指定进度条已经完成的进度值
        android:ProgressDrawable     指定进度条轨道的绘制形式
 //模拟进度
 //用runnable
 Handler是Android提供的消息处理类,可用于异步消息的处理,
 Handler关联了两个队列,一个是消息队列,里面顺序的存放消息对象(Message对象),
 另一个是存放实现了Runnabler接口对象的队列,系统会根据顺序,
 取出消息或者Runnable接口对象执行,默认的,
 Handler对象并没有单独开启一个新的线程,而是和主线程相关的,
 两个消息队列也是和主线程相关的,如果要单独开启线程,需要借助Looper对象。 //自定义progress样式
 android:drawable="@drawable/loading"
     android:pivotX="50%"
     android:pivotY="50%">//方法1.写一个xml文件 引用  
 //方法2.  设置一个style  style引用一个xml文件 然后给progressbar设置style //progress-dialog
 //弹出对话框 然后有正在加载的圈圈//自定义Dialog
 //1.先写一个类直接继承dialog
 //写一个layout布局  画一个xml
 //线用控件view画 //PopipWindow  界面弹出一个菜单
第四章
 //Activity Fragment碎片化界面
 1.新建类继承Activity或其子类
 2.在AndroidMainfest中声明
 3.创建layout并且在Activity的onCreate中设置//改变标题栏  mainfest中对应activity加label(写在activity的前标签中)  android:label="xxx"
//去掉标题栏(写在前标签)  android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"
//全局去掉标题栏   application中设置theme
//横屏鼠竖屏切换  android:screenOrientation="?"  landscape横着  默认不设置
//启动模式 launchMode
//设置默认启动项
     <intent-filter>
                 <action android:name="android.intent.action.VIEW" />
                 <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter> 4-1-2Activity生命周期
 log.d()日志调试4-1-3 Activity的跳转和数据传递
 //显式跳转和隐式跳转
 //Activity之间的数据传递//startActivityForResult:启动Activity,结束后返回结果
4-1-4Activity四种启动模式
 standard:标准模式.默认
 singleTop:Task栈顶复用模式
 singleTask:Task栈内复用模式
 singlelnstance:全局单例模式//Activity由任务栈管理,启动并一个放入一个到栈中,按返回键,就会从栈顶移除一个Activity
 //standard:每启动一个acctivity,创建一个新的实例
 //launchMode//singelTop
 //当要启动的目标Activity已经在栈顶时,不会创建新的实例,会复用栈顶的Activity,并且其onNewIntent()
 发法会被调用;如果目标Activity不在栈顶,则跟standard一样创建新的实例.    //singleTask
 //在同一个任务栈中,如果要启动的目标Activity已经在栈中,则会复用该Acitivity,
 并调用其onNewIntent方法,并且该Activity上面的Activity会被清楚.如果栈中没有,则创建新的实例.
  
 //singleInstance
 //全局复用,不管哪个Task栈,只要存在目标Activity,就复用.每个Activity占有一个新的Task栈.         4-2-1
 //fragment有自己的生命周期
 //Fragrment依赖于Activity
 //Fragment和Activity是多对多的关系4-2-2
 //Fragment中getActivity()为null的问题
 //向Fragment传递参数4-2-3 
 //Fragment回退栈4-2-4
 //Fragment和Activity通信 5-1基于监听的事件处理机制
 监听三要素:事件源,事件,事件监听器//实现监听的方法 
 1.通过内部类实现
 2.通过匿名内部类实现
 3.通过事件源所在类实现
 4.通过外部类实现
 5.布局文件中onClick属性(针对点击事件)给同一事件源添加多个同种类型监听器会怎么样?
 系统会响应最后一个监听器,其余不会执行5-2基于回调的事件处理机制
5-5Handler消息处理
 //用途:未来某时做某事,线程间通信6.属性动画
 //补间动画和属性动画
 //1.ValueAnimator  2.ObjectAnimator.ofFloat()属性动画  textview位置改变了 点击事件位置也随之改变
 补间动画  位置改变了 点击事件还在原地 7-1
 sharedpreferences 轻量数据存储
 //xml文件,k-v形式
 //1. SharedPreferences 读    把内容从xml读出来
 //2.SharedPreferences.Editor 写   把内容存储到xml里
 村吃完要加commit或者apply 7-2安卓存储概念
 //内部存储Internal Storage   随应用卸载被删除
 //外部存储 External Storage  1.公有目录 2.私有目录(随应用卸载删除) //内部存储
 /data/data/<applicationID>/shared_prefs
 /data/data/<applicationID>/databases
 /data/data/<applicationID>/files
 /data/data/<applicationID>/cache获得files cache
 context.getCacheDir()
 context.getFilesDir()//外部存储
 公有目录
 Environment.getExternalStoragePublicDirectory(int type)
 私有目录 7-2-2File 内部存储
 FileOutputStream
 FileInputStream !!sqlite
 insert语句用esec
 select语句用cursor //控制台打印信息监控
 Log.i("tag","message");//Bundle
 传值用bundle
 activity直接传递数值可以用bundle,sharepreference或者intent