Android 基础学习笔记

2016.9.23 18:43:13

1. 一些好的网址

2. View和ViewGroup

3. LinearLayout

  • 常用属性

4. ViewGroup.LayoutParams —基类

  • 继承关系,其子类
AbsListView.LayoutParams,
 AbsoluteLayout.LayoutParams, 
    Gallery.LayoutParams, 
        ViewGroup.MarginLayoutParams----
                                        |--LinearLayout.LayoutParams 
            ViewPager.LayoutParams,
                WindowManager.LayoutParams 
  • 三个构造器
ViewGroup.LAyoutParams(Context c,AttributeSet attrs)
ViewGroup.LayoutParams(int Width,int Height)
ViewGroup.LayoutParams(ViewGroup.LayoutParams source)
  • 两个方法
void resolveLayoutDirection(int layoutDirection)
参数:LAYOUT_DIRECTION_LTR和LAYOUT_DIRECTION_RTL
void setBaseAttributes(TypeArray a,int widthAttr,int heightAttr)

5. TextView设置带圆角矩形边框

  • 资源文件中定义样式
<solid android:color = "xxx"> 这个是设置背景颜色的
<stroke android:width = "xdp" android:color="xxx"> 这个是设置边框的粗细,以及边框颜色的
<padding androidLbottom = "xdp"...> 这个是设置边距的
<corners android:topLeftRadius="10px"...> 这个是设置圆角的
<gradient> 这个是设置渐变色的,可选属性有: startColor:起始颜色 endColor:结束颜色 centerColor:中间颜色 angle:方向角度,等于0时,从左到右,然后逆时针方向转,当angle = 90度时从下往上 type:设置渐变的类型

6. Drawable目录下的XML文件的各种标签的使用

  • shape标签:
    • Rectangle,
    • oval,
    • Line,
    • Ring
  • solid标签:设置填充颜色
    android:color=
  • padding标签:设置距控件内部内容的距离
        android:bottom=
        android:top=
        andrtoid:left=
        android:right=
  • size标签:设置宽高
    android:width=
    android:height=
  • stroke标签:设置边框
    android:width=
    android:color=
    android:dashGap=实线间的间隙
    android:dashWidth=虚线间的宽度
  • solid标签:填充颜色
android:color=""        
  • gradient标签:添加渐变—–渐变颜色
    android:startColor=
    android:endColor=
    android:type=
    android:gradientRadius=
  • Ring标签:
    android:innnerradiusRatio=
    android:shape="ring"
    android:thicknessRatio=
    android:uselevel=
  • layer-list标签:
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="true">
            <layer-list>
                <!-- 红色底 -->
                <item  android:color="#E4007F" />
                <!-- 白色背景 -->
                <item android:bottom="4dp" android:drawable="@android:color/white"/>
            </layer-list>
         </item>

        <item>
            <layer-list>
                <item android:color="#E4007F" />
                <item android:bottom="1dp" android:color="@android:color/white" />
            </layer-list>
         </item>
    </selector>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:paddingTop="16dp"
        android:paddingBottom="16dp"
        android:paddingMode="stack">
        <!-- 阴影 -->
        <item
            android:left="2dp"
            android:top="4dp">
            <shape>
                <solid android:color="@android:color/darker_gray" />
                <corners android:radius="10dp" />
            </shape>
        </item>
        <!-- 前景 -->
        <item
            android:bottom="4dp"
            android:right="2dp">
            <shape>
                <solid android:color="#FFFFFF" />
                <corners android:radius="10dp" />
            </shape>
        </item>
    </layer-list>
  • clip标签:
    • android:drawable=指定截取的源Drawable对象
    • android:clipOrientation=指定截取方向
    • android:gravity=指定截取时的对齐方式
  • selector
    • <item android:color=”” android:state_

7. 定义动画资源的xml放在res/anmi/路径下,需要自行创建路径

  • set标签—动画集合
    • set
      • duration
      • fiilafter
      • interpolator=”@android/anim/
    • alpha
      • fromAlpha
      • toAlpha
    • scale
      • fromXScale
      • toXScale
      • fromYScale
      • toYscale
      • pivotX
      • pivotY
    • translate
      • fromXDelta
      • toXDelta
      • fromYDelta
      • toYDelta
    • rotate
      • fromDegrees
      • toDegrees
      • pivotX
      • pivotY

2016.9.25 14:09:05

1. 清单文件中的标签

Application和Activity中的主题样式

  • android:theme=”@android:style/”加提示,会有很多的样式
  • 点进去看源码
  • 也可以在activity的oncreate()方法里添加 requestWindowFeature(Window.FEATURENOTITLE);—–setContentView之前调用

设置横竖屏

  • android:screenOrientation=”portrait”

2. SQLiteDataBase和SQLiteOpenHelper


3. HorizontalScollView和ScollView

  • 在HorizontalScollView中定义一个Linearlayout布局,线性布局中显示图片

4. 点击图片放大至全屏 和 动态添加ImageView

5. 压缩图片,防止内存溢出

6. 进行图片的缩略

7. 获取屏幕的长宽


8. 隐式意图来跳转组件

  • 请求方
    Intent intent=new Intent();
    intent.setAction(String action)
    intent.addCategeory(String categeory)
    startActivity(intent)
    
  • 跳转到所在的界面的activity的清单文件中需要申明<intent-filter>标签及其子标签
     <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    
  • 满足条件的action的activity都能被启动

2016.9.26 10:17:44

1. Cursor

  • Cursor类中有很多的moveToxxx()方法,移到指定的行
  • 再通过getxxx()方法得到该行中指定列的某个类型的值

2. SQLiteDatabase

  • 含有增删改查的方法
  • 含有创建或打开数据库的方法

3. Environment

  • 获取手机是否有SDcard状态
  • 获取Sdcaard目录
  • 清单文件中添加权限访问存储卡
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • AlertDialog

以下三种对话框都是AlertDialog对话框的子类

  • ProgressDialog
  • DatePickerDialog
  • TimePickerDialog

 

要看的类的api

SQLiteDatabase

SQLiteDatabase.CursorFactory

Cursor

BaseAdapter的适配器中的方法和参数含义

intent带键值对过去

对话框

界面控件widget

TabActivity

ListActivity

LauncherActivity

ExpandableListActivity

PreferenceActivity

AbsListView.LayoutParams

android中怎样实现点击图片后放大观看 photoview

自定义对话框,背景,大小,位置等

Android ListView长按弹出菜单


2016.9.27 21:38:18

1. String和StringBuilder和StringBuffer

  • 对字符串的操作

2. 获得屏幕的宽高

        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int width = metrics.widthPixels/4;
        int height = metrics.heightPixels/4;

2016.10.9 17:26:29

1. 基于回调的事件处理模型

事件源和事件监听器是统一的 一旦事件产生就回调该事件对应接口中的方法

2. 接口

  • 接口继承一个接口
  • 一个类实现多个接口,只能继承一个抽象类
  • 一个接口继承一个接口,或多个接口
  • 某个类实现了接口必须实现接口中所有未实现的方法
  • 标记接口—没有任何方法和属性

3. 抽象类

  • 含有abstrat修饰的方法,但没有方法体的方法,子类中必须实现该方法

SQLiteDatabase

  • 数据库对象什么时候用什么时候创建,也不要声明类中的外部的变量
  • 每次用的时候通过帮助类getReadableDatabase()或getWritableDatabase()方法获得,用完后就关闭该对象 database.close()
  • 通过数据库对象的query()方法获得结果集cursor对象,通过cursor的方法,可以得到该游标所在行的数据,用完后就关闭该对象 cursor.close()
  • 每行的id号可以通过cursor.getInt(idcolumnindex)来获得
  • 增: insert(table_name,String nullColumnHack,ContentValues values)—返回新增行的id
  • 删: delete(table-name,String 条件,占位符的值)—返回值为受影响的行数
  • 改:update(table_name,ContentValues values,条件,占位符的值) —-返回值受影响行数
    int result = db.update("info", values, "name = ?", new String[]{bean.name});
    
  • 查 query(表名,查询的列名(为null表示查询所有列),查询的条件,占位符的值,按什么字段分组group by,having分组的条件,order by按什么字段排序)

数据库中的事务

事务:执行多条sql语句,要么同时执行成功,要么同时执行失败,不能有的成功,有的失败

 db.beginTransaction();//为数据库开启事务
 try {
 ...//执行sql语句
 db.setTransactionSuccessful()//标记事务中的sql语句全部执行成功;
 } finally {
 db.endTransaction();//判断事务的标记是否成功,如果不成功,回滚错误执行之前的sql语句
 }

数据库中监听数据的变化

  • 数据库内容变化更新listview的数据显示

listview的优化

  • 适配器中getView()方法中的convertView参数表示消失在屏幕上的view,而这个view可以被接下来出现在屏幕上的view使用,就可以减少不必要的内存中对象的分配,convertview在使用时先判断是否为空,如果为空就创建一个要显示的view对象,不为空就将convertView对象强转为要显示的view类型

注: 真机调试 DDMS中打不开data目录 需要用户有root权限才可以

********* 2016.10.10 19:32:21 今晚任务看notes源代码,学习java*******************

SimpleCursorAdapter 和 ListView数据的动态更新

  • Cursor类中的重要的方法
    获取某一行:
    1.moveToFirst()---游标移到第一行
    2.moveToLast()游标移动到最后一行
    3.moveToPosition(int position)游标移动到指定行
    4.moveToPrevious()游标移动到前一行
    5.moveToNext()游标移动到下一行,主要用于遍历获取数据
    
    获取该行的某一列的值:
    1.getColumnIndex(String columnName)获取指定列在cursor记录集中的位置,返回列的索引值
    2.getString(int position)获取指定位置的数据
    3.getColumnName(int columnIndex)获取指定列的字段名
    4.getColumnCount()获得列的总数
    5.getCount()获取cursor记录集的行数
    6.close()关闭游标释放资源,
    7.isBeforeFirst()游标是否指向第一行
    8.isAfterLast()游标是否指向最后一行
    
  • SimpleCursorAdapter SimpleCursorAdapter adapter=new SimpleCursorAdapter(); adapter.changeCursor(dbReader.query(table_name,null,null,null,null,null));

new一个file是一个文件,文件对象的getAbsolutePath().toString()是获得文件的路径名

2016.10.12 20:38:25


关键词搜索

  • listview的长按事件冲突
  • listview的item项的删除

Activity生命周期的过程—必须熟练掌握

2016.10.13 20:09:15

1. 开发自定义的view

  • 继承一个View基类的子类
  • 重写vie的类中的一个或多个方法
  • 常用重写的方法:
  • 构造器
  • onFinishInflate():回调方法
  • onTouchEvent():发生触摸屏的事件就触发该方法
  • ……
  • 自定义view中的三个构造参数的理解
    public MyView(Context context) {
        this(context, null);
    }
    第一属于程序内实例化时采用,之传入Context即可
    
    public MyView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    第二个用于layout文件实例化,会把XML内的参数通过AttributeSet带入到View内
    写在xml里的 调用2个参数的 attr里边传过来的是 xml里边对应的height width等参数,包括自己定义的参数,如果在xml里边写入自定义控件的话 必须要重写2个参数的构造函数
    
     public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    第三个主题的style信息,也会从XML里带入
    

2. 统一资源定位符–uri和url

  • uri
  • url

3. 使用VideoView播放视频和MediaController

4. 使用MediaPlayer和SurfaceView播放视频

5. 获取屏幕大小

windowManager manager=getWindowManager(); DisplayMetrics metrics=new DisplayMetrics(); manager.getDefaultDisplay().getMetrics(metrics); metrics.width或者metrics.height

6. 处理视频第一帧缩略图

  • android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取视频第一帧得到的Bitmap,2个对图片进行缩略处理
    public static Bitmap createVideoThumbnail (String filePath, int kind)
    
    第一个参数是视频文件的路径,第二个参数是指定图片的大小,有两种选择Thumbnails.MINI_KIND与Thumbnails.MICRO_KIND。
    第一种文档上说大小是512 x 384 ,我用一个MP4格式文件测试得到544 x 960,用一个wmv格式文件测试得到160 x 120。明显不靠谱
    第二种参数两种格式文件得到的大小都是 96 x 96,这个才是缩略图。
    
    extractThumbnail(Bitmap source, int width, int height, int options)
    extractThumbnail(Bitmap source, int width, int height)
    这两种方法都是用来处理Bitmap的大小的,
    第一个参数是要处理的Bitmap,
    第二个参数是处理后宽度,
    第三个是高度,
    第四个参数options,如果options定义为OPTIONS_RECYCLE_INPUT,则回收资源。
    也就是说可以用第三种方法把截取到的视频第一帧的Bitmap转成任意想要的大小,第三个方法还可以获取内存卡内图片的缩略图。
    
  • 从API 10开始新增一类MediaMetadataRetriever可以用来获取媒体文件的信息
    MediaMetadataRetriever mmr = new MediaMetadataRetriever();  
    mmr.setDataSource(/sdcard/33.mp4);  
    Bitmap bitmap = mmr.getFrameAtTime();  
    image.setImageBitmap(bitmap);  
    System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE)+);  
    System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)+);  
    mmr.release();
    
    MediaMetadataRetriever可以获取视频任何一帧的缩略图。
    
    
    
    public class PlayingActivity extends Activity{
    MediaController mcontroller;
    
    public void onCreat (Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    getWindow().setFormat(PixelFormat.TRANSLUCENT);
    setContentView(R.layout.playing);
    
    mcontroller = new MediaController(this);
    
    Intent intent = new Intent();
    intent = getIntent();
    VideoView videoview = (VideoView) findViewById(R.id.videoView1);
    Uri video;
    
    video=intent.getData();
    videoview.setVideoURI(video); 
    
    videoview.setMediaController(mcontroller); 
    mcontroller.setMediaPlayer(videoview);
    videoview.requestFocus(); 
    
    videoview.start();
    }
    }
    
    其中播放的视频uri是通过intent发送来的。
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setAction(android.content.Intent.ACTION_VIEW); 
    intent.setDataAndType(Uri.fromFile(f), type);
    startActivity(intent);
    

7. getWindow().setFormat(PixelFormat.TRANSLUCENT);

2016.10.17 20:12:35

1. 将github上的开源项目导入到自己的工程中

2. 如果对于没有孩子的控件,如果要对Touch处理最好return true.这样也是游戏开发中经常用的,如果该控件有孩子的话,可不要这么弄,不然孩子会监听不到Touch事件.

  • 单手指操作:ACTIONDOWN—ACTIONMOVE—-ACTION_UP
  • 多手指操作:ACTIONDOWN—ACTIONPOINTERDOWN—ACTIONMOVE–ACTIONPOINTERUP—ACTION_UP.

3.自定义的ImageView中的重写onLayout()方法的四个参数

4. MotionEvent类查看api

5. jsoup解析网页源码

6. viewholder

7. get和post请求的区别

8. 聚合数据

9. 手指滑动控制图片的缩放

10. 开源控件 Viewpager Indicator

  • 0 . https://my.oschina.net/u/1403288/blog/208402
    1. ViewPager Indicator的Library

查看Viewpager Indicator的Library代码,可以看到此项目的设计思想: 首先定义了一个PageIndicator接口,它里面定义了最重要和基本的indicator表现出的一些方法:

        1.1 首先一个indicator必须要与一个ViewPager关联在一起,所以它提供了一个setViewPager方法。
        1.2 它扩展了ViewPager.OnPageChangeListener接口,表示接管了ViewPager的Pager改变时的监听处理,
              这也是为什么为ViewPager设置OnPageChangeListener监听器时不能设置在ViewPager上而必须设置在
              indicator上的原因。
        1.3 还有一个notifyDataSetChanged通知方法,表示为这个ViewPager提供View(一般是Fragment)的  Adapter 里面的数据集发生变化时,执行的动作,这里可增加相关的逻辑。
  • 2. Viewpager Indicator的实现类

然后再看下Viewpager Indicator的实现类,共有6个,由6个类分别实现,它们分别为:

2.1 小圆圈类型的
2.2 带图标类型的                    
2.3 小横线类型的,距离屏幕最下边端有一定的距离。
2.4 标签类型的(Tab)
2.5 标题类型的,与标签类型的有点像,但它当前的标题页的左/右边的标题会卷起,即往两端缩进去。
2.6 屏幕底部小横线类型的,并且会占满整行。                    
  • 3 . Viewpager Indicator随附带的Demo
    3.1 Demo项目的设计
    项目由一个ListSamples的ListActivity入口,它主要用作组装所有的子indicator的列表。
    TestFragment.java,所有ViewPager上真正显示的视图。
    TestFragmentAdapter.java,所有ViewPager里的Adapter,为ViewPager生成TestFragment。
    Samplexxx.java,所有的indicator的显示,一个类显示一种使用方法或特性。

    3.2 具体使用方法
    查看SampleCirclesDefault.java基本就可以明白它的基本使用方法:
    首先,把Indicator包含进xml文件中,如下,注意它应该紧邻在ViewPager的上方或下方,总之要挨在一起。


    <com.viewpagerindicator.TitlePageIndicator
    android:id="@+id/titles"

11. 线程池

12. 异步任务

13. 线程间的通信

14. ViewHolder

2016.10.18 10:20:35

1.手势识别

  • GestureDetector类,添加监听器
  • 可以将Activtity的触碰事件交给GestureDetector处理

2. LruCache

3. String 和 StringBuffer 和 StringBuilder

  • 字符串经常给改变的时候,—用StringBuffer
  • 字符串不经常改变的时候—用String
  • 字符串的拼接,StringBuilder避免多次分配对象,提高效率,可以理解为动态数组
  • string的字符串的操作都是废弃之前的已有的对象,开辟一个新的内存空间来创建一个新的对象,因此String提供存储数据是不可改变的字符串
  • StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder,因此StringBuilder用在字符缓冲区被单个线程使用的时候。
  • 如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用或者变量的内容不断变化,那么最好用StringBuffer。

4. 线程安全 和 线程不安全

  • 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
  • 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
  • 线程安全问题都是由全局变量及静态变量引起的。
  • 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

??? 多个线程之间的执行顺序到底是并行还是串行

  • http://blog.csdn.net/u014086926/article/details/52069074

5. 进度条控件,对话框,菜单…

2016.10.19 19:00:06

1 . 自定义view对话框

2 .android的V4包下有一个下拉刷新的控件SwiperefreshLayout 和 pullview开源下拉刷新控件

  • 自定义下拉刷新的样式,下拉的距离

3 .有问题的取网络数据的代码

private String line = null;
private StringBuffer sb = null;
private HttpURLConnection conn;
private BufferedReader bufferedreader;


public String getJsomnData(String urlpath) {

    try {
        URL url = new URL(urlpath);
        conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(3000);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        conn.connect();
        int code = conn.getResponseCode();

        bufferedreader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        while ((line = bufferedreader.readLine()) != null) {
            sb.append(line);
        }
        Log.i("将流读取至stringBuffer中", sb.toString());

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return "state:-1";
    } finally {
        try {
            if (bufferedreader != null) {
                bufferedreader.close();
            }
            conn.disconnect();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
    return sb.toString();

}

4 . ByteArrayOutputStream

5 . InputStream

6 . 将字符串转成url

*String urlstr = URLEncoder.encode(“你好”,”UTF-8″);

7 . 断点调试—debug

    for (int i = 0; i < 4; i++) {
            Map<String, String> mapitem = new HashMap<String, String>();
            mapitem = maplist.get(i);
            tv_group_date[i].setText(mapitem.get("date"));
            tv_group_tempcha[i].setText(mapitem.get("lowtemp")+"℃~"+mapitem.get("hightemp")+"℃");
            tv_group_type[i].setText(mapitem.get("type"));
            //判断type类型,然后在imageview中设置响应的图片

    }

2016.10.20 21:41:54

1 . synchronized

2 . handlerthread

2016.10.21 19:27:44

1. Thread抽象类 和 Runable接口

2 . 线程抢占式调度策略—-由CPU处理

  • 哪个线程抢到CPU资源,就执行哪个线程,每个线程会被分成碎片,每次抢到就执行该线程的一小段碎片,执行一小段碎片之后就在执行其他的线程的一小段碎片
  • 线程调度取决于底层平台的所采用的策略
  • 让线程处于等待某个通知
  • 线程在run()或call()方法 执行完成后就自我销毁了

3 . 创建对话框 和 自定义对话框

AltertDialog dialog;
AltertDialog.Builder builder=new AltertDialog.Builder(Context)
.setTitle("对话框标题")
.setView(R.layout.布局文件)
.setPositiveButton("按钮名称",newDialogInterface.OnClickListener(){})
.setNegativeButton("按钮名称",new DialogInterface.OnClickListener(){});
dialog=builder.create();
dialog.show()     //用的时候就show出来

2016.10.22 14:57:55

1 . activity和主线程之间的关系

2 . java中的数组问题

3 . android.support.v4.widget.DrawerLayout

4 . android.support.v4.view.ViewPager

5 . android.support.v4.widget.SwipeRefreshLayout下拉刷新控件的使用

  • 可以理解为和LinearLayout一样,里面可以添加一个子view的viewgroup
  • 通过findViewById找到
  • 添加刷新监听器
  • setOnRefreshListener(new OnRefreshListener(){
        public void on Refresh(){
            刷新时执行的操作...
            开启线程联网取数据....
        }
    }
    
  • 主要方法:
    • setOnRefreshListener(OnRefreshListener): 为布局添加一个Listener
    • setRefreshing(boolean): 显示或隐藏刷新进度条
    • isRefreshing(): 检查是否处于刷新状态
    • setColorScheme(): 设置进度条的颜色主题,最多能设置四种
    • setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener):设置手势滑动监听器。
    • setProgressBackgroundColor(int colorRes):设置进度圈的背景色。
    • setColorSchemeResources(int… colorResIds):设置进度动画的颜色。
    • setRefreshing(Boolean refreshing):设置组件的刷洗状态。
    • setSize(int size):设置进度圈的大小,只有两个值:DEFAULT、LARGE

6 . 如何恢复Eclipse中被误删除的文件

  • 右击该工程,选择“Restore from Local History…”

2016.10.23 10:10:36

1 . handler的postdelayed方法

  //下拉刷新部分  
        swipeRefreshLayout=(SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);  
        //设置卷内的颜色  
        swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright,  
                android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light);  
        //设置下拉刷新监听  
        swipeRefreshLayout.setOnRefreshListener(new OnRefreshListener() {  

        @Override  
        public void onRefresh() {  
            // TODO Auto-generated method stub  
            new Handler().postDelayed(new Runnable() {  

                @Override  
                public void run() {  
                    data.add(0, "添加新的item:" + new Random().nextInt());  
                    adapter.notifyDataSetChanged();  
                    //停止刷新动画  
                    swipeRefreshLayout.setRefreshing(false);  
                }  
            }, 2000);  
        }  
  • http://blog.csdn.net/gaidandan/article/details/50817083

2 . android.support.v7.widget.RecyclerView

2016.10.28 20:35:27

1 .TextView 中显示行数超过了空间 , 如何实现将TextView中的文字可以上下滑动?

2 . 对Runable的理解

  • 是一个接口,可以用new关键字创建一个匿名内部类 可以被实现
  • 里面有run方法,可以被别的api使用handler.post(),thread()
  • 看做可操作想要执行的事情的一段可移动代码

3 . 匿名内部类

  • 匿名内部类必须继承一个父类,或者实现一个接口
  • 匿名内部类不可以被定义成抽象类
  • 匿名内部类不能定义构造器,只能够继承父类的构造器
  • 最常用创建匿名内部类的方式是创建某个接口类型的对象

4 . 抽象方法和空方法体的方法不是同一个概念

  • 抽象方法:模版设计模式
    • 抽象方法没有花括号,有abstract修饰,结尾有分号
    • 抽象方法必须由子类实现即重写该方法
  • 空方法体
    • 只是普通的方法,方法体为空
    • 就像无参构造器一样

5 . 更加抽象的抽象类—-接口

  • 接口里所有的方法都是抽象方法,类方法,默认方法
  • 接口中的变量只能是静态常量
  • 接口中可以定义内部类(包括内部接口,枚举)
  • 所有的访问权限都给public
  • 接口中不能初始化,不能有构造器
  • 是从多个相似的类中抽象出来的规范,接口不提供任何实现,也不关心实现该接口的类中是如何实现的,只是提供规范准则
  • 规范<=>实现
  • 软件系统的各组件之间 —- 面向接口耦合
  • 接口只能继承接口,不能继承类,可以继承多个接口
  • 一个类只能继承一个抽象类,可以实现多个接口

6 . 静态变量

7 . 面向接口编程—规范和实现的分离

2016.10.29 11:06:57

  • 昨天回顾
  • include 类似java import stdlib.h stdio.h
  • main(){} system(“pause”);
  • C 基本数据类型 C没有boolean byte C long 4 char 1 长度跟java有区别
  • signed unsigned 只能用来修饰 char short int long 整形变量
  • printf(“输出的内容 + 占位符”, 变量) 占位符不要乱用 要选择对应的占位符
  • C的字符串 char 数组 c 数组声明的时候 [] 要放到变量名后面
  • char数组结束符 ‘\0’
  • char array[] = {‘a’,’b’,’\0′};
  • char array[] = “abcd”;
  • char* str = “abcd”;
  • scanf(“占位符”,内存地址); 取地址符 &
  • c 字符串不检测越界
  • 内存地址
  • 指针 int i = 123; int* pointer = &i;
  • pointer 取到的是i的地址 *pointer 取到的是i的值 &pointer 取出pointer自己的地址
  • 野指针 指针赋值操作之前要先初始化 给指针变量赋一个程序中声明的变量的地址
  • int* 指向int类型变量的地址
  • 值传递和引用传递 都是传递的值 但是引用传递传递的是地址值 子函数修改main函数的变量的值 一定要用引用传递
  • 指针和数组的关系 数组就是连续的内存空间 拿到数组的首地址 就可以对数组的每一个元素进行操作 通过指针的位移运算 位移运算 指针变量+1移动的字节数跟指针的类型有关
  • 指针的长度 32位操作系统4个字节 64位 8字节
  • 多级指针 几级指针就有几个星 int i = 123;
  • 结构体 类似class struct Student 结构体只能声明函数指针
  • 结构体长度 大于或等于所有成员的长度 是最长的成员的长度的整数倍
  • (* pointer).age ->
  • 联合体
  • 枚举
  • typedef

交叉编译

  • 在一个平台上去编译另一个平台上可以执行的本地代码
  • cpu平台 arm x86 mips
  • 操作系统平台 windows linux mac os
  • 原理 模拟不同平台的特性去编译代码

jni开发工具

  • ndk native develop kit
  • ndk目录
    • docs 帮助文档
    • platforms 好多平台版本文件夹 选择时选择项目支持的最小版本号对应的文件夹
    • 每一个版本号的文件夹中放了 不同cpu架构的资源文件
    • include文件夹 jni开发中常用的 .h头文件
    • lib 文件夹 google打包好的 提供给开发者使用的 .so文件
    • samples google官方提供的样例工程 可以参考进行开发
    • android-ndk-r9d\build\tools linux系统下的批处理文件 在交叉编译时会自动调用
    • ndk-build 交叉编译的命令
  • cdt eclipse的插件 高亮C代码 C的代码提示

jnihelloworld

  • jni开发的步骤
    • ①写java代码 声明本地方法 用到native关键字 本地方法不用去实现
    • ②项目根目录下创建jni文件夹
    • ③在jni文件夹下创建.c文件
    • 本地函数命名规则: Java包名类名_本地方法名
    • JNIENV* env JNIEnv 是JniNativeInterface这个结构体的一级指针
    • JniNativeInterface这个结构体定义了大量的函数指针
    • env 就是结构体JniNativeInterface这个结构体的二级指针
    • (*env)->调用结构体中的函数指针
    • 第二个参数jobject 调用本地函数的java对象就是这个jobject
    • ④ 导入<jni.h>
    • ⑤ 创建Android.mk makefile 告诉编译器.c的源文件在什么地方,要生成的编译对象的名字是什么

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCALMODULE := hello #指定了生成的动态链接库的名字 LOCALSRC_FILES := hello.c #指定了C的源文件叫什么名字

    include $(BUILDSHAREDLIBRARY)

    • ⑥ 调用ndk-build编译c代码生成动态链接库.so文件 文件的位置 lib->armeabi->.so
    • ⑦ 在java代码中加载动态链接库 System.loadlibrary(“动态链接库的名字”); Android.mkLOCAL_MODULE所指定的名字

jni开发中的常见错误

  • java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到
    • 本地函数名写错
    • 忘记加载.so文件 没有调用System.loadlibrary
  • findLibrary returned null
    • System.loadLibrary(“libhello”); 加载动态链接库时 动态链接库名字写错
    • 平台类型错误 把只支持arm平台的.so文件部署到了 x86cpu的设备上
      • 在jni目录下创建 Application.mk 在里面指定
      • APPABI := armeabi APPPLATFORM := android-14
  • javah
    • jdk 1.7 项目 src目录下运行javah
    • jdk 1.6 项目 bin目录下 classes文件夹
    • javah native方法声明的java类的全类名

jni简便开发流程

  • ① 写java代码 native 声明本地方法
  • ② 添加本地支持 右键单击项目->andorid tools->add native surport
    • 如果发现 finish不能点击需要给工作空间配置ndk目录的位置
    • window->preferences->左侧选择android->ndk 把ndk解压的目录指定进来
  • ③ 如果写的是.c的文件 先修改一下生成的.cpp文件的扩展名 不要忘了 相应修改Android.mk文件中LOCALSRCFILES的值
  • ④ javah生成头文件 在生成的头文件中拷贝c的函数名到.c的文件
  • ⑤ 解决CDT插件报错的问题
  • 右键单击项目选择 properties 选测 c/c++ general->paths and symbols->include选项卡下->点击add..->file system 选择ndk目录下 platforms文件夹 对应平台下(项目支持的最小版本) usr 目录下 arch-arm -> include 确定后 会解决代码提示和报错的问题
  • ⑥编写C函数 如果需要单独编译一下c代码就在c/c++视图中找到小锤子
  • 如果想直接运行到模拟器上 就不用锤子了
  • ⑦ java代码中不要忘了 system.loadlibrary();

C代码中向logcat输出内容

Android.mk文件增加以下内容
LOCAL_LDLIBS += -llog
C代码中增加以下内容
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
  • define C的宏定义 起别名 #define LOGTAG “System.out” 给”System.out”起别名LOGTAG
  • #define LOGI(…) androidlogprint(ANDROID_LOGINFO, LOGTAG, _VAARGS)
  • androidlogprint函数起别名 写死了前两个参数 第一个参数 优先级 第二个参数TAG
  • VAARGS_ 可变参数的固定写法
  • LOGI(…)在调用的时候 用法跟printf()一样

C代码回调java方法

  • ① 找到字节码对象
    • //jclass (FindClass)(JNIEnv, const char*);
    • //第二个参数 要回调的java方法所在的类的路径 “com/itheima/callbackjava/JNI”
  • ② 通过字节码对象找到方法对象
    • //jmethodID (GetMethodID)(JNIEnv, jclass, const char, const char);
    • 第二个参数 字节码对象 第三个参数 要反射调用的java方法名 第四个参数 要反射调用的java方法签名
    • javap -s 要获取方法签名的类的全类名 项目/bin/classes 运行javap
  • ③ 通过字节码创建 java对象(可选) 如果本地方法和要回调的java方法在同一个类里可以直接用 jni传过来的java对象 调用创建的Method
    • jobject obj =(*env)->AllocObject(env,claz);
    • 当回调的方法跟本地方法不在一个类里 需要通过刚创建的字节码对象手动创建一个java对象
    • 再通过这个对象来回调java的方法
    • 需要注意的是 如果创建的是一个activity对象 回调的方法还包含上下文 这个方法行不通!!!回报空指针异常
  • ④ 反射调用java方法
    • //void (CallVoidMethod)(JNIEnv, jobject, jmethodID, …);
    • 第二个参数 调用java方法的对象 第三个参数 要调用的jmethodID对象 可选的参数 调用方法时接收的参数

Java中的反射机制

  • 字节码文件类—Class类
    • 将所有的.class
  • 获取字节码文件中所有的成员变量—Feild类
  • 获取单个成员变量并对其赋值
    • 公有的
    • 私有的
  • 获取所有成员方法
  • 获取单个成员方法
    • 公有的 getDeclaredMethod
    • 私有的 getDeclaredMethod
  • ① 获得Class对象—将一个class类文件
  • ② 获得该对象的构造器对象
  • ③ 通过构造器获得实例,返回这个实例对象—相当于创建了该类的实例
  • ④ 通过实例对象获得类中的成员变量,成员方法
  • ⑤ 访问某个类中的私有成员变量,可以通过反射机制
  • 对修改关闭,对扩展开放
  • 动态代理:代理对象
    • JDK提供的代理只能是对接口做代理
    • 还有更强大的代理cglib
    • java,lang.reflect下的Proxy类和InvocationHandler接口
  • 代理对象的使用
    • 实现InvocationHanddler接口,重写Invvoke方法中,可以原对象的方法进行补充

C代码回调java空方法

  • 在C代码里获取字节码对象
    • 调用C的FindClass
  • 获取mehod对象
    • 调用C的GetMethodID
  • 通过字节码对象新创建一个Object–通过C中的函数传进来的参数已经创建了java类的对象
  • 通过对象调用方法

2016.10.31 16:17:50

新的工作空间需要指定一下NDK的路径

添加本地支持

改一下点C文件不是C+=

将本地方法声明所在的类中生成头文件–javah

告诉CDT插件所在jni的包的路径

把一个jstring 装换成char*

c语言中获取字符串的长度

2016.11.4 0:08:39

下载Appache服务器和PHP

  • 各种配置,配置文件的修改
  • http://jingyan.baidu.com/article/d8072ac47baf0eec95cefdca.html
  • http://jingyan.baidu.com/article/dca1fa6fa30c05f1a440520a.html

2016.11.4 22:06:21

1. PHP的info表的内容了解

2. PHP 中的配置文件php.ini的内容

3. Appache中的conf下的httpd.confg配置文件的内容

4. google chrome安装就jsonview 和 postman 插件

  • postman的使用:http://jingyan.baidu.com/article/90808022ff18defd91c80f9a.html

5. navicat 配置服务器端的数据库

2016.11.8 13:09:55

1. layout_gravity和gravity的区别

  • gravity是相对于子控件,layout_gravity是相对于父控件

2. FragmentActivity

3. FragmentPagerAdapter

FramgentPagerAdapter mAdapter=new FragmentPagerAdapter(getSupportFragmentManager()) {
        @Override
        public Fragment getItem(int position) {
            return null;
        }

        @Override
        public int getCount() {
            return 0;
        }

4. 自定义ViewPager指示器

5.Path类和Paint类和Canvas类

6. 下拉刷新和上拉刷新的定义

7. shader对画笔进行渲染—-Paint.setShader()

8. Path绘制路径时添加效果—-PathEffect包含6个子类(即6种效果)—Paint.setPathEffect()

  • 画完以后记得close()

9. 熟悉Paint类中常用的设置绘制风格属性的方法

10. 熟悉Canvas中各种画图形的方法 和 坐标变换的方法

11.Timer类—-

13. 通知View重绘可调用invalidate(主线程中) 或 postInvalidate(非主线程中)

14.使用 Matri类 控制变换—–控制图形的 平移 旋转 缩放 倾斜 还可控制 View组件的平移 旋转 缩放

15. 自定义属性的定义

2016.11.10 13:27:29

1. Fragment的使用—-对组件进行分组和模块化的管理

  • Framgent的获取
  • Fragment的动态添加 删除 替换—add,remove,replace
  • Framgent拥有自己的生命周期(和Activityy一样),可以响应自己的输入事件

2. Framgent的子类—-DialogFramgent,ListFragment PreferenceFragment WebViewFragment

2. Fragment的嵌套使用

3. FragmentActivity

4. Fragment和ViewPager的结合使用 — FragmentPagerAdapter

5. Fragment和ListView的结合使用

6. ListActivity的使用

7. ListFragment—-和ListActivity类似

8. Base64编码

  • Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。
  • Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。
  • 在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

9. 联网取图片数据

public static Bitmap getBitmap(String path) throws IOException{

    URL url = new URL(path);
    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    conn.setConnectTimeout(5000);
    conn.setRequestMethod("GET");
    if(conn.getResponseCode() == 200){
    InputStream inputStream = conn.getInputStream();
    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
    return bitmap;
    }
    return null;
    }

ImageView.setImageBitmap(bitmap);

10. BitmapFactory

2016.11.11 18:49:05

1. Html类中的fromHtml

2. 文件的读写

  • File类 — 操作文件和目录的一个类
  • 相关的方法
    • 访问文件名的方法
    • 检测文件的方法
    • 获取常规文件的信息
      • length() — 文件的字节长度
      • lastModified() — 文件最后被修改的时间
    • 文件操作
      • delete() — 删除File对象所对应的文件或路径
    • 目录操作相关的方法

3. 流的技术

  • 节点流
    • 文件流 — 参数是文件的对象
    • 字符串流
    • 数组流
    • 管道流
  • 处理流(包装其他流–流的链接)
    • 缓冲流 — BufferedReader/Writer BUfferedInputStream/OutputStream
    • 转换流 — 实现字节流–>字符流
    • 数据流
    • 推回输入流
  • JDK 1.4后nio包出了新的IO流 —- 是用了不同方式(内存映射文件)来处理输入输出—模拟
  • Buffer的使用 — 抽象类
    • 本身是抽象类,子类有 ByteBuffer/ CharBuffer /IntBuffer /ShortBuffer /LongBuffer /FloatBuffer /DoubleBuffer
    • 常用的方法
    • 字符集和Charset编码集
      Charset cn=Charset.forName("GBK");
      CharsetEncoder ce=cn.newEncoder();
      ByteBuffer bb=ce.encode(CharBuffer cb);
      CharBuffer cb=cd.decode(ByteBuffer bb);
      
  • Channel的使用 — 接口

4. 网络连接

5. 缓存

  • 位于CPU与内存之间的零时存储器,交换速度快,容量小
  • 缓存中的数据是cpu即将访问的
  • 缓存+内存=内存储器
  • 缓存对cpu的影响很大
  • 缓存中的数据时cpu频繁访问的数据,但缓存中的数据也会有变化,按照一定的算法来判断cpu的需求来确定缓存中的数据是什么

6. 异常处理

7. RandomAccessFile类

  • Random Acess Memory — 可以自由访问任意存储点的存储器
  • RandomAcessFile — 是可以任意访问文件任意位置并开始读取指定的内容

8. 字符串处理的一些类和方法—增删查等

  • indexOf(String str) — 字符串str在父字符串中首次出现的位置
  • toCharArray() — 字符串—>字符数组
  • getBytes() — 字符串—>字节数组
  • String的构造器
    • String(char[] buf,0,length) — 字符数组—>字符串

2016.11.12 10:33:43

1. Android HTML.fromHtml解析图片标签

2. 关于 Android 平台开发相关的有哪些推荐书籍

3. Scanner类

4.对象的序列化

  • 什么是序列化 和 反序列化java对象—>字节序列(可以存储在硬盘上 或者 网络传输 字节序列—>java对象
  • 对象流处理 序列化 和 反序列化

5. System类 — 当前java程序的运行平台

  • 常用的一些静态方法:
    • currentTimeMillis() nanoMillis() — 获取当前系统时间距1970年1月1日零时的时间差
    • setIn() setOut setErr()
    • loadLibrary() — 加加载动态链接库
    • identifyHashCode(Object x) — 返回指定对象的hashcode值 ( 就是对象的地址计算得到的hashcode )
    • gc() — 通知系统进行垃圾回收
    • runFinalization() — 通知系统进行资源清理

6. Runtime类 — 当前java程序的运行环境

  • 对象的获取— Runtime.getRuntime()
  • 常用方法:
    • load(String Filename)— 加载文件
    • loadLibrary(Stirng libraryname)— 加载动态链接库
    • gc()— 通知系统进行垃圾回收
    • runFinalization()— 通知系统进行资源清理
  • 提供了访问jvm相关信息的方法
  • 单独启动一个进程来运行操作系统的命令

7. 斜杠 和 反斜杠

  • 斜杠: 路径名 和 网址 : http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%90%9C/13775.shtml
  • 反斜杠: 文件中的路径名 ,java中反斜杠是转义字符F:\WorkSpace2\FileText —> F:\WorkSpace2\FileText 或者直接写成 F:/WorkSpace2/FileText

8. 字节码

  • 字节码通常指的是已经经过编译,但与特定机器码无关,需要直译器转译后才能成为机器码的中间代码。
  • 字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。
  • 字节码主要为了实现特定软件运行和软件环境、硬件环境无关。
  • 字节码的实现方式是通过编译器和虚拟机器。
  • 编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。字节码的典型应用为Java语言。
  • 字节码是一个关于电脑编程语言的小作品。你可以通过编辑或修订扩充其内容。

9. Url 和 Uri

  • Url
  • Uri:

10. 异步任务

  • 解决新线程不能更新UI组件的问题
    • 使用Handler 实现线程间的通信
    • Activity.runOnUiThread(Runable)
    • View.post(Runable)
    • View.postDelayed(Runable,long)
    • 异步处理 — 简单轻量级,不需要借助线程 和 Handler
  • 异步加载网络图片
  • 异步加载网络图片

11. 文件的 上传 和 下载

12. 事件传递机制

  • TextView(无子组件类型)
    • onTouchEvent()

      • return true; //事件消费不回传
      • return false;或者 return super.onTouchEvent() ;//事件回传
  • ViewGroup
    • dispatchTouchEvent —- 分发触摸事件

      • return true;//自己消费,不往下往上传递
      • return false;//自己不处理,回传给父组件onTouchEvent方法处理
      • return super.dis…..;//问自己onInterceptTouchEvent是否拦截
        • onInterceptTouchEvent — 拦截触摸事件

          • true: 自己消费,调用自己onTouchEvent();
          • false 或 super: 默认往下传递
            • onTouchEvent() — 触摸事件

              • true: 自己消费
              • false 或 super: 回传
  • 返回true都是自己消费事件
  • 返回false回传给父控件
  • 返回父类方法

13. 触摸事件 和 单击事件的区别

13. ViewPager实现轮播图 — 不让父控件的ViewPager拦截轮播图的ViewPager的事件

14. 实现标题栏、导航栏滑动隐藏,ByeBurger库的使用和实现

15. 下拉刷新控件

2016.11.13 12:06:24

1. Bundle中传输 集合对象

2. Base64–android中自带的解码器

3. fragment中建议不要使用自定义的构造器

4.线程池 和 任务队列

5. 缓存 — 用户没有网络时从本地缓存中取

6. 动态添加布局 — 熟悉配置布局的参数的一些方法

7. unicode 和 中文 之间的相互转换

  • 博客介绍
    1)字符串转unicode
    
    /**
     * 将字符串转成unicode
     *
     * @param str 待转字符串
     * @return unicode字符串
     */
       public String convert(String str) {
        str = (str == null ? "" : str);
        String tmp;
        StringBuffer sb = new StringBuffer(1000);
        char c;
        int i, j;
        sb.setLength(0);
        for (i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            sb.append("\\u");
            j = (c >>> 8); //取出高8位 
            tmp = Integer.toHexString(j);
            if (tmp.length() == 1)
                sb.append("0");
            sb.append(tmp);
            j = (c & 0xFF); //取出低8位 
            tmp = Integer.toHexString(j);
            if (tmp.length() == 1)
                sb.append("0");
            sb.append(tmp);
    
        }
        return (new String(sb));
    }
    
    
    2)unicode转成字符串,与上述过程反向操作即可
    /**
     * 将unicode 字符串
     *
     * @param str 待转字符串
     * @return 普通字符串
     */
     public String revert(String str) {
        str = (str == null ? "" : str);
        if (str.indexOf("\\u") == -1)//如果不是unicode码则原样返回 
            return str;
    
        StringBuffer sb = new StringBuffer(1000);
    
        for (int i = 0; i < str.length() - 6; ) {
            String strTemp = str.substring(i, i + 6);
            String value = strTemp.substring(2);
            int c = 0;
            for (int j = 0; j < value.length(); j++) {
                char tempChar = value.charAt(j);
                int t = 0;
                switch (tempChar) {
                    case 'a':
                        t = 10;
                        break;
                    case 'b':
                        t = 11;
                        break;
                    case 'c':
                        t = 12;
                        break;
                    case 'd':
                        t = 13;
                        break;
                    case 'e':
                        t = 14;
                        break;
                    case 'f':
                        t = 15;
                        break;
                    default:
                        t = tempChar - 48;
                        break;
                }
    
                c += t * ((int) Math.pow(16, (value.length() - j - 1)));
            }
            sb.append((char) c);
            i = i + 6;
        }
        return sb.toString();
    }
    

8. ListView 中几种常见的优化

9. Bundle传递Arraylist — bundle.putSerializable(“arrayList”,arrayList)

10. Html解析


2016.11.15 10:51:42


1.java中对象的引用

  • 强引用
  • 弱应用 — WeakPreference
  • 软引用
  • 虚引用

2. ViewPager的预加载 和 阻止织预加载

3. 回调函数的使用 与 回调机制

  • 出现的原因:B中的某些逻辑需要在A中进行实现
  • 实现回调的步骤
    • B中定义接口 CallBack ,并添加需要A必须完成的发的方法
    • 把接口new出来 对象为listener
    • 定义 setCallBack方法
      setCallBack(CallBack listener){
          this.listener=listener;
      }
      
    • 当A完成该接口中的方法后,B中可以ITon过listener.方法名 来实现向要的功能,此处的listener实际上是A中的listener
  • 如果没有定义setCallBack方法,而是A直接implements改接口,就直接在A中实现未实现的方法要想在B中调用可以直接new出A的对象a,然后通过对象来调用a.方法名,就可以通过A来实现想要的功能
  • 介绍
  • 介绍
  • 介绍
  • 解决方案
  • Android中回调函数机制完全解析

2016.11.16 16:57:23


1. 自定义主题

  • 可以将多个主题的源码放在一起
<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".SplashActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>  

1 先在activity标签下写android:theme=”@android:style/”加提示,会看到很多主题,点进去看源码将标签copy

2 在标签下的android:theme=”@style/AppTheme点进去,在标签下添加刚才copy过来想的主题设置

    <style name="AppTheme" parent="AppBaseTheme">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
         <item name="android:windowNoTitle">true</item>
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    </style>

2. 添加小原点,并且有红点覆盖

  • 在drawable文件夹下新建xml文件shape_point ,添加<.shape>标签,里面添加<.solid>标签
<?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="oval">
        <solid android:color="#f00"/>
    </shape>
  • 再在原布局文件中添加线性布局,就是三个灰色的小圆点所在的线性布局,orientation=”horizontal”
<LinearLayout
            android:id="@+id/point_group_guide"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
 </LinearLayout>
  • 在代码中向线性布局中添加三个灰色小原点
for (int i = 0; i < imageviewId.length; i++) {
        View point = new View(this);
        point.setBackgroundResource(R.drawable.shape_point);
        LinearLayout .LayoutParams params=new LinearLayout.LayoutParams(20,20);

        if(i>0){
            params.leftMargin=20;//从第二个小圆点开始,距离左边的小原点10px
        }

        point.setLayoutParams(params);//设置原点的大小
        linearpointgroup.addView(point);//将圆点添加给线性布局
    }
  • 将线性布局放在相对布局中,再添加View对象,这样默认就把View对象覆盖到线性布局的第一个灰色小圆点上
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval">
    <solid android:color="#f00"/>
</shape>
  <View
            android:layout_width="20px"
            android:layout_height="20px"
            android:background="@drawable/shape_point_red" />
  • 为红色小圆点添加移动,跟随pager的移动

3. 为自己的项目添加第三方框架

  • 导入库文件—Android Dependencies中会出现已导入库文件的jar包

4. JSON数据解析

  • 1 获得JSONObject对象,
JSONObject jsonobject=new JSONObject(json数据的字符串)//json数据的字符串从联网的流中获取
  • 2 获得JSONObject对象中的数组
JSONArray jsonarray=new JSONArray(JSONOBject对象中的键);//获得某个键对应的数组
  • 3 从数组中迭代取出每一个JOSNObject对象,并将对象添加到集合中
for(int i=0;i<jsonarray.length();i++){
        JSONObject jsonob=new JSONObject(i);
        Iterator iterator=jsonob.keys();
        Map<String,Object> map=new HashMap<String,Object>();
        while(iterator.hasNext()){
            String json_key=iterator.next();
            Object json_value=jsonob.get(json_key);
            if(json_value==null){
                json_value="";
            }
            map.put(json_key,json_value);
        }
        list.add(map);
}

5. 成员变量 和 局部变量

  • 类的生命周期
  • 成员变量: 定义在类中的变量
    • static 修饰的成员变量 —- 类变量,与类共存亡,
    • 没有static修饰的成员变量 —- 实例变量,与该类的实例化对象共存亡
  • 局部变量:
    • 形参;定义方法签名时定义的变量,形参的作用是在整个方法内有效
    • 方法的局部变量: 在方法体内定义的局部变量,它的作用域是从定义改变的地方开始生效,到该方法结束时失效
    • 代码块局部变量: 在代码块中定义的变量,这个局部变量的作用域是从定义该变量的地方开始生效,到该代码块结束时失效
    • 显式初始化:局部变量除形参外都需要在定义的时候指定初始值,否则不可以访问他们
  • 成员变量的初始化 和 内存中运行的机制
  • 局部变量初始化 和 内存中运行的机制

2016.11.17 13:51:21

1. android控件架构 和 自定义控件

  • DecorView —- 窗口界面的顶层视图,,封装了一些窗口操作的基本方法

2016.12.21 19:57:02

1.AsyncTask — 异步加载

  • 指定三个泛型参数第一个:启动过任务执行的输入参数

    第二个:后台任务执行完成任务进度值的类型

    第三个:后台执行任务完成后返回结果的类型

  • 先自己编写一个类继承AsyncTask
  • 重写该类中doInBackground()方法(必须实现) 和 onPreExcute()onPostExcute() onProgressUpdate(此方法可在doInBackground()方法中通过publishProgrress(第二个参数)调用) 等方法
  • 在需要启动异步任务的类中实例化异步任务的类
    MyAsyncTask task =new MyAsynctask();
    task.excute(); 
    
  • 执行机制:底层是线程池,只有一个新线程行结束之后,再去执行另一个,当开一个异步任务后,再去开另一个,只能等前一个执行完后再去执行这个异步任务
  • 怎样解决:将异步任务的生命周期和调用此异步任务的界面的生命周期一致,当activity进入pause或者是stop就在该方法中将异步任务取消
    if(task!=null && task.getStatus() == AsyncTask.Status.RUNNING){
        //cancel方法只是将对应的task标记为cancel状态,不是真正取消线程,java中不能粗暴的将线程取消
        task.cancel(true)
    }
    //再在doInBackground()方法中添加判断
    if(isCancelled()){
        return;
    }   
    
  • 注意事项:必须在UI线程中创建AysncTask实例

    必须在UI线程中调用AysncTask的excute()方法

    重写的四个方法是系统自动调用,不应该手动调用

    每个AsyncTask只能被执行一次,多次调用会引发报错

    只用doInBackground()不能更新UI此方法不是运行在主线程中 其他方法都是运行在主线程中,可以进行更新UI

2. BitmapFactory.decodeStream(new BufferedInputStream (new InputStream()) — 将输入流 解析成 Bitmap类型

3. java中的你内部类可以访问外部类的成员

4. 对获取到json格式的数据封装 — 重新定义一个类来封装 ,再把该类封装到list集合中

5. listview的下拉刷新

6. Webview —- 好像可以解析html源码

7. InputStreamReader()构造器中可以指定转换的字符编码

8. new URL(string url).openConnection().getInputSream()

  • 就相当于 new URL(string url).getInputStream()直接获取网络数据,简单粗暴,返回值类型时InputStream

2016.12.22 12:03:33

1.LruCahe类 — 使用了Lru(least recently used)算法

2.listview的异步加载的优化 — 滑动停止后再加载,滑动时取消所有加载项

2016.12.29 22:05:21

1. jsoup 解析html源码

2017.1.1 20:13:30

1.Drawable 和 Bitmap的区别

2. getResource().getDrawable()

  • getResource() — 通过资源ID
  • getDrawable() — 通过Drawable对象

3. 文件的读写

2017.1.2 12:39:33

1.自定义view

  • 自定义对话框
  • 自定义对手指移动可以放大缩小的imageview
  • 自定义listview 可以上拉加载 和 下拉刷新
  • 自定义viewpager实现轮播图
  • 可自由移动悬浮窗口的实现

2017.1.3 20:26:01

1. java中File类

  • exisits() — 判断file对象所指的文件是否存在 (注 : 文件可能是空的但是也是存在的)
  • createNewFile() — 根据file指定的路径创建一个空的文件

2017.1.4 10:36:45

1. LevelListDrawable — 管理一组交替的Drawable资源

  • 每一个Drawabkle资源与一个最大数值结合,作为LevelListDrawable资源的每一项
  • setlevel() — 加载 level-list或代码中定义的某个drawable资源,判断加载某项的方式:level-list中的某项的android:maxlevel数值大于或等一setLevel设置的数值,就会被加载
  • 语法:
    <?xml version="1.0" encoding="utf-8"?>
    <level-list
        xmlns:android="http://schemas.android.com/apk/res/android" >
        <item
            android:drawable="@drawable/drawable_resource"
            android:maxLevel="integer"
            android:minLevel="integer" />
    </level-list>
    
    <level-list>作为根节点,包含多个<item>节点
    <item> 定义某个level使用的drawable资源
    maxlevel:该项允许的最大的level
    minlevel:该项所允许的最小的level
    
  • 具体应用实例1.在xml文件中定义 level-list.xml
    <?xml version="1.0" encoding="utf-8"?>
    <level-list xmlns:android="http://schemas.android.com/apk/res/android">
      <item android:maxLevel="1" android:drawable="@drawable/image1" />
      <item android:maxLevel="2" android:drawable="@drawable/image2" />
      <item android:maxLevel="3" android:drawable="@drawable/image3" />
      <item android:maxLevel="4" android:drawable="@drawable/image4" />
      <item android:maxLevel="5" android:drawable="@drawable/image5" />
     </level-list>
    

    在布局文件中定义imgeview

        <ImageView 
                android:id="@+id/imgView" 
                android:src="@drawable/level_list" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"/>
    

    2.在代码中使用 package com.example.drawabletest;

    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.LevelListDrawable;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        private int[] ids = new int[] { R.drawable.image1, R.drawable.image2, R.drawable.image3,
                R.drawable.image4, R.drawable.image5 };
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            final ImageView imageView = (ImageView) findViewById(R.id.imgView);
    
            BitmapFactory.Options opts = new BitmapFactory.Options();
            opts.inJustDecodeBounds = true;
            BitmapFactory.decodeResource(getResources(), R.drawable.image1, opts);
            opts.inSampleSize = computeSampleSize(opts, -1, 500 * 500);
            opts.inJustDecodeBounds = false;
    
            LevelListDrawable levelListDrawable = new LevelListDrawable();//定义一个LevelDrawable
            try {
                for (int i = 0; i < ids.length; i++) {//for循环,加载5个drawable资源
                    Bitmap  bmp = BitmapFactory.decodeResource(getResources(),ids[i], opts);
                    BitmapDrawable bitmapDrawable = new BitmapDrawable(bmp);
                    levelListDrawable.addLevel(i, i+1, bitmapDrawable);//添加到LevelListDrawable
                }
                imageView.setImageDrawable(levelListDrawable);//设置
            } catch (OutOfMemoryError err) {
                err.printStackTrace();
            }
    
            imageView.setImageLevel(1);//默认的level为0,将到设置为1
    
            Button btn = (Button) findViewById(R.id.btn);
            btn.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    int i = imageView.getDrawable().getLevel();
                    if (i >=5)
                        i = 0;
           //        imageView.setImageLevel(++i);//改变level
                 imageView.getDrawable().setLevel(++i); //能达到同样的效果
                }
            });
    
    
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    
        public static int computeSampleSize(BitmapFactory.Options options, int minSideLength,
                int maxNumOfPixels) {
            int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);
    
            int roundedSize;
            if (initialSize <= 8) {
                roundedSize = 1;
                while (roundedSize < initialSize) {
                    roundedSize <<= 1;
                }
            } else {
                roundedSize = (initialSize + 7) / 8 * 8;
            }
    
            return roundedSize;
        }
    
        private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength,
                int maxNumOfPixels) {
            double w = options.outWidth;
            double h = options.outHeight;
    
            int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h
                    / maxNumOfPixels));
            int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(
                    Math.floor(w / minSideLength), Math.floor(h / minSideLength));
    
            if (upperBound < lowerBound) {
                // return the larger one when there is no overlapping zone.
                return lowerBound;
            }
    
            if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
                return 1;
            } else if (minSideLength == -1) {
                return lowerBound;
            } else {
                return upperBound;
            }
        }
        }
    

    3.注意

    • 默认level为0;minlevel的默认值为0,如果没有level为0,就不显示
    • level匹配以maxlevel优先

2. java通过正则表达式匹配获取链接地址

3. Drawable的分类

4. textview加载html 异步加载网络图片

2017.1.13 9:17:31

1.listview分页加载

  • 底部布局
  • 监听listview的滚动事件
  • 加载数据,显示到界面上

2017.1.15 15:56:14

1.java中的堆内存和栈内存

1. Drawable 与 Bitmap

  • drawable通过getDrawabl(R.drawable.id);
  • bitmap对象包装成BitmapDrawable对象 可以调用 BitmapDrawable构造器
  • 通过BitmapDrawable对象的各条Bitmap()来获取所包装的bitmap对象
  • BitmapFactory — 可将 字节数组/指定路径文件/给定资源的ID中/输入流 中来创建Bitmap对象

各种资源文件

  • 字符串,颜色,尺寸,数组资源
  • 字符串资源
     <resources> <string name ="键“> 值</string> </resources>
    颜色资源
     <resource> <color name = "键"> 值</color></resource>
    尺寸资源
     <resource> <dimen name = "键"> 值<dimen></resource>
    数组资源
     <resource> 
        <array name = "键"> > 
            <item name = "键"> 值</item>
        </array>
    </resource>
     <resource> <string-array name = "键"> 值 </string-array></resource>
     <resource> integer-array name = "键"> 值 </integer-array></resource>
    
     在XML文件中得到数组资源 android:entries = "@array/对应的name
     在java代码中找到数组资源 getStringArray(R.array.数组名) --- String[]
                            getIntArray(R.array.数组名) --- int[]
                            obtainTypedArray(R.array.数组名) ---TypedArray 
    
  • 图片资源
    在XML文件中获取 android: src = "@drawable/filename"
    在java文件中获取 getDrawable(R.drawable.filename)
    
  • StateListDrawable选择器资源
    指定某种状态下的颜色或者drawable资源
    <selector xmlns = "...">
        <item android:color = " "
              android drawable = ""
              android: state_xxx = ""/>
    </selector>
    
  • LayerDrawable层叠资源(介绍)
  • ShapeDrawable资源
  • ClipDrawable资源
  • AnimationDrawable资源(补间动画)
  • PropertyAnimation资源(属性动画)
  • Menu菜单资源
  • 属性资源
  • 原始资源
  • 自适应不同屏幕的资源
  • Style资源
  • Theme资源