[转]android学习----基础UI编程(六)

  • 相簿浏览 Gallery
  • 文件搜索引擎FileSearch

17. Gallery 与 衍生BaseAdapter 容器

Gallery控件,即Android的图片库控件。

需要定义一个BaseAdaper的子类(eg.ImageAdapter)来操作控制图片资源,然后在主类中通过Gallery.setAdapter(new ImageAdapter(this));来使用这个控制类。

示例代码

本例中 ImageView 和 Gallery 控件相互协作 .

① 新建项目

② 定义layout 外部resource 的xml 文件,用来改变layout 的背景

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="Gallery" >
        <attr name="android:galleryItemBackground" />
        <!-- 定义layout 外部resource 的xml 文件,用来改变layout 的背景图。-->

</declare-styleable>

</resources>

③ 修改main.xml 布局,添加一个Gallery 和一个ImageView

<AbsoluteLayout ...>

<Gallery
    android:layout_width="fill_parent"
    android:layout_height="143px"
    android:layout_x="0px"
    android:layout_y="51px"
    android:id="@+id/Gallery_preView"

android:unselectedAlpha  设置选中的图片的透明度

android:spacing  setSpacing(int)  图片之间的空白大小

android:animationDuration   setAnimationDuration (int )

设置布局变化时动画的转换所需的时间(毫秒级)。仅在动画开始时计时。该值必须是整数,比如:100。

>
</Gallery>
<ImageView
    android:layout_width="239px"
    android:layout_height="218px"
    android:layout_x="38px"
    android:layout_y="184px"
    android:id="@+id/ImageView_photo" >
</ImageView>

</AbsoluteLayout>

④ 新建一个myImageAdapter 类--Gallery 的适配器,它继承于BaseAdapter 类.

package zyf.Ex_Ctrl_10ME;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class myImageAdapter extends BaseAdapter {
     @Override
     public int getCount() {
          // TODO Auto-generated method stub
          return 0;
     }

@Override
     public Object getItem(int position) {
          // TODO Auto-generated method stub
          return null;
     }

@Override
     public long getItemId(int position) {
          // TODO Auto-generated method stub
          return 0;
     }

@Override
     public View getView(int position, View convertView, ViewGroup parent) {
          // TODO Auto-generated method stub
          return null;
     }
}

⑤ 修改mainActivity.java,添加Gallery 相关操作

package zyf.Ex_Ctrl_10ME;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.Toast;

public class Ex_Ctrl_10ME extends Activity {
    // Called when the activity is first created.
    //定义要使用的对象
    private Gallery gallery;
    private ImageView imageview;

private myImageAdapter imageadapter;

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        imageadapter=new myImageAdapter(this);

//通过findViewById 取得资源对象
        gallery=(Gallery)findViewById(R.id.Gallery_preView);
        imageview=(ImageView)findViewById(R.id.ImageView_photo);

//给Gallery设置适配器把Ex_Ctrl_10ME类传入参数
        gallery.setAdapter(imageadapter);

//设置Gallery的点击事件监听器,将受到点击的图片从 ImageView 中显示出来
        gallery.setOnItemClickListener(new Gallery.OnItemClickListener(){

@Override
            public void onItemClick(AdapterView<?> parent, View v, int position,long id) {
                // TODO Auto-generated method stub
                //显示该图片是几号
                Toast.makeText(Ex_Ctrl_10ME.this,
                                    "这是图片:"+position+"号", Toast.LENGTH_SHORT).show();
                //设置大图片
                imageview.setBackgroundResource(imageadapter.myImageIds[position]);
            }
        });
    }
}

⑥ 修改myImageAdapter.java 文件,实现相簿浏览效果

package zyf.Ex_Ctrl_10ME;
import android.content.Context;
import android.content.res.TypedArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class myImageAdapter extends BaseAdapter{

//自定义的类变量
    //变量声明
    int mGalleryItemBackground;
    private Context context;  //上下文
    //构建一Integer array 并取得预加载Drawable 的图片id ,这些图片都是存放于 res/drawable 文件夹下的

public Integer[] myImageIds = { R.drawable.photo1, R.drawable.photo2,
                     R.drawable.photo3, R.drawable.photo4, R.drawable.photo5,R.drawable.photo6,
 };

//自定义的构造方法
    public myImageAdapter(Context context) {
        // TODO Auto-generated constructor stub
        this.context=context;
        //使用在res/values/attrs.xml 中的<declare-styleable>定义的Gallery 属性.
        TypedArray typed_array=context.obtainStyledAttributes(R.styleable.Gallery);
        //取得Gallery 属性的Index id
       mGalleryItemBackground=typed_array.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0);
        // 让对象的styleable 属性能够反复使用
        typed_array.recycle();
    }

//重写的方法getCount,返回图片数目
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return myImageIds.length;
    }

// 重写的方法getItemId,返回图像的数组id 
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

@Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

//重写的方法getView,返回一View 对象
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        // 产生ImageView 对象
        ImageView imageview = new ImageView(context);
        // 设置图片给imageView 对象
        imageview.setImageResource(myImageIds[position]);

// 重新设置图片的宽高
        imageview.setScaleType(ImageView.ScaleType.FIT_XY);
        // 重新设置Layout 的宽高
        imageview.setLayoutParams(new Gallery.LayoutParams(128, 128));
        // 设置 imageview 背景图
        imageview.setBackgroundResource(mGalleryItemBackground);
        // 返回imageView 对象
        return imageview;
    }
}

⑦ 结果

关键点

1. Gallery 控件 (画廊)

Gallery 控件 是 android 中的图片浏览控件。一个锁定中心条目并且拥有水平滚动列表的视图。如下图:


  Gallery(画廊)使用Theme_galleryItemBackground作为Gallery(画廊)适配器中的各视图的默认参数。如果你没有设置,你就需要调整一些Gallery(画廊)的属性,比如间距。

Gallery(画廊)中的视图应该使用Gallery.LayoutParams作为它们的布局参数类型。参见Gallery tutorial

API介绍:http://dev.10086.cn/cmdn/wiki/index.php?doc-view-4996.html

2. BaseAdapter

BaseAdaper 是 适配器Adapter类的子类,是一个抽象类。

18. SDCard 中文件搜索与File 类

示例代码

① 创建新工程

② 在string.xml 添加程序中要使用的字符串

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name"> myFileTest</string>
      <string name="showInput"> 输入关键字</string>
    <string name="toSearch"> 搜索</string>

<string name="info"> 系统SDCard目录文件路径:\n</string>
    <string name="pleaseInput"> 请输入关键字!! </string>
    <string name="notFond"> 没有找到相关文件!! </string>
    <string name="pathError"> 读取路径出错!! </string>
</resources>

③ 修改main.xml 布局,添加两个TextView、一个EditText、一个Button

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
    android:id="@+id/widget0"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
>

<Button
    android:id="@+id/Button_Search"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_x="253px"
    android:layout_y="5px"
    android:text="@string/toSearch" >
</Button>
<EditText
    android:id="@+id/input_KEY_EditText"
    android:layout_width="112px"
    android:layout_height="52px"
    android:textSize="18sp"
    android:layout_x="119px"
    android:layout_y="4px" >

</EditText>

<TextView
    android:id="@+id/TextView_showIn"
    android:layout_width="103px"
    android:layout_height="29px"
    android:textSize="20sp"
    android:layout_x="5px"
    android:layout_y="16px"
    android:text="@string/showInput" >
</TextView>
<TextView
    android:layout_width="fill_parent"
    android:layout_height="370px"
    android:layout_x="0px"
    android:layout_y="60px"
    android:id="@+id/TextView_Result" >
</TextView>
</AbsoluteLayout>

④ 修改mainActivity.java 文件,添加搜索功能

package zyf.myFileTest;
//导入程序使用的包
import java.io.File;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class myFileTest extends Activity implements Button.OnClickListener {
    //Called when the activity is first created. 
    //定义程序要使用的类对象
    private File file;
    private String path;
    private String info;
    private String theKey_formInput;
    private TextView show_Result;
    private EditText input_SearchKey_Edit;
    private Button toSearch_Button;

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//设置主屏布局为main.xml
        setContentView(R.layout.main);
        //通过findViewById()获取XML中的UI对象
        show_Result = (TextView) findViewById(R.id.TextView_Result);
        input_SearchKey_Edit = (EditText) findViewById(R.id.input_KEY_EditText);
        toSearch_Button = (Button) findViewById(R.id.Button_Search );
        //为搜索按钮添加点击事件监听器
        toSearch_Button.setOnClickListener(this);
        //初始化一个Fiel 对象,指定路径为/sdcard
        file = new File( "/sdcard" );
        //从xml中获取字符串
        info = getString(R.string.info);
    }

//按钮点击事件处理
    public void onClick(View v) {
        // TODO Auto-generated method stub
        //清空
        path = "";
        show_Result.setText("");
        //取得输入框中的要查询的Key
        theKey_formInput = input_SearchKey_Edit.getText().toString();
        //浏览文件
        BrowserFile( file );
    }

//浏览文件方法
    public void BrowserFile(File file) {
        if (theKey_formInput.equals("")) {
            //如果输入框没有输入点击搜索按钮,提示输入
            Toast.makeText(this, getString(R.string.pleaseInput),
            Toast.LENGTH_SHORT).show();
        } else {
            //开始搜索文件
            ToSearchFiles(file);
            //搜索完毕后,如果搜到结果为空,提示没有找到
            if (show_Result.getText().equals("")) {
                Toast.makeText(this, getString(R.string.notFond),
                Toast.LENGTH_SHORT).show();
            }
        }
    }

//开始搜索文件方法
    public void ToSearchFiles(File file) {
        //定义一个File文件数组,用来存放 /sdcard 目录下的文件或文件夹
        File[] the_Files = file.listFiles() ;

//通过遍历所有文件和文件夹
        for (File tempF : the_Files) {
            if (tempF.isDirectory()) {
                ToSearchFiles(tempF);
                //如果是文件夹的话继续遍历搜索
            } else

{
            try {
                //是文件,进行比较,如果文件名称中包含输入搜索Key,则返回大于-1的值
                if (tempF.getName().indexOf(theKey_formInput) > -1) {
                    //获取符合条件文件的路径,进行累加
                    path += "\n" + tempF.getPath();
                    //显示结果的TextView显示信息和搜索到的路径
                    show_Result.setText(info + path);
                }
            } catch (Exception e) {
                // TODO: handle exception
                //如果路径找不到,提示出错
                Toast.makeText(this, getString(R.string.pathError),Toast.LENGTH_SHORT).show();
            }
            }
        }
    }
}

⑤ 结果

关键点

1. 文件操作使用的 java 包

android 的文件搜索操作 是用的 java.io.file 包。

android 的文件读写 是跟 javaSE 相同的,都是使用的I/O流。需要用到的是 java.io.FileInputStream 包 和 java.io.FileOutputStream 包。可以通过 context.openFileOutput 和 context.openFileInput 的到输出和输入的流对象。

2. for循环 for( int x : n)

这个for循环是JDK1.5的新特性泛型的for循环。

以下为例,两个for循环其实效果等同,那个更简单呢?
   第二个for循环在编译的时候会强直检查list中的对象类型是否是UserBean类型,如果不是会报编译错误
   第一个for循环编译没有问题,会在运行的时候报错
   相比之下第二种方法对于程序的稳定性更有利,而且不用显示的类型转换,提升了软件性能,泛型编程也是JAVA提倡的。

for(int loop=0;loop<list.size();loop++){
           UserBean bean = (UserBean )list.get(loop); //显示的类型转换
           System.out.println(UserBean .getName());
   }

for(UserBean bean : list ) {
         System.out.println(bean.getName());
   }

时间: 2024-08-01 00:20:50

[转]android学习----基础UI编程(六)的相关文章

[转]android学习----基础UI编程(四)

CheckBox 的使用 RadioButton 的使用 12. CheckBox 的使用 1)通过只含有一个CheckBox的实例来学习CheckBox的使用 示例代码 ① 创建新工程② 在string.xml 中添加字符串 <?xml version="1.0" encoding="utf-8"?><resources><string name="app_name">Ex_Ctrl_4</string

[转]android学习----基础UI编程(七)

自动完成输入框 AutoCompleteTextView 多内容自动完成输入框 19. AutoCompleteTextView 自动完成输入框 智能输入框 AutoCompleteTextView 1. 简介 一个可编辑的文本视图显示自动完成建议当用户键入.建议列表显示在一个下拉菜单,用户可以从中选择一项,以完成输入.建议列表是从一个数据适配器获取的数据. 2. 重要方法 clearListSelection():清除选中的列表项 dismissDropDown():如果存在关闭下拉菜单 ge

[转]android学习----基础UI编程(八)

模拟/数字/线程小时钟设计 动态输入日期与时间 日期设置/时间设置对话框 21. 模拟/数字/线程小时钟设计 AnalogClock 与DigitalClock 的原理,以及线程时钟的实现 . 示例代码 ① 新建工程② 修改man.xml 布局,添加一个AnalogClock.一个DigitalClock.一个TextView<TextView  //这个TextView 用来显示线程时钟    android:id="@+id/TextView_showTime"    and

[转]android学习----基础UI编程(五)

相框设计 :ImageView 的堆叠作用 相框设计 :ImageButton 的堆叠作用 自定义下拉菜单 :Spinner 与setDropDownViewResource 动态添加╱删除的Spinner 菜单 : ArrayList 与Widget 的依赖性 14. 专业相框设计 1)ImageView 的堆叠应用 利用 ImageView 的堆叠,将上例中的实现不同相框的更换 示例代码 ① 新建工程② 准备三张png 图片 ③ 修改main.xml 布局,添加UI 元素 <?xml ver

[转]android学习----基础UI编程(三)

9. Toast--Android 专属浮动小提示 下例中,实现在一个EditView中输入一段话后,点击Button,Toast显示这段话. 示例代码: ① 新建工程② 在string.xml 中添加字符串 <?xml version="1.0" encoding="utf-8"?>    <resources>        <string name="app_name">EX_Ctrl_3</str

[转]android学习----基础UI编程(二)

7. TextView 和 EditView 共舞 预达到效果:在EditText中输入同时TextView进行输出 //前提:在main.xml中添加EditText 和 TextView控件 核心代码示例: public class EX_Ctrl_1 extends Activity {    private TextView mTextView01;    private EditText mEditText01;    // Called when the activity is fi

[转]android学习----基础UI编程(一)

1 通过 DisplayMetrics 类获取屏幕宽高 示例代码: package zyp.Activity; import android.app.Activity;import android.os.Bundle;import android.widget.*;import android.util.*; public class Test extends Activity {    //Called when the activity is first created. private T

[转]android学习----消息机制

一. 角色描述 1. Looper : 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列). 2. Handler : 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里:或者接收Looper(从Message Queue取出)所送来的消息. 3. Message Queue(消息队列) : 用来存放线程放入的消息. 4. 线程 :UI thread通常就是main thread,而Android启动程

[转]android学习总结----Activity view

什么是Activity? Activity 是用户接口程序,原则上它会提供给用户一个交互式的接口功能. 它是 android 应用程序的基本功能单元. Activity 本身是没有界面的 什么是view/ viewGroups? view/ viewGroups :表示在 android 平台上的基本用户界面单元. view :为指定的屏幕矩形区域存储布局和内容.处理尺寸和布局,绘制,焦点改变,翻屏,按键 等… viewGroups:包含并管理下级系列的views 和 下级的 viewGroup