Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图:

                               

工程文件夹:

  该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-<

《黑幕下的人》

  java代码(MainActivity.java):
  

package com.example.imageswitchtest;

import java.lang.reflect.Field;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private int[] imgs = null ;//存放图片地址
    private int currentImgIndex ; //当前图片的标识号
    private ImageView img = null ;
    private Button btnUp = null ;
    private Button btnNext = null ;    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        img = (ImageView)findViewById(R.id.img);
        btnUp = (Button)findViewById(R.id.btn_up);
        btnNext = (Button)findViewById(R.id.btn_next);

        //初始化
        init();
        img.setImageResource(imgs[1]);
        currentImgIndex = 1;

        //为Button设置监听事件
        btnUp.setOnClickListener(new ButtonOnClick());
        btnNext.setOnClickListener(new ButtonOnClick());

    }

    /**
     * 使用反射机制读取图片资源,存储到imgs数组里面
     */
    public void init(){
        Field[] fields = R.drawable.class.getFields();//反射读取R.drawable
        imgs = new int[fields.length] ;//实例化imgs数组
        for(int i = 0 ; i < fields.length ; i++){//遍历fields
            try {
                //测试出现的问题是:imgs[0]值会默认为ic_launcher
                Log.d("field[" + i +"]", fields[i].getName() + "");//测试
                if(fields[i].getName().indexOf("pic_")>-1){//过滤图片,以pic_开头的图片名
                    imgs[i] = fields[i].getInt(R.drawable.class);//获取该图片存储地址,储存到imgs数组里面
                    Log.d("field[" + i +"]", fields[i].getName() + "");//测试
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     *
     * @author black sky
     * @使用 Button的单击事件监听处理类
     */
    private class ButtonOnClick implements View.OnClickListener{
        @Override
        public void onClick(View view) {
            int id = view.getId();//获取监听到被单击的组件ID
            switch(id){//识别ID
            case R.id.btn_up://上一张图片按钮被单击执行的方法
                if(currentImgIndex>1){//当前图片标识号不是第一张
                    currentImgIndex--;//标识号-1

                }else{//是第一张
                    //提示是第一张图片
                    Toast.makeText(MainActivity.this, "这已经是第一张图片!", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.btn_next://下一张图片按钮被单击执行的方法
                if(currentImgIndex<imgs.length-1){//当前图片标识号不是最后一张
                    currentImgIndex++;//标识号+1
                }else{//是最后一张
                    //提示是最后一张图片
                    Toast.makeText(MainActivity.this, "这已经是最后一张图片!", Toast.LENGTH_SHORT).show();
                }
                break;
            }
            img.setImageResource(imgs[currentImgIndex]);//显示图片
        }

    }

}

  xml代码(activity_main.xml):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.imageswitchtest.MainActivity" >

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center">
        <Button
            android:id="@+id/btn_up"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="上一张图片"/>
        <Button
            android:id="@+id/btn_next"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="下一张图片"/>
    </LinearLayout>

</LinearLayout>

  

  例子下载链接为:https://files.cnblogs.com/files/hmxin/ReadBookProject.zip

时间: 2024-12-26 11:13:44

Android小例子:使用反射机制来读取图片制作一个图片浏览器的相关文章

小例子 使用反射机制创建dao的factory

public class Factory { private static Properties props =   new Properties(); static{  InputStream ips =    Factory.class.getClassLoader()   .getResourceAsStream(     "util/dao.properties");  try {   props.load(ips);  } catch (IOException e) {   

Android -- 小问题 InputStream的read方法读取字节不完全的问题

关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节.比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多.仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个).因此,如果要让程序读

利用java反射机制实现读取excel表格中的数据

如果直接把excel表格中的数据导入数据库,首先应该将excel中的数据读取出来. 为了实现代码重用,所以使用了Object,而最终的结果是要获取一个list如List<User>.List<Book>等,所以需要使用泛型机制去实现.下面会给出代码,可能会稍微复杂一点,但注释很清晰,希望大家耐心阅读. 在上代码之前简单说一下思路: 1.excel表格必须有表头,且表头中各列的值要与实体类的属性相同: 2.先读取表头信息,然后获取表头列数,接着确定需要使用的set方法的名称,并存到数

java反射机制_读取properties

代码: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 反射特点: * 可以在运行期间,动态加载一个类进来,动态new一个对象 * 动态了解对象内部的结构,动态调用这个对象的某一些方法 * 反射好处: * 在配置文件里只写类的名字,可以动态把类加载进来 * @author Administrator * */ public class TestReflection

单链表的小例子(三)链表读取和保存

#include <stdio.h> #include <malloc.h> #include <string.h> struct address { int a; int b; char c; struct address *next; }; void SaveToFile(struct address *p, FILE *fp) { if(p != NULL) { do { fwrite(p, sizeof(struct address), 1, fp); p =

android 小工具:pc 上用 curl 命令打开手机浏览器,浏览指定网址

测试 API 时或其它情况经常需要在手机浏览器中输入 url 一长串的 url 输起来真是麻烦 AirDroid 很强大也不用数据线,但有时老断开连接,不是很爽.发到手机 qq 吧还得手动粘贴 所以自己开发了一个小工具 pc 上用 curl 发一条命令,命令中输入要打开的 url,手机浏览器就会自动打开 url. 当然手机和 pc 都得联网 curl -l -H "Content-type: application/json" -X POST -d '{"method&quo

JAVA基础整理-80.Java反射机制

Java什么是反射机制?反射机制的概念 在 ORM (Object Relational Mapping 对象关系映射)中间件的实现中,运用 java 反射机制可以读取任意一个 JavaBean 的所有属性,或者给这些属性赋值. Class labelCls=label1.getClass(); //label1为 JLabel 类的对象 Java反射在类中的应用: 通过反射访问构造函数(方法) 为了能够动态获取对象构造方法的信息,首先需要通过下列方法之一创建一个 Constructor 类型的

什么是Java反射机制,有什么作用

什么是Java反射机制? Java反射机制是 Java 语言的一个重要特性,它在服务器程序和中间件程序中得到了广泛运用.在服务器端,往往需要根据客户的请求,动态调用某一个对象的特定方法.此外,在 ORM 中间件的实现中,运用 Java 反射机制可以读取任意一个 JavaBean 的所有属性,或者给这些属性赋值 通过反射机制,可以在运行的时候访问到对象的属性.方法.构造方法等等 哪些地方用到反射机制? 其实我们都用过反射机制,只是并不知道它是反射机制而已.比如我们使用JDBC连接数据库的时候(Cl

java反射机制例子,反编译,以及通过读取配置文件降低耦合

本文不多做文字描述,通过代码可以说明一切,简单直观. //这边以反编译String类为例子,将反编译结果输入到文件. 1.ReflectTest.java 1 import java.io.File; 2 import java.io.FileReader; 3 import java.io.FileWriter; 4 import java.lang.reflect.Constructor; 5 import java.lang.reflect.Field; 6 import java.lan