• 在Android初次的前期学习中的十二个小例子(附案例下载)


    目录(点击标题即可下载):
     
    一、新建DemoActivity:
    1. 在res/layout/下新建activity_demo.xml
    2. 在manifests/文件夹下的AndroidManifest.xml注册(可使用Alt+Enter快捷方式)
    3. 新建DemoActivity继承Activity,并覆写onCreate(),在里面添加setContentView指向资源文件夹下的DemoActivity
    二、使用匿名类设置事件监听     
    1. findViewById()找到View资源,设置监听。调用View对象的一个方法setOnClickListener,该方法的参数为OnClickListener,但是该方法是一个接口,需要重写方法onClick。
    三、使用Intent跳转不同的Activity
    Intent intent = new Intent(MainActivity.this, DemoActivity.this);
    startActivtiy(intent);
     

     
    一、对Button注册鼠标点击事件
    二、使用Intent实现点击操作的事件:打开指定网页、打开相机、打开电话页面、设置无线网等等。
    //打开百度网页
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("http://www.baidu.com"));
    startActivity(intent);

    Hello3:点击监听事件集中处理

    一、通过findViewById()找到View资源,封装成findView()函数
    二、对View资源设置点击监听器setOnClickListener,封装成setListener()函数
    三、实现View.OnClickListener接口,并覆写onClick()方法.
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.helloWorld1:
                Log.i("textView1","helloWorld1");
                break;
            case R.id.helloWorld2:
                Log.i("textView2","helloWorld2");
                break;
         }
    }

    Hello4:登录注册界面布局

      使用RelativeLayout布局界面
     
    一、使用RelativeLayout布局界面,将彩虹放在中央,android:layout_centerInParent="true"。
    二、使用LinearLayout布局将View垂直放置,android:orientation="vertical"。
     

      使用RelativeLayout作为整体布局,分别用LinearLayout布局放置线性布局,用RelativeLayout布局放置相对布局。
     
      三类常用监听事件:View.OnLongClickListener、View.OnClickListener、View.OnFocusChangeListener
    一、封装findViewById()找到对应的View资源
     
    二、封装setListener()注册监听事件:长按事件、点击事件、焦点改变事件。
     
    三、实现对应的监听接口,关键词implements
     
    四、重写onClick()方法、onLongClick()方法、onFocusChange()方法和afterTextChanged()方法。
     
    五、添加消息提示:Toast.makeText(this,"长按按钮-点击",Toast.LENGTH_SHORT).show();
     
    1. 新建Activity视图为activity_item.xml,进行页面布局并添加ListView
    2. 新建Activity的子类显示activity_item资源,并在manifests里面注册
    3. 新建ListAdpter继承BaseAdapter,并覆写主要的方法:getCount()和getView()
    4. 在ListAdpter添加List<String>对象,这是ListView的视图来源,在覆写getView()的方法时,使用LayoutInflater的inflater()方法将activity_item填充并可以设置TextView的文本。
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        View view1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.activity_item,viewGroup,false);
        TextView textView = view1.findViewById(R.id.text);
        textView.setText(mData.get(i));
        return view1;
    }

    Hello9:UI线程与非UI线程之间的消息传递Handler

      线程安全机制:只有创建UI的线程能更改UI,并且UI线程不能进行耗时操作。
     
    一、子线程进行耗时操作,操作完成后,使用Handler或Handler的子类的sendEmptyMessage()方法
     
    private void download() {
        Runnable runnable = new Runnable() {
        @Override
        public void run() {
        try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            mHandler.sendEmptyMessage(1);
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();
    }
    二、主线程完成Handler的对象建立,并覆写回调函数handleMessage()方法操作UI
     
    mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
        if (msg.what == 1){
            mBtDownload.setText(R.string.downloaded);
            }
        }
    };

    Hello10:使用SharedPerferences保存用户的“偏好设置”

    一、获取SharedPerferences和editor的对象并设置权限等级(私有权限:Context.MODE_PRIVATE)
    sharedPreferences = getSharedPreferences("count", Context.MODE_PRIVATE);
    editor = sharedPreferences.edit();

    二、向空间中添加键值对:

    editor.putInt("count",count);
    editor.apply();
    三、取出空间中持久化的键值对:
    count = sharedPreferences.getInt("count",0);
    优点:简单易用。
    缺点:效率比较低,不能存储大量数据和复杂数据结构。
     
    一、输入输出流都是相对于内存来说的
      1. 写入文件,是从内存到文件,则是出去,即FileOutputStream
      2. 读取文件,是从文件到内容,则是进来,即FileInputSteam
    二、Android文件的四种操作模式
    FileOutputStream = openFileOutput(name,mode) 应用程序的数据文件夹下的文件对应的输入流
    name为文件名,mode为Android文件的四种操作模式之一:
      1. Context.MODE_PRIVATE 默认操作模式,私有数据(只能应用本身访问),写入文件会被覆盖
      2. Context.MODE_APPEND 检验文件是否存在,存在就追加内容,不存在就先新建文件再添加内容
      3. Context.WORLD_READABLE 可以被其他应用读取
      4. Context.WORLD_WRITABLE 可以被其他应用写入
      5. 既可读又可写:Context.WORLD_READABLE + Context.WORLD_WRITABLE
    三、写入文件
      1. 获取内存写入输出流fileOutputSteam,使用openFileOutput(fileName,mode)
      2. 字符串转换为字节数组,注意编码格式,默认getBytes()编码为UTF-8
      3. 写入,使用fileOutputSteam.write(),注意捕获异常
    private void writeFile() {
        FileOutputStream fileOutputStream = null;
        try {
            fileName = mEtName.getText().toString();
            fileContext = mEtContent.getText().toString();
            fileOutputStream = openFileOutput(fileName, MODE_APPEND);     //1.获取内存输出流fileOutputSream
            fileOutputStream.write(fileContext.getBytes());               //2.字符串转换为字节数组
            Toast.makeText(this,"写入完成!",Toast.LENGTH_SHORT).show();
        } catch (java.io.IOException e) {
            e.printStackTrace();
            Toast.makeText(this,"捕获IO异常!",Toast.LENGTH_SHORT).show();
        } finally {
            try {
            if (fileOutputStream!=null)
                fileOutputStream.close(); //无论捕获异常还是正常执行,都需要关闭fileOutputStream
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    四、读取文件
    将文件读取到内存中,使用输入流FileInputStream
      1. 获取内存输入流:使用openFileInput()方法
      2. 获得字节数组:定义字节数组用于暂时保存数据,使用fileInputStream.read(bytes)方法获取,返回值为字节数组的大小size。
      3. 获得字符串:使用new String(bytes)的方法将字节数组转换为字符串,注意编码格式,默认编码格式为UTF-8。在使用中需要用完整填充的字节数组,所以这里还需要新定义一个刚好为size的字节数组用于正确地转换为字符串。
    private void readFile() {
        FileInputStream fileInputStream = null;
        try {
            fileName = mEtName.getText().toString();
            fileInputStream = openFileInput(fileName); //1.获取内存输入流
            byte[] bytes = new byte[1024];
            int size = fileInputStream.read(bytes);          //2.读入字节数组
            byte[] data = new byte[size];
            System.arraycopy(bytes,0,data,0,size);          //3.转换为字符串,注意编码格式
            String str = new String(data);
            textView.setText(str);
            Toast.makeText(this,"读取完成!",Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(this,"文件没有找到!",Toast.LENGTH_SHORT).show();
        } finally {
            try {
                if (fileInputStream != null)
                    fileInputStream.close();
            } catch (IOException e) {
                    e.printStackTrace();
            }
        }
    }

    一、内部存储(InternalStorage)与外部存储(ExternalStorage)
      1. 内部存储与外部存储是相对于应用程序来说的,内部存储是应用程序私有的,可设置对可外访问。
      2. 内部存储主要用于存储应用的临时数据,空间十分有限,应用卸载时,该目录文件也被删除。
    二、内部存储目录:data/data/包名
    内部存储位置
    存放数据类型
    访问方法
    data/data/包名/shared_prefs 
    SharedPreferences将数据持久化到xml文件存放的目录
     
    data/data/包名/databases  
    数据库文件存放的目录
     
    data/data/包名/files 
    普通数据存放的目录
    context.getFilesDir()
    data/data/包名/cache
    缓存文件存放的目录
    context.getCacheDir()
     
    三、mnt或storage外部存储
    1.判断外部存储是否可用 Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
    外部存储分类
    外部存储详细目录
    使用方法
    公共目录
    十大公共目录
    Environment.getExternalStorageDirectory().getPath()
    私有目录
    storage/sbcard/Android/data/包名/files
    getExternalFilesDir()
    storage/sbcard/Android/data/包名/cache
    getExternalCacheDir()
     
    2.有包名的路径都是调用Context中的方法获取,没有包名的路径都是通过Environment中的方法获取
     
    四、补充
    (1) 关于各种storage外部存储的路径:   
            其中sdcard/、mnt/sdcard、storage/sdcard0、storage/emulated/0、storage/emulated/legacy都是同一个路径的不同“指针”,指向的是同一个地方,只是不同Android版本的叫法不一样。如果大家想了解每个版本的外部存储路径,同学们可以通过获取getExternalStorageDirectory方法的打印结果进行对比。
     
    (2)清除缓存与清除数据
      1. 清除缓存:APP运行过程产生的临时数据,为内部存储文件。
      2. 清除数据:内部存储/data/user/0/packname/和外部存储/storage/emulated/0/Android/data/packname/下的文件里面的数据会全部删除,包括cache,files,lib,shared_prefs等等。
    (3)补充总结
      1. /data目录下的文件物理上存放在我们通常所说的内部存储里面 ,一般用于临时数据,比如头像,密钥文件(隐私,空间有限)。
      2. /storage目录下的文件物理上存放在我们通常所说的外部存储里面 ,裁剪用于文件保存,上传头像(空间比较大)。
      3. /system用于存放系统文件,/cache用于存放一些缓存文件,物理上它们也是存放在内部存储里面的
    描述
    代码
      获取内部存储的根路径
    Environment.getDataDirectory() = /data  
      获取外部存储的根路径
    Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0 
      系统的内部存储
    Environment.getDownloadCacheDirectory() = /cache 
    Environment.getRootDirectory() = /system 
    (4)友情链接:
      1.  彻底了解android中的内部存储与外部存储  https://www.cnblogs.com/jingmo0319/p/5586559.html
      2. 彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑 https://blog.csdn.net/u010937230/article/details/73303034/ 
      3. Android存储扩展学习-----应用的清除数据和清除缓存 https://blog.csdn.net/oudetu/article/details/78664514  
  • 相关阅读:
    3、excel—如何把相同年月日的中相同的数据相加
    Linux_plsql通过跳板的ssh隧道访问oracle1521(转)
    微信小程序-歌词滚动实现
    微信小程序-RSA 加解密
    如何给开源仓库贡献代码
    linux开发调试常用命令-gdb
    vector 内存分配和释放
    Ubuntu上SmartGit三十天试用到期解决办法
    Django-325版本创建时候需要手动设置的内容
    Django 博客园练习--待完成
  • 原文地址:https://www.cnblogs.com/jdemarryme/p/9286037.html
Copyright © 2020-2023  润新知